Campaigns / CLI
Create campaign
Create a draft campaign with a required explicit workflow_definition and assigned_accounts to select senders. UI Easy Mode generates a graph from its selected options; machine creation never selects that template implicitly. This never sends. Campaign delivery graphs are distinct from Agent Workflows. Supply the complete nodes and edges to create-campaign or update-campaign-workflow. Start -> optional icp_scoring -> outreach. If scoring is present, all outreach paths must pass qualified; not_qualified ends without sending. Scoring must precede all sends or email campaign pushes. connection_request has accepted and no_response outputs. accepted continues to optional messages or End. no_response fires after wait_for_response_days and can go to optional cancel_invitation -> End, or an explicitly requested InMail/email fallback. Never withdraw an accepted invitation. message, template_message, enhanced_message and inmail have replied and no_reply outputs. Every replied output goes directly to End. no_reply waits reply_wait_days, then goes to an optional follow-up or End. Do not add a second delay for that same waiting period. Withdrawal, scoring, InMail, follow-ups and email destinations are optional; never add them unless requested. A connection-only graph wires accepted and no_response to End. instantly, smartlead and emailbison require credential_id and campaign_id for the selected external campaign. InMail requires a Sales Navigator sender; open profiles can use free InMail subject to provider limits. No cycles, dangling outputs or unreachable nodes. Every branch terminates at End. Saving creates a draft only; inspect the saved graph and obtain launch authorization before starting.
pipeline create-campaignDeterministic operationParameters
workspaceIdRequired · string- See the input schema for this field.
nameRequired · string- See the input schema for this field.
descriptionOptional · string- See the input schema for this field.
assigned_accountsOptional · array- See the input schema for this field.
senderAccountIdsOptional · array- Legacy alias for assigned_accounts.
workflow_definitionRequired · object- Campaign delivery graphs are distinct from Agent Workflows. Supply the complete nodes and edges to create-campaign or update-campaign-workflow. Start -> optional icp_scoring -> outreach. If scoring is present, all outreach paths must pass qualified; not_qualified ends without sending. Scoring must precede all sends or email campaign pushes. connection_request has accepted and no_response outputs. accepted continues to optional messages or End. no_response fires after wait_for_response_days and can go to optional cancel_invitation -> End, or an explicitly requested InMail/email fallback. Never withdraw an accepted invitation. message, template_message, enhanced_message and inmail have replied and no_reply outputs. Every replied output goes directly to End. no_reply waits reply_wait_days, then goes to an optional follow-up or End. Do not add a second delay for that same waiting period. Withdrawal, scoring, InMail, follow-ups and email destinations are optional; never add them unless requested. A connection-only graph wires accepted and no_response to End. instantly, smartlead and emailbison require credential_id and campaign_id for the selected external campaign. InMail requires a Sales Navigator sender; open profiles can use free InMail subject to provider limits. No cycles, dangling outputs or unreachable nodes. Every branch terminates at End. Saving creates a draft only; inspect the saved graph and obtain launch authorization before starting.
pipeline create-campaign \
--name "example" \
--workspace-id "00000000-0000-4000-8000-000000000000" \
--workflow_definition-json '{"nodes":[{"id":"00000000-0000-4000-8000-000000000000","type":"start","position":{"x":1,"y":1},"data":{}}],"edges":[{"id":"00000000-0000-4000-8000-000000000000","source":"example","target":"example"}]}'Full input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspaceId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"description": {
"type": "string",
"maxLength": 2000
},
"assigned_accounts": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"senderAccountIds": {
"description": "Legacy alias for assigned_accounts.",
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"workflow_definition": {
"type": "object",
"properties": {
"nodes": {
"minItems": 1,
"maxItems": 500,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"type": {
"type": "string",
"enum": [
"start",
"end",
"website_visitor_trigger",
"new_connection_trigger",
"post_keyword_trigger",
"icp_scoring",
"connection_request",
"cancel_invitation",
"message",
"template_message",
"enhanced_message",
"inmail",
"delay",
"condition",
"is_connected",
"profile_visit",
"follow",
"like_post",
"post_comment_reply",
"research_agent",
"reply_agent",
"whatsapp_message",
"trykitt",
"findymail",
"leadmagic",
"icypeas",
"prospeo",
"quickenrich",
"instantly",
"smartlead",
"emailbison",
"webhook",
"exa",
"firecrawl",
"spider",
"http_request",
"google_sheets",
"slack_notification",
"openai_processor",
"claude_processor"
],
"description": "Supported campaign delivery node types. Withdrawal is cancel_invitation, not cancel_connection_request. These are distinct from Agent Workflow play nodes."
},
"position": {
"type": "object",
"properties": {
"x": {
"type": "number"
},
"y": {
"type": "number"
}
},
"required": [
"x",
"y"
],
"additionalProperties": false
},
"data": {
"type": "object",
"properties": {
"message_template": {
"type": "string"
},
"outputVariable": {
"type": "string"
},
"subject": {
"type": "string"
},
"post_url": {
"type": "string"
},
"keyword": {
"type": "string"
},
"reply_message": {
"type": "string"
},
"customInstructions": {
"type": "string"
},
"send_empty_request": {
"type": "boolean"
},
"only_open_profiles": {
"type": "boolean"
},
"icpThreshold": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"thresholdOperator": {
"type": "string",
"enum": [
">=",
">",
"<=",
"<",
"=="
]
},
"wait_for_response_days": {
"type": "number",
"exclusiveMinimum": 0
},
"reply_wait_days": {
"type": "number",
"exclusiveMinimum": 0
},
"credential_id": {
"type": "string"
},
"campaign_id": {
"type": "string"
}
},
"additionalProperties": {},
"description": "Node config: icp_scoring {icpThreshold:0..100, thresholdOperator:\">=\", outputVariable:\"icp_score\"}; connection_request {send_empty_request:boolean, message_template:string, wait_for_response_days:positive number}; message/template_message {message_template:string, reply_wait_days:positive number}; inmail {subject:string, message_template:string, reply_wait_days:positive number, only_open_profiles:boolean}; cancel_invitation {}; delay {delay_type:\"minutes\"|\"hours\"|\"days\", delay_amount:positive number}; instantly/smartlead/emailbison {credential_id:string, campaign_id:string, field_mappings:object, custom_variables:object}. Templates use {{fieldName}} from supplied prospect customFields; nested templates must be rendered before import."
}
},
"required": [
"id",
"type",
"position",
"data"
],
"additionalProperties": {}
}
},
"edges": {
"maxItems": 2000,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"source": {
"type": "string",
"minLength": 1
},
"target": {
"type": "string",
"minLength": 1
},
"sourceHandle": {
"description": "Required for branching nodes: icp_scoring qualified/not_qualified; connection_request accepted/no_response; messages and InMail replied/no_reply. Omit for single-output nodes. One edge per output handle.",
"type": "string"
}
},
"required": [
"id",
"source",
"target"
],
"additionalProperties": {}
}
}
},
"required": [
"nodes",
"edges"
],
"additionalProperties": false,
"description": "Campaign delivery graphs are distinct from Agent Workflows. Supply the complete nodes and edges to create-campaign or update-campaign-workflow. Start -> optional icp_scoring -> outreach. If scoring is present, all outreach paths must pass qualified; not_qualified ends without sending. Scoring must precede all sends or email campaign pushes. connection_request has accepted and no_response outputs. accepted continues to optional messages or End. no_response fires after wait_for_response_days and can go to optional cancel_invitation -> End, or an explicitly requested InMail/email fallback. Never withdraw an accepted invitation. message, template_message, enhanced_message and inmail have replied and no_reply outputs. Every replied output goes directly to End. no_reply waits reply_wait_days, then goes to an optional follow-up or End. Do not add a second delay for that same waiting period. Withdrawal, scoring, InMail, follow-ups and email destinations are optional; never add them unless requested. A connection-only graph wires accepted and no_response to End. instantly, smartlead and emailbison require credential_id and campaign_id for the selected external campaign. InMail requires a Sales Navigator sender; open profiles can use free InMail subject to provider limits. No cycles, dangling outputs or unreachable nodes. Every branch terminates at End. Saving creates a draft only; inspect the saved graph and obtain launch authorization before starting."
}
},
"required": [
"name",
"workspaceId",
"workflow_definition"
],
"additionalProperties": false
}