material

material.import

Your prospect folder → a campaign + company list, then it stops. Uploading material is not permission to send.

Dispatched to material.import on POST /mcp/run. This route is a different URL for the same call: the request is answered by the same dispatcher, with the same authentication, the same scope check, the same organisation scoping and the same refusals.

  • Scope: pipeline
  • A free sandbox key may call it, but not with every argument. autoAdvance carries the run on into contact lookup and drafting, which spend, so with it the same call needs a live key.
  • MCP tools that wrap the same function: selda_import_material
  • Filled in from your API key, never sent by you: orgId, apiKeyId
post/v1/material/import

Request

  • Base URL: https://api.selda.ai
  • URL: https://api.selda.ai/v1/material/import
  • Auth: HTTP bearer

Request body

projectIdstring required

A Convex document id in the projects table.

excludedFoldersstring[]
campaignNamestring
targetRunIdstring

Push INTO an existing campaign instead of creating one (#357), the campaign's run id. The other door onto the same feature: a script that already produced a second folder of prospects for the same motion should be able to add them as the campaign's next wave rather than fragmenting one effort across several campaigns. The permission rule is unchanged, the wave parks at the company-list gate and inherits nothing from an earlier wave's grant, and the run must belong to the project this API key's org owns, which appendCandidateBatch verifies. A Convex document id in the campaignRuns table.

campaignBriefstring

The operator's campaign document (18.8.2026): rules, structure, tone, what may not be claimed. This is what made the API pipeline half-manual, analyses went in over the wire, but the RULES had to be pasted by hand in the app, and a campaign without them runs on house defaults. Honored exactly as the Määritä card's own-prompt mode is. On a targetRunId wave it is accepted only when the campaign has no brief yet; a differing one is refused out loud.

fieldsobject

Your own data per company, for personal pages and videos: { "boreo.fi": { demo: "https://...", offer: "...", price: 49 } }. The key is a company's domain or its name; the values are kept under the names you give them (a-z, 0-9, _; demo and any *_url must be https). Refused keys come back in fieldsRefused. Nothing is sent and nothing is invented.

Response

The call succeeded.

valueunknown required
request_idstring required

Echoed in the X-Request-Id header.

Changes

No recorded changes to this operation across all 1 revision of this API.