/api/v1/campaign-runsList runs#
Responses
200OKapplication/json
array of CampaignStateDRO
idrequiredstring
campaignrequiredstring
statusrequiredstring
cursorrequiredinteger
total_steps requiredinteger
verdictboolean · nullable
true / false / null — and null is the common case.
A CAMPAIGN THAT DID NOT FINISH HAS NO VERDICT. One paused at step 3 of
15 must not report a pass on twelve steps nobody ran, and a client that
rendered false there would be accusing the board of failures it was
never asked to produce.
pause_requested requiredboolean
A pause is asked for and has not yet taken effect.
attemptsrequiredarray of AttemptDRO
AttemptDRO · 5 fields
steprequiredstring
outcomerequiredstring
run_id string · nullable
detailrequiredstring
at_uptime_ms requiredinteger · int64
MILLISECONDS SINCE THE DAEMON STARTED, not since the epoch. The board has no RTC; a client subtracting this from its own wall clock would be out by decades, which has already cost this project a UI feature.
started_at_uptime_ms requiredinteger · int64
Request
curl "http://192.168.2.1:8080/api/v1/campaign-runs"import requests
BASE_URL = "http://192.168.2.1:8080"
response = requests.get(f"{BASE_URL}/api/v1/campaign-runs")
response.raise_for_status()
print(response.json())let base_url = "http://192.168.2.1:8080";
let response = reqwest::Client::new()
.get(format!("{base_url}/api/v1/campaign-runs"))
.send()
.await?
.error_for_status()?;
let body: serde_json::Value = response.json().await?;
println!("{body:#}");Response
[
{
"id": "string",
"campaign": "string",
"status": "string",
"cursor": 0,
"total_steps": 0,
"verdict": true,
"pause_requested": true,
"attempts": [
{
"step": "string",
"outcome": "string",
"run_id": "string",
"detail": "string",
"at_uptime_ms": 0
}
],
"started_at_uptime_ms": 0
}
]/api/v1/campaign-runs/{id}Get run#
Path parameters
idrequiredstring
Execution id
Responses
200OKapplication/json
idrequiredstring
campaignrequiredstring
statusrequiredstring
cursorrequiredinteger
total_steps requiredinteger
verdictboolean · nullable
true / false / null — and null is the common case.
A CAMPAIGN THAT DID NOT FINISH HAS NO VERDICT. One paused at step 3 of
15 must not report a pass on twelve steps nobody ran, and a client that
rendered false there would be accusing the board of failures it was
never asked to produce.
pause_requested requiredboolean
A pause is asked for and has not yet taken effect.
attemptsrequiredarray of AttemptDRO
AttemptDRO · 5 fields
steprequiredstring
outcomerequiredstring
run_id string · nullable
detailrequiredstring
at_uptime_ms requiredinteger · int64
MILLISECONDS SINCE THE DAEMON STARTED, not since the epoch. The board has no RTC; a client subtracting this from its own wall clock would be out by decades, which has already cost this project a UI feature.
started_at_uptime_ms requiredinteger · int64
404Not foundapplication/json
Request
curl "http://192.168.2.1:8080/api/v1/campaign-runs/<id>"import requests
BASE_URL = "http://192.168.2.1:8080"
id = "<id>" # Execution id
response = requests.get(f"{BASE_URL}/api/v1/campaign-runs/{id}")
response.raise_for_status()
print(response.json())let base_url = "http://192.168.2.1:8080";
let id = "<id>"; // Execution id
let response = reqwest::Client::new()
.get(format!("{base_url}/api/v1/campaign-runs/{id}"))
.send()
.await?
.error_for_status()?;
let body: serde_json::Value = response.json().await?;
println!("{body:#}");Response
{
"id": "string",
"campaign": "string",
"status": "string",
"cursor": 0,
"total_steps": 0,
"verdict": true,
"pause_requested": true,
"attempts": [
{
"step": "string",
"outcome": "string",
"run_id": "string",
"detail": "string",
"at_uptime_ms": 0
}
],
"started_at_uptime_ms": 0
}{}/api/v1/campaign-runs/{id}/pausePause#
Path parameters
idrequiredstring
Execution id
Responses
202Pause requested — it takes effect at the next step boundaryapplication/json
idrequiredstring
campaignrequiredstring
statusrequiredstring
cursorrequiredinteger
total_steps requiredinteger
verdictboolean · nullable
true / false / null — and null is the common case.
A CAMPAIGN THAT DID NOT FINISH HAS NO VERDICT. One paused at step 3 of
15 must not report a pass on twelve steps nobody ran, and a client that
rendered false there would be accusing the board of failures it was
never asked to produce.
pause_requested requiredboolean
A pause is asked for and has not yet taken effect.
attemptsrequiredarray of AttemptDRO
AttemptDRO · 5 fields
steprequiredstring
outcomerequiredstring
run_id string · nullable
detailrequiredstring
at_uptime_ms requiredinteger · int64
MILLISECONDS SINCE THE DAEMON STARTED, not since the epoch. The board has no RTC; a client subtracting this from its own wall clock would be out by decades, which has already cost this project a UI feature.
started_at_uptime_ms requiredinteger · int64
404Not foundapplication/json
Request
curl -X POST "http://192.168.2.1:8080/api/v1/campaign-runs/<id>/pause"import requests
BASE_URL = "http://192.168.2.1:8080"
id = "<id>" # Execution id
response = requests.post(f"{BASE_URL}/api/v1/campaign-runs/{id}/pause")
response.raise_for_status()
print(response.json())let base_url = "http://192.168.2.1:8080";
let id = "<id>"; // Execution id
let response = reqwest::Client::new()
.post(format!("{base_url}/api/v1/campaign-runs/{id}/pause"))
.send()
.await?
.error_for_status()?;
let body: serde_json::Value = response.json().await?;
println!("{body:#}");Response
{
"id": "string",
"campaign": "string",
"status": "string",
"cursor": 0,
"total_steps": 0,
"verdict": true,
"pause_requested": true,
"attempts": [
{
"step": "string",
"outcome": "string",
"run_id": "string",
"detail": "string",
"at_uptime_ms": 0
}
],
"started_at_uptime_ms": 0
}{}/api/v1/campaign-runs/{id}/resumeResume#
Path parameters
idrequiredstring
Execution id
Responses
202Acceptedapplication/json
idrequiredstring
campaignrequiredstring
statusrequiredstring
cursorrequiredinteger
total_steps requiredinteger
verdictboolean · nullable
true / false / null — and null is the common case.
A CAMPAIGN THAT DID NOT FINISH HAS NO VERDICT. One paused at step 3 of
15 must not report a pass on twelve steps nobody ran, and a client that
rendered false there would be accusing the board of failures it was
never asked to produce.
pause_requested requiredboolean
A pause is asked for and has not yet taken effect.
attemptsrequiredarray of AttemptDRO
AttemptDRO · 5 fields
steprequiredstring
outcomerequiredstring
run_id string · nullable
detailrequiredstring
at_uptime_ms requiredinteger · int64
MILLISECONDS SINCE THE DAEMON STARTED, not since the epoch. The board has no RTC; a client subtracting this from its own wall clock would be out by decades, which has already cost this project a UI feature.
started_at_uptime_ms requiredinteger · int64
409Finished, or another campaign is runningapplication/json
Request
curl -X POST "http://192.168.2.1:8080/api/v1/campaign-runs/<id>/resume"import requests
BASE_URL = "http://192.168.2.1:8080"
id = "<id>" # Execution id
response = requests.post(f"{BASE_URL}/api/v1/campaign-runs/{id}/resume")
response.raise_for_status()
print(response.json())let base_url = "http://192.168.2.1:8080";
let id = "<id>"; // Execution id
let response = reqwest::Client::new()
.post(format!("{base_url}/api/v1/campaign-runs/{id}/resume"))
.send()
.await?
.error_for_status()?;
let body: serde_json::Value = response.json().await?;
println!("{body:#}");Response
{
"id": "string",
"campaign": "string",
"status": "string",
"cursor": 0,
"total_steps": 0,
"verdict": true,
"pause_requested": true,
"attempts": [
{
"step": "string",
"outcome": "string",
"run_id": "string",
"detail": "string",
"at_uptime_ms": 0
}
],
"started_at_uptime_ms": 0
}{}/api/v1/campaign-runs/{id}/steps/{step}/rerunRerun step#
Path parameters
idrequiredstring
Execution id
steprequiredstring
Step id, as the campaign names it
Responses
200OKapplication/json
idrequiredstring
campaignrequiredstring
statusrequiredstring
cursorrequiredinteger
total_steps requiredinteger
verdictboolean · nullable
true / false / null — and null is the common case.
A CAMPAIGN THAT DID NOT FINISH HAS NO VERDICT. One paused at step 3 of
15 must not report a pass on twelve steps nobody ran, and a client that
rendered false there would be accusing the board of failures it was
never asked to produce.
pause_requested requiredboolean
A pause is asked for and has not yet taken effect.
attemptsrequiredarray of AttemptDRO
AttemptDRO · 5 fields
steprequiredstring
outcomerequiredstring
run_id string · nullable
detailrequiredstring
at_uptime_ms requiredinteger · int64
MILLISECONDS SINCE THE DAEMON STARTED, not since the epoch. The board has no RTC; a client subtracting this from its own wall clock would be out by decades, which has already cost this project a UI feature.
started_at_uptime_ms requiredinteger · int64
409The campaign is runningapplication/json
Request
curl -X POST "http://192.168.2.1:8080/api/v1/campaign-runs/<id>/steps/<step>/rerun"import requests
BASE_URL = "http://192.168.2.1:8080"
id = "<id>" # Execution id
step = "<step>" # Step id, as the campaign names it
response = requests.post(f"{BASE_URL}/api/v1/campaign-runs/{id}/steps/{step}/rerun")
response.raise_for_status()
print(response.json())let base_url = "http://192.168.2.1:8080";
let id = "<id>"; // Execution id
let step = "<step>"; // Step id, as the campaign names it
let response = reqwest::Client::new()
.post(format!("{base_url}/api/v1/campaign-runs/{id}/steps/{step}/rerun"))
.send()
.await?
.error_for_status()?;
let body: serde_json::Value = response.json().await?;
println!("{body:#}");Response
{
"id": "string",
"campaign": "string",
"status": "string",
"cursor": 0,
"total_steps": 0,
"verdict": true,
"pause_requested": true,
"attempts": [
{
"step": "string",
"outcome": "string",
"run_id": "string",
"detail": "string",
"at_uptime_ms": 0
}
],
"started_at_uptime_ms": 0
}{}/api/v1/campaignsList#
Responses
200OKapplication/json
array of CampaignSummaryDRO
namerequiredstring
display_name string · nullable
descriptionrequiredstring
stepsrequiredinteger
cronstring · nullable
The cron expression, when this campaign schedules itself.
tagsrequiredarray of string
Request
curl "http://192.168.2.1:8080/api/v1/campaigns"import requests
BASE_URL = "http://192.168.2.1:8080"
response = requests.get(f"{BASE_URL}/api/v1/campaigns")
response.raise_for_status()
print(response.json())let base_url = "http://192.168.2.1:8080";
let response = reqwest::Client::new()
.get(format!("{base_url}/api/v1/campaigns"))
.send()
.await?
.error_for_status()?;
let body: serde_json::Value = response.json().await?;
println!("{body:#}");Response
[
{
"name": "string",
"display_name": "string",
"description": "string",
"steps": 0,
"cron": "string",
"tags": [
"string"
]
}
]/api/v1/campaigns/activeActive#
Responses
200OKapplication/json
activeActiveDRO · nullable
ActiveDRO · 5 fields
idrequiredstring
campaignrequiredstring
cursorrequiredinteger
totalrequiredinteger
pausingrequiredboolean
board_provider requiredstring
Who would take a board action, in words. "the orchestrator power-cycled it" and "nobody did, the step was refused" must not read the same afterwards.
Request
curl "http://192.168.2.1:8080/api/v1/campaigns/active"import requests
BASE_URL = "http://192.168.2.1:8080"
response = requests.get(f"{BASE_URL}/api/v1/campaigns/active")
response.raise_for_status()
print(response.json())let base_url = "http://192.168.2.1:8080";
let response = reqwest::Client::new()
.get(format!("{base_url}/api/v1/campaigns/active"))
.send()
.await?
.error_for_status()?;
let body: serde_json::Value = response.json().await?;
println!("{body:#}");Response
{
"active": {
"id": "string",
"campaign": "string",
"cursor": 0,
"total": 0,
"pausing": true
},
"board_provider": "string"
}/api/v1/campaigns/{name}Get one#
Path parameters
namerequiredstring
Campaign identifier
Responses
404Not foundapplication/json
Request
curl "http://192.168.2.1:8080/api/v1/campaigns/<name>" \
-o response.binimport requests
BASE_URL = "http://192.168.2.1:8080"
name = "<name>" # Campaign identifier
response = requests.get(f"{BASE_URL}/api/v1/campaigns/{name}")
response.raise_for_status()
data = response.contentlet base_url = "http://192.168.2.1:8080";
let name = "<name>"; // Campaign identifier
let response = reqwest::Client::new()
.get(format!("{base_url}/api/v1/campaigns/{name}"))
.send()
.await?
.error_for_status()?;
let bytes = response.bytes().await?;Response
{}/api/v1/campaigns/{name}/runRun#
Path parameters
namerequiredstring
Campaign to run
Responses
202Acceptedapplication/json
idrequiredstring
campaignrequiredstring
statusrequiredstring
cursorrequiredinteger
total_steps requiredinteger
verdictboolean · nullable
true / false / null — and null is the common case.
A CAMPAIGN THAT DID NOT FINISH HAS NO VERDICT. One paused at step 3 of
15 must not report a pass on twelve steps nobody ran, and a client that
rendered false there would be accusing the board of failures it was
never asked to produce.
pause_requested requiredboolean
A pause is asked for and has not yet taken effect.
attemptsrequiredarray of AttemptDRO
AttemptDRO · 5 fields
steprequiredstring
outcomerequiredstring
run_id string · nullable
detailrequiredstring
at_uptime_ms requiredinteger · int64
MILLISECONDS SINCE THE DAEMON STARTED, not since the epoch. The board has no RTC; a client subtracting this from its own wall clock would be out by decades, which has already cost this project a UI feature.
started_at_uptime_ms requiredinteger · int64
404Not foundapplication/json
409Another campaign is runningapplication/json
Request
curl -X POST "http://192.168.2.1:8080/api/v1/campaigns/<name>/run"import requests
BASE_URL = "http://192.168.2.1:8080"
name = "<name>" # Campaign to run
response = requests.post(f"{BASE_URL}/api/v1/campaigns/{name}/run")
response.raise_for_status()
print(response.json())let base_url = "http://192.168.2.1:8080";
let name = "<name>"; // Campaign to run
let response = reqwest::Client::new()
.post(format!("{base_url}/api/v1/campaigns/{name}/run"))
.send()
.await?
.error_for_status()?;
let body: serde_json::Value = response.json().await?;
println!("{body:#}");Response
{
"id": "string",
"campaign": "string",
"status": "string",
"cursor": 0,
"total_steps": 0,
"verdict": true,
"pause_requested": true,
"attempts": [
{
"step": "string",
"outcome": "string",
"run_id": "string",
"detail": "string",
"at_uptime_ms": 0
}
],
"started_at_uptime_ms": 0
}{}{}