ReferenceWhat you can callsignalsmutatesignals.startCampaign

signals.startCampaign

Turn chosen signals into a campaign run. Holds at the company list unless told otherwise. Spends credits. Sends nothing, the send is still a human press in the app.

EndpointPOST /mcp/mutate
Scopewrite
Sandbox keyrefused
Extra entitlementnone
MCP toolsselda_start_campaign_from_signals
Convex functionsignalEngine/handover:startCampaignFromSignalsForKey

A free sandbox key is refused: it runs the discovery and research engine: web search, crawls, model calls, per-lead credits.

⚠️
A legacy entry. It is dispatched, and its own summary above says what that costs you.

Arguments

ArgumentTypeRequiredNotes
projectIdid<"projects">required
signalIdsid<"watchSignals">[]required
campaignIdid<"campaigns">optional
holdAtCompaniesbooleanoptional
labelstringoptionalNames the batch. Absent leaves the same dated label the app writes.

What Selda fills in

You never send these. The HTTP layer overwrites them from the API key, which is what keeps one organisation’s data out of another’s reach.

ArgumentFilled in from
orgIdyour organisation, resolved from the API key

Example request

Required arguments only. Values in angle brackets are yours to fill in; the optional ones are in the table above.

curl -X POST https://api.selda.ai/mcp/mutate \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{ "fn": "signals.startCampaign", "args": { "projectId": "<projectId>", "signalIds": "<signalIds>" } }'
{
  "fn": "signals.startCampaign",
  "args": {
    "projectId": "<projectId>",
    "signalIds": "<signalIds>"
  }
}

Example response

Every endpoint answers in the same envelope.

{
  "value": <the function's return value>,
  "request_id": "req_..."
}

The shape of value is not documented here. signalEngine/handover:startCampaignFromSignalsForKey declares no returns validator, so there is nothing to derive it from, and a shape written out by hand here is a shape that goes stale without anything noticing. Call it once against a test key and read what comes back.

On failure the body is { "error": { "type", "code", "message", "request_id" }, "request_id" } and request_id is echoed in the X-Request-Id header.


Generated from convex/lib/mcpRegistry.ts. Nothing in this reference sends: launchRun is in no registry and never will be, so a script can prepare a campaign completely and a person still presses send in the app.