Skip to content
Pathbound DOCS

Actions API

Actions represent unit-of-work operations in Pathbound — emails, LinkedIn messages, internal notes, lifecycle changes, CRM syncs, Slack pings. Actions can be scheduled, executed immediately, or queued for human approval. Most actions are created by agents, but you can also create them directly.

All endpoints require actions:write, except listing/reading which require actions:read.

The type field is an extensible string. The built-in core types are:

TypePurpose
email_messageSend an email through a connected identity.
linkedin_connectionSend a LinkedIn connection request with a note.
create_noteAdd an internal note on a contact or company.
create_taskCreate an internal task.
update_contactUpdate properties on a contact.
update_companyUpdate properties on a company.
update_lifecycle_stageAudited lifecycle stage transition.
escalate_to_humanPause for human review with a reason.
sync_to_crmPush contact/company state to a connected CRM.
send_slack_messageSend a Slack message via the connected workspace.
resend_send_emailSend a transactional email via Resend.
resend_create_contactCreate a contact in your Resend audience.
resend_create_broadcastCreate a Resend broadcast.
mcp_tool_callInvoke a configured external MCP tool.

New integrations register additional string types via the executor registry, so the list above is not exhaustive.

scheduled, pending_approval, approved, auto_approved, rejected, running, completed, failed, cancelled.


POST /v1/actions

Required scope: actions:write

FieldTypeRequiredDescription
typestringyesAction type (see above).
paramsobjectyesType-specific parameters (see Action params).
identity_idstringyesIdentity to perform the action as.
directbooleannoExecute immediately without scheduling.
scheduled_timestringnoISO 8601 timestamp for scheduled execution.
descriptionstringnoHuman-readable description.
require_approvalbooleannoIf true, the action queues as pending_approval.
list_idstringnoAssociated list ID.
item_idstringnoAssociated list item ID.
Terminal window
curl -X POST https://api.pathbound.ai/v1/actions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "email_message",
"params": {
"email": "[email protected]",
"subject": "Following up",
"message": "Hi — circling back on yesterday's demo.",
"contact_id": "ct_abc"
},
"identity_id": "id_123",
"require_approval": true
}'
{
"status": "success",
"action_id": "act_abc123",
"action_summary": "Email to [email protected] queued for approval"
}

The shape of params depends on type:

  • email_message{ email, subject, message, html?, cc?, bcc?, contact_id?, follow_up?, thread_id?, in_reply_to_message_id?, references? }. When contact_id is set, email and subject are auto-resolved. For follow-ups, set follow_up: true (auto-targets the most recent thread) or pass an explicit thread_id from GET /v1/contacts/:contact_id/email-threads.
  • linkedin_connection{ linkedin_url, message?, contact_id? }.
  • create_note{ content, contact_id }.
  • create_task{ title, description?, due_date?, contact_id? }.
  • update_contact{ contact_id, properties }.
  • update_company{ company_id, properties }.
  • update_lifecycle_stage{ contact_id, lifecycle_stage }.
  • escalate_to_human{ reason, contact_id? }.
  • send_slack_message{ channel, message }.

GET /v1/actions

Required scope: actions:read

ParameterTypeDefaultDescription
statusstringFilter by status.
typestringFilter by action type.
list_idstringFilter by list.
item_idstringFilter by list item.
identity_idstringFilter by identity.
contact_idstringFilter by contact.
company_idstringFilter by company.
agent_idstringFilter by agent that proposed the action.
limitnumber20Results per page (1–100).
skipnumber0Number of results to skip.
sort_bystringField to sort by.
sort_dirstringdescSort direction.
{
"status": "success",
"actions": [ /* action objects */ ],
"pagination": { "total_items": 42, "limit": 20, "skip": 0 }
}

GET /v1/actions/:action_id

Required scope: actions:read

Returns the full action object including its current status, logs, and result.


PATCH /v1/actions/:action_id

Required scope: actions:write

Only params, scheduled_time, identity_id, description, and require_approval can be changed. Actions that are running, completed, failed, rejected, or cancelled are immutable.


POST /v1/actions/:action_id/execute

Required scope: actions:write

Runs a scheduled or pending action immediately, bypassing its scheduled time.


POST /v1/actions/:action_id/cancel

Required scope: actions:write

Cancels a scheduled action that has not yet executed.


POST /v1/actions/:action_id/approve

Required scope: actions:write

FieldTypeRequiredDescription
actionstringyesOne of approve, reject, edit.
commentstringnoOptional reviewer comment.
POST /v1/actions/:action_id/reject

Equivalent to POST /actions/:action_id/approve with action: "reject".


POST /v1/actions/approve/bulk

Required scope: actions:write

FieldTypeRequiredDescription
actionstringyesOne of approve, reject, edit.
action_idsstring[]yesArray of action IDs to process.
commentstringnoOptional reviewer comment.
{
"status": "success",
"processed": 12,
"failed": [],
"results": [ /* one entry per action_id */ ]
}

POST /v1/actions/bulk

Required scope: actions:write

Create multiple actions in a single request.

FieldTypeRequiredDescription
actionsobject[]yesArray of action create payloads.

POST /v1/actions/process

Required scope: actions:write

Triggers the worker to drain pending scheduled actions whose scheduled_time has passed.

Query ParamTypeDefaultDescription
limitnumber20Max actions to process (1–100).

Useful in CI/test environments where the cron worker isn’t running. In production, the worker drains the queue automatically.


Actions proposed by an agent run are addressed by (run_id, contact_id, action_index) rather than a top-level action ID. See the agent run approval endpoints in the Agents API.