Run an existing pipeline
curl --request POST \
--url https://api.erna.ai/v1/workspaces/{workspaceId}/pipelines/{pipelineId}/runs \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '{
"input": {}
}'import requests
url = "https://api.erna.ai/v1/workspaces/{workspaceId}/pipelines/{pipelineId}/runs"
payload = { "input": {} }
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({input: {}})
};
fetch('https://api.erna.ai/v1/workspaces/{workspaceId}/pipelines/{pipelineId}/runs', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.erna.ai/v1/workspaces/{workspaceId}/pipelines/{pipelineId}/runs",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'input' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.erna.ai/v1/workspaces/{workspaceId}/pipelines/{pipelineId}/runs"
payload := strings.NewReader("{\n \"input\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.erna.ai/v1/workspaces/{workspaceId}/pipelines/{pipelineId}/runs")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"input\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.erna.ai/v1/workspaces/{workspaceId}/pipelines/{pipelineId}/runs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"input\": {}\n}"
response = http.request(request)
puts response.read_body{
"runId": "<string>",
"playbookId": "scheduling",
"pipelineId": "<string>",
"revisionId": "<string>",
"status": "running",
"createdAt": "<string>",
"updatedAt": "<string>",
"links": {
"self": "<string>"
},
"output": "<unknown>",
"error": "<unknown>"
}{
"runId": "<string>",
"playbookId": "scheduling",
"pipelineId": "<string>",
"revisionId": "<string>",
"status": "running",
"createdAt": "<string>",
"updatedAt": "<string>",
"links": {
"self": "<string>"
},
"output": "<unknown>",
"error": "<unknown>"
}{
"error": "insufficient_credits",
"message": "<string>",
"billing": {
"checkoutPath": "<string>"
}
}{
"error": "pipeline_not_ready",
"message": "<string>",
"pipelineStatus": "building"
}{
"error": "invalid_run_input",
"message": "<string>",
"details": [
{
"path": "<string>",
"message": "<string>"
}
]
}Runs
Run an existing pipeline
Execute the latest ready revision of an existing reusable pipeline. Use this endpoint for each new execution instead of creating another pipeline.
Before running, fetch GET /v1/workspaces/{workspaceId}/pipelines/{pipelineId} if you need the run inputJsonSchema. The request body must wrap playbook-specific data under input.
Scheduling example, run many times:
{
"input": {
"dateRange": {
"start": "2026-05-11",
"end": "2026-05-17"
}
}
}
For scheduling pipelines, reusable rules stay in pipeline instructions. A run only supplies the dateRange for this execution.
POST
/
v1
/
workspaces
/
{workspaceId}
/
pipelines
/
{pipelineId}
/
runs
Run an existing pipeline
curl --request POST \
--url https://api.erna.ai/v1/workspaces/{workspaceId}/pipelines/{pipelineId}/runs \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '{
"input": {}
}'import requests
url = "https://api.erna.ai/v1/workspaces/{workspaceId}/pipelines/{pipelineId}/runs"
payload = { "input": {} }
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({input: {}})
};
fetch('https://api.erna.ai/v1/workspaces/{workspaceId}/pipelines/{pipelineId}/runs', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.erna.ai/v1/workspaces/{workspaceId}/pipelines/{pipelineId}/runs",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'input' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.erna.ai/v1/workspaces/{workspaceId}/pipelines/{pipelineId}/runs"
payload := strings.NewReader("{\n \"input\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.erna.ai/v1/workspaces/{workspaceId}/pipelines/{pipelineId}/runs")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"input\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.erna.ai/v1/workspaces/{workspaceId}/pipelines/{pipelineId}/runs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"input\": {}\n}"
response = http.request(request)
puts response.read_body{
"runId": "<string>",
"playbookId": "scheduling",
"pipelineId": "<string>",
"revisionId": "<string>",
"status": "running",
"createdAt": "<string>",
"updatedAt": "<string>",
"links": {
"self": "<string>"
},
"output": "<unknown>",
"error": "<unknown>"
}{
"runId": "<string>",
"playbookId": "scheduling",
"pipelineId": "<string>",
"revisionId": "<string>",
"status": "running",
"createdAt": "<string>",
"updatedAt": "<string>",
"links": {
"self": "<string>"
},
"output": "<unknown>",
"error": "<unknown>"
}{
"error": "insufficient_credits",
"message": "<string>",
"billing": {
"checkoutPath": "<string>"
}
}{
"error": "pipeline_not_ready",
"message": "<string>",
"pipelineStatus": "building"
}{
"error": "invalid_run_input",
"message": "<string>",
"details": [
{
"path": "<string>",
"message": "<string>"
}
]
}Authorizations
OAuth2 access token or API key
Headers
Minimum string length:
1Example:
"unique-idempotency-key"
Body
application/json
Playbook-specific input for this one execution. For scheduling, the run input is only the date range to schedule.
Show child attributes
Show child attributes
Response
Run returned in its current state
Available options:
scheduling, reporting Available options:
running, complete, failed Show child attributes
Show child attributes