Start a run’s automated part in CI
const url = 'https://beta-api.plune.ai/v1/projects/example/integrations/ci/launches';const options = { method: 'POST', headers: { cookie: 'plune_session=<plune_session>', 'Content-Type': 'application/json' }, body: '{"runId":"6f1c2b3a-0000-4000-8000-0000000000d1"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://beta-api.plune.ai/v1/projects/example/integrations/ci/launches \ --header 'Content-Type: application/json' \ --cookie plune_session=<plune_session> \ --data '{ "runId": "6f1c2b3a-0000-4000-8000-0000000000d1" }'Owner or member. One workflow_dispatch of the connected workflow with three inputs — plune_run (the run’s key, which the reporter in CI joins by), grep (the run’s automated cases, as plune run grep builds it) and ref (the branch or tag to test) — and return_run_details, so the launch names its pipeline from the first moment. PLUNE_TOKEN is the repository’s secret and never an input. A scheduled run is launched by it, and one whose automated part Plune closed is opened again: Try again and Launch again in CI send a new dispatch under the same key. schedule: true (Save) only keeps the choice. Then Plune watches the pipeline: queued 15 minutes — it cancels it; ended — 5 more minutes for the reporter; 24 hours after the dispatch — it stops. At most 60 launches a minute a person. Session cookie only.
Authorizations
Section titled “Authorizations ”Parameters
Section titled “ Parameters ”Path Parameters
Section titled “Path Parameters ”An id from GET /v1/projects
Request Body required
Section titled “Request Body required ”object
An automated or mixed run of this project, open or closed by the watcher — not finished — with a key.
The branch or tag to test, this run only (the ref input). Absent: the connection’s, or the one saved with schedule.
Save in the launch dialog: keep «Run in CI» and the branch for the run’s launch, and send nothing now.
Examples
Start it on the connection’s branch
{ "runId": "6f1c2b3a-0000-4000-8000-0000000000d1"}Responses
Section titled “ Responses ”Dispatched (queued), or kept for the launch (scheduled)
object
A run’s automated part started in CI, and where Plune last saw its pipeline. state: scheduled (saved, nothing sent) · refused (GitHub would not start it; code says why) · queued · running · completed (it ended, nothing in the run yet: 5 more minutes for the reporter) · reported · not_started (queued 15 minutes; Plune cancelled it) · no_report · lost (24 hours after the dispatch) · cancelled (a person ended the run while its pipeline went on). In the last three and not_started the automated part is closed: an automated run is terminated, a mixed one goes on with its automated cases not run.
object
The branch or tag tested. The workflow file is read from the connection’s own.
refused: why. A watched state: why the CI cannot be asked right now (not_connected: the connection was removed since).
The HTTP status of an unexpected answer.
The run or pipeline page on the CI, from the dispatch’s own answer.
The CI’s word for how it ended: success, failure, cancelled, failed, canceled, …
Since when the CI has not answered; Plune keeps waiting.
Example
{ "launch": { "runId": "6f1c2b3a-0000-4000-8000-0000000000d1", "provider": "github", "repository": "plune-ai/cli", "workflow": ".github/workflows/plune.yml", "ref": "main", "state": "queued", "code": null, "status": null, "runUrl": "https://github.com/plune-ai/cli/actions/runs/900001", "conclusion": null, "dispatchedBy": "u-shop", "dispatchedAt": "2026-09-16T09:12:04.151Z", "startedAt": null, "completedAt": null, "unreachableSince": null, "updatedAt": "2026-09-16T09:12:04.151Z" }}The body does not parse, or does not validate
object
Example generated
{ "error": "example"}No / invalid session — a CLI token is refused here
A reader of the project; or (#1048, only once the operator sets TIER_LIMITS_ENFORCE=true) a tier without the ci_launch permission, answered in English then Ukrainian, naming the feature, with feature and tier
object
Example
{ "error": "a reader starts nothing in CI"}No such project among yours, no such run in it, or no CI is connected
object
Example
{ "error": "no CI is connected"}The run is manual, finished, has no key or no automated case, names more tests than one dispatch takes, or is in CI already; or the saved token does not open under this server’s key
object
Examples
Its pipeline is still watched
{ "error": "run '6f1c2b3a-0000-4000-8000-0000000000d1' is in CI already"}The CI would not start it. The launch is kept as refused with the code — unreachable — the CI did not answer in time; rate_limited — the CI is limiting the token’s requests: try again in a minute; token_rejected — the CI does not accept the token: it is mistyped, expired or revoked; repository_not_found — the token does not reach the repository, project or project slug: a private one it was not given, or a name that is not there; actions_denied — the token may not start workflows or pipelines: on GitHub, Repository permissions → Actions → Read and write; on GitLab, role Developer and scope api; on CircleCI, a user who may start the project’s pipelines; workflow_not_found — the workflow file, .gitlab-ci.yml or .circleci/config.yml is not there; workflow_disabled — the workflow is switched off on GitHub; ref_not_found — the branch or tag is not there; no_workflow_dispatch — the GitHub workflow does not run on workflow_dispatch; inputs_missing — the workflow, job or config does not take everything Plune sends (GitHub: the inputs plune_run, grep, ref; GitLab: a job for $PLUNE_RUN that greps by $PLUNE_GREP; CircleCI: the parameters plune_run and grep): missing names them; variables_denied — the GitLab project keeps pipeline variables from the token’s role: Settings → CI/CD → Variables → Minimum role to use pipeline variables → Developer; address_refused — the GitLab address is not https, is an IP address, or is on a private network: Plune sends no request there; unexpected — the CI answered with a status the check did not expect: the step carries it.
object
A run’s automated part started in CI, and where Plune last saw its pipeline. state: scheduled (saved, nothing sent) · refused (GitHub would not start it; code says why) · queued · running · completed (it ended, nothing in the run yet: 5 more minutes for the reporter) · reported · not_started (queued 15 minutes; Plune cancelled it) · no_report · lost (24 hours after the dispatch) · cancelled (a person ended the run while its pipeline went on). In the last three and not_started the automated part is closed: an automated run is terminated, a mixed one goes on with its automated cases not run.
object
The branch or tag tested. The workflow file is read from the connection’s own.
refused: why. A watched state: why the CI cannot be asked right now (not_connected: the connection was removed since).
The HTTP status of an unexpected answer.
The run or pipeline page on the CI, from the dispatch’s own answer.
The CI’s word for how it ended: success, failure, cancelled, failed, canceled, …
Since when the CI has not answered; Plune keeps waiting.
Example
{ "launch": { "provider": "github", "state": "scheduled", "code": "unreachable" }}More than 60 launches in a minute
object
Example generated
{ "error": "example"}The server has no key to keep tokens under; nothing was sent
object
Example
{ "error": "integrations are not configured on this server — contact your operator"}