Skip to content

Start a run’s automated part in CI

POST
/v1/projects/{id}/integrations/ci/launches
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.

id
required
string

An id from GET /v1/projects

Media type application/json
object
runId
required

An automated or mixed run of this project, open or closed by the watcher — not finished — with a key.

string
ref

The branch or tag to test, this run only (the ref input). Absent: the connection’s, or the one saved with schedule.

string
>= 1 characters <= 255 characters
schedule

Save in the launch dialog: keep «Run in CI» and the branch for the run’s launch, and send nothing now.

boolean
Examples
Example example

Start it on the connection’s branch

{
"runId": "6f1c2b3a-0000-4000-8000-0000000000d1"
}

Dispatched (queued), or kept for the launch (scheduled)

Media type application/json
object
launch
required

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
runId
required
string
provider
required
string
Allowed values: github gitlab circleci
repository
required
string
workflow
required
string
ref
required

The branch or tag tested. The workflow file is read from the connection’s own.

string
state
required
string
Allowed values: scheduled refused queued running completed reported not_started no_report lost cancelled
code
required

refused: why. A watched state: why the CI cannot be asked right now (not_connected: the connection was removed since).

string
nullable
Allowed values: unreachable rate_limited token_rejected repository_not_found actions_denied workflow_not_found workflow_disabled ref_not_found no_workflow_dispatch inputs_missing variables_denied address_refused unexpected not_connected
status
required

The HTTP status of an unexpected answer.

integer
nullable
runUrl
required

The run or pipeline page on the CI, from the dispatch’s own answer.

string
nullable
conclusion
required

The CI’s word for how it ended: success, failure, cancelled, failed, canceled, …

string
nullable
dispatchedBy
required
string
dispatchedAt
required
string format: date-time
nullable
startedAt
required
string format: date-time
nullable
completedAt
required
string format: date-time
nullable
unreachableSince
required

Since when the CI has not answered; Plune keeps waiting.

string format: date-time
nullable
updatedAt
required
string format: date-time
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

Media type application/json
object
error
required
string
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

Media type application/json
object
error
required
string
Example
{
"error": "a reader starts nothing in CI"
}

No such project among yours, no such run in it, or no CI is connected

Media type application/json
object
error
required
string
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

Media type application/json
object
error
required
string
Examples
Example inCi

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.

Media type application/json
object
error
required
string
launch
required

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
runId
required
string
provider
required
string
Allowed values: github gitlab circleci
repository
required
string
workflow
required
string
ref
required

The branch or tag tested. The workflow file is read from the connection’s own.

string
state
required
string
Allowed values: scheduled refused queued running completed reported not_started no_report lost cancelled
code
required

refused: why. A watched state: why the CI cannot be asked right now (not_connected: the connection was removed since).

string
nullable
Allowed values: unreachable rate_limited token_rejected repository_not_found actions_denied workflow_not_found workflow_disabled ref_not_found no_workflow_dispatch inputs_missing variables_denied address_refused unexpected not_connected
status
required

The HTTP status of an unexpected answer.

integer
nullable
runUrl
required

The run or pipeline page on the CI, from the dispatch’s own answer.

string
nullable
conclusion
required

The CI’s word for how it ended: success, failure, cancelled, failed, canceled, …

string
nullable
dispatchedBy
required
string
dispatchedAt
required
string format: date-time
nullable
startedAt
required
string format: date-time
nullable
completedAt
required
string format: date-time
nullable
unreachableSince
required

Since when the CI has not answered; Plune keeps waiting.

string format: date-time
nullable
updatedAt
required
string format: date-time
Example
{
"launch": {
"provider": "github",
"state": "scheduled",
"code": "unreachable"
}
}

More than 60 launches in a minute

Media type application/json
object
error
required
string
Example generated
{
"error": "example"
}

The server has no key to keep tokens under; nothing was sent

Media type application/json
object
error
required
string
Example
{
"error": "integrations are not configured on this server — contact your operator"
}