curl --request POST \
--url https://galinum.com/api/v1/agent-runs \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"kind": "launch",
"input": {},
"output": {},
"rationale": "<string>",
"goalId": "<string>",
"campaignId": "<string>",
"idempotencyKey": "<string>"
}
'import requests
url = "https://galinum.com/api/v1/agent-runs"
payload = {
"kind": "launch",
"input": {},
"output": {},
"rationale": "<string>",
"goalId": "<string>",
"campaignId": "<string>",
"idempotencyKey": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
kind: 'launch',
input: {},
output: {},
rationale: '<string>',
goalId: '<string>',
campaignId: '<string>',
idempotencyKey: '<string>'
})
};
fetch('https://galinum.com/api/v1/agent-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://galinum.com/api/v1/agent-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([
'kind' => 'launch',
'input' => [
],
'output' => [
],
'rationale' => '<string>',
'goalId' => '<string>',
'campaignId' => '<string>',
'idempotencyKey' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://galinum.com/api/v1/agent-runs"
payload := strings.NewReader("{\n \"kind\": \"launch\",\n \"input\": {},\n \"output\": {},\n \"rationale\": \"<string>\",\n \"goalId\": \"<string>\",\n \"campaignId\": \"<string>\",\n \"idempotencyKey\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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://galinum.com/api/v1/agent-runs")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"kind\": \"launch\",\n \"input\": {},\n \"output\": {},\n \"rationale\": \"<string>\",\n \"goalId\": \"<string>\",\n \"campaignId\": \"<string>\",\n \"idempotencyKey\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://galinum.com/api/v1/agent-runs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"kind\": \"launch\",\n \"input\": {},\n \"output\": {},\n \"rationale\": \"<string>\",\n \"goalId\": \"<string>\",\n \"campaignId\": \"<string>\",\n \"idempotencyKey\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"run": {
"id": "run_7c8d9e0f-1a2b-3c4d-5e6f-7a8b9c0d1e2f",
"kind": "proposal",
"goalId": "<string>",
"campaignId": "<string>",
"input": {
"segmentSize": 412
},
"output": {},
"rationale": "412 free-plan users active this week haven't created a board.",
"createdAt": 123
}
}{
"run": {
"id": "run_7c8d9e0f-1a2b-3c4d-5e6f-7a8b9c0d1e2f",
"kind": "proposal",
"goalId": "<string>",
"campaignId": "<string>",
"input": {
"segmentSize": 412
},
"output": {},
"rationale": "412 free-plan users active this week haven't created a board.",
"createdAt": 123
}
}{
"error": "userId is required"
}{
"error": "Unauthorized"
}{
"error": "Invalid request"
}{
"error": "Too many requests"
}{
"error": "Could not identify user"
}Log an agent run
Records one agent decision — its input, output, and rationale — so the dashboard’s agent feed shows what ran and why. Set goalId when the run serves a goal; omit it for direct communications.
curl --request POST \
--url https://galinum.com/api/v1/agent-runs \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"kind": "launch",
"input": {},
"output": {},
"rationale": "<string>",
"goalId": "<string>",
"campaignId": "<string>",
"idempotencyKey": "<string>"
}
'import requests
url = "https://galinum.com/api/v1/agent-runs"
payload = {
"kind": "launch",
"input": {},
"output": {},
"rationale": "<string>",
"goalId": "<string>",
"campaignId": "<string>",
"idempotencyKey": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
kind: 'launch',
input: {},
output: {},
rationale: '<string>',
goalId: '<string>',
campaignId: '<string>',
idempotencyKey: '<string>'
})
};
fetch('https://galinum.com/api/v1/agent-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://galinum.com/api/v1/agent-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([
'kind' => 'launch',
'input' => [
],
'output' => [
],
'rationale' => '<string>',
'goalId' => '<string>',
'campaignId' => '<string>',
'idempotencyKey' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://galinum.com/api/v1/agent-runs"
payload := strings.NewReader("{\n \"kind\": \"launch\",\n \"input\": {},\n \"output\": {},\n \"rationale\": \"<string>\",\n \"goalId\": \"<string>\",\n \"campaignId\": \"<string>\",\n \"idempotencyKey\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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://galinum.com/api/v1/agent-runs")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"kind\": \"launch\",\n \"input\": {},\n \"output\": {},\n \"rationale\": \"<string>\",\n \"goalId\": \"<string>\",\n \"campaignId\": \"<string>\",\n \"idempotencyKey\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://galinum.com/api/v1/agent-runs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"kind\": \"launch\",\n \"input\": {},\n \"output\": {},\n \"rationale\": \"<string>\",\n \"goalId\": \"<string>\",\n \"campaignId\": \"<string>\",\n \"idempotencyKey\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"run": {
"id": "run_7c8d9e0f-1a2b-3c4d-5e6f-7a8b9c0d1e2f",
"kind": "proposal",
"goalId": "<string>",
"campaignId": "<string>",
"input": {
"segmentSize": 412
},
"output": {},
"rationale": "412 free-plan users active this week haven't created a board.",
"createdAt": 123
}
}{
"run": {
"id": "run_7c8d9e0f-1a2b-3c4d-5e6f-7a8b9c0d1e2f",
"kind": "proposal",
"goalId": "<string>",
"campaignId": "<string>",
"input": {
"segmentSize": 412
},
"output": {},
"rationale": "412 free-plan users active this week haven't created a board.",
"createdAt": 123
}
}{
"error": "userId is required"
}{
"error": "Unauthorized"
}{
"error": "Invalid request"
}{
"error": "Too many requests"
}{
"error": "Could not identify user"
}Authorizations
Your project's secret key (pk_…, without the pub segment). Server-side only — never ship it to a browser. Get it from Settings → Projects in the dashboard.
Body
Step kind, e.g. observation, proposal, launch, evaluation, conclusion.
64"launch"
What the step looked at (max 16 KB serialized).
What the step produced (max 16 KB serialized).
4000Must be a goal in this project. Omit for direct communications.
1First-class campaign identity. Required for hosted evaluate, propose, mutate, and approval runs.
1Unique per project. A replay returns the original run with 200.
1 - 128Response
The original logged run for an idempotent replay.
Show child attributes
Show child attributes