curl --request GET \
--url https://api.erdo.ai/v1/workstreams/{workstreamSlug}/ledger \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.erdo.ai/v1/workstreams/{workstreamSlug}/ledger"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.erdo.ai/v1/workstreams/{workstreamSlug}/ledger', 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.erdo.ai/v1/workstreams/{workstreamSlug}/ledger",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.erdo.ai/v1/workstreams/{workstreamSlug}/ledger"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.erdo.ai/v1/workstreams/{workstreamSlug}/ledger")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.erdo.ai/v1/workstreams/{workstreamSlug}/ledger")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"allocator_recommendation": {
"bets": [
{
"action": "<string>",
"champion_judge": "<string>",
"cost_attributed": true,
"cost_millicents": 123,
"experiment_slug": "<string>",
"has_reality": true,
"judge_standing": 123,
"posterior_source": "<string>",
"rationale": "<string>",
"value_mean": 123,
"value_per_cost_mean": 123,
"value_per_cost_stddev": 123,
"value_stddev": 123,
"variant_key": "<string>"
}
],
"budget_exhausted": true,
"notes": [
"<string>"
],
"remaining_millicents": 123
},
"calibration": [
{
"agreed_pairs": 123,
"by_artifact_kind": {},
"by_grounding_source": {},
"comparable_pairs": 123,
"direct_pairs": 123,
"effective_agreement": 123,
"effective_pairs": 123,
"judge_slug": "<string>",
"misordered_examples": [
{
"experiment_run_id": "<string>",
"judge_winner": "<string>",
"judge_winner_value": 123,
"metric": "<string>",
"reality_winner": "<string>",
"reality_winner_value": 123
}
],
"paired_predictions": 123,
"pairwise_agreement_rate": 123,
"platform_agreement": 123,
"platform_pairs": 123,
"random_arm_pairs": 123,
"total_comparisons": 123,
"total_predictions": 123
}
],
"child_portfolio": [
{
"experiment_count": 123,
"open_attention_count": 123,
"running_experiment_count": 123,
"workstream": {
"autonomy_mode": "<string>",
"completed_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"description": "<string>",
"escalation_budget_per_day": -1,
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"primary_thread_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"project_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"slug": "<string>",
"source_template_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"spent_millicents": 123,
"started_at": "2023-11-07T05:31:56Z",
"status": "<string>",
"title": "<string>",
"token_budget_millicents": 123,
"updated_at": "2023-11-07T05:31:56Z"
}
}
],
"defects": [
{
"experiment_run_id": "<string>",
"judge_slug": "<string>",
"observed_at": "2023-11-07T05:31:56Z",
"reason": "<string>",
"variant_key": "<string>"
}
],
"experiments": [
{
"experiment": {
"created_at": "2023-11-07T05:31:56Z",
"decided_at": "2023-11-07T05:31:56Z",
"decision": "<string>",
"decision_rule_markdown": "<string>",
"guardrail_metrics": [
"<string>"
],
"hypothesis_markdown": "<string>",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"outcome_markdown": "<string>",
"primary_metric": "<string>",
"primary_thread_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"project_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"scope": "<string>",
"slug": "<string>",
"started_at": "2023-11-07T05:31:56Z",
"status": "<string>",
"title": "<string>",
"updated_at": "2023-11-07T05:31:56Z",
"workstream_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
},
"recent_observations": [
{
"action_taken": "<string>",
"agent_run_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_at": "2023-11-07T05:31:56Z",
"details": {},
"evidence_dataset_slug": "<string>",
"evidence_resource_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"experiment_run_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"job_execution_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"metric_name": "<string>",
"metric_value": 123,
"observation_type": "<string>",
"observed_at": "2023-11-07T05:31:56Z",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"project_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"reason_code": "<string>",
"variant_key": "<string>",
"window_end": "2023-11-07T05:31:56Z",
"window_start": "2023-11-07T05:31:56Z"
}
],
"variants": [
{
"allocation_percent": -1,
"created_at": "2023-11-07T05:31:56Z",
"experiment_run_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"is_control": true,
"key": "<string>",
"label": "<string>",
"treatment_class": "<string>",
"treatment_resource_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"treatment_resource_type": "<string>",
"treatment_url": "<string>"
}
]
}
],
"judged_bets": 123,
"open_attention_items": [
{
"answer": {},
"answered_at": "2023-11-07T05:31:56Z",
"answered_by_user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"body_markdown": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"expires_at": "2023-11-07T05:31:56Z",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"kind": "<string>",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"payload": {},
"read_at": "2023-11-07T05:31:56Z",
"severity": "<string>",
"slug": "<string>",
"status": "<string>",
"title": "<string>",
"workstream_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
],
"phases": [
{
"completed_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"skill_slug": "<string>",
"slug": "<string>",
"sort_order": -1,
"started_at": "2023-11-07T05:31:56Z",
"status": "<string>",
"thread_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"updated_at": "2023-11-07T05:31:56Z",
"workstream_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
],
"random_arm_bets": 123,
"recent_events": [
{
"actor_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"actor_type": "<string>",
"body": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"workstream_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
],
"recently_resolved_attention_items": [
{
"answer": {},
"answered_at": "2023-11-07T05:31:56Z",
"answered_by_user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"body_markdown": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"expires_at": "2023-11-07T05:31:56Z",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"kind": "<string>",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"payload": {},
"read_at": "2023-11-07T05:31:56Z",
"severity": "<string>",
"slug": "<string>",
"status": "<string>",
"title": "<string>",
"workstream_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
],
"workstream": {
"autonomy_mode": "<string>",
"completed_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"description": "<string>",
"escalation_budget_per_day": -1,
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"primary_thread_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"project_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"slug": "<string>",
"source_template_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"spent_millicents": 123,
"started_at": "2023-11-07T05:31:56Z",
"status": "<string>",
"title": "<string>",
"token_budget_millicents": 123,
"updated_at": "2023-11-07T05:31:56Z"
}
}{
"code": "not_found",
"details": {},
"message": "<string>"
}ReadWorkstreamLedgerAPI mirrors erdo_read_workstream_ledger: the allocator's
single ledger read (budget, experiments + observations, calibration, steering notes, attention items, allocator recommendation).
curl --request GET \
--url https://api.erdo.ai/v1/workstreams/{workstreamSlug}/ledger \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.erdo.ai/v1/workstreams/{workstreamSlug}/ledger"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.erdo.ai/v1/workstreams/{workstreamSlug}/ledger', 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.erdo.ai/v1/workstreams/{workstreamSlug}/ledger",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.erdo.ai/v1/workstreams/{workstreamSlug}/ledger"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.erdo.ai/v1/workstreams/{workstreamSlug}/ledger")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.erdo.ai/v1/workstreams/{workstreamSlug}/ledger")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"allocator_recommendation": {
"bets": [
{
"action": "<string>",
"champion_judge": "<string>",
"cost_attributed": true,
"cost_millicents": 123,
"experiment_slug": "<string>",
"has_reality": true,
"judge_standing": 123,
"posterior_source": "<string>",
"rationale": "<string>",
"value_mean": 123,
"value_per_cost_mean": 123,
"value_per_cost_stddev": 123,
"value_stddev": 123,
"variant_key": "<string>"
}
],
"budget_exhausted": true,
"notes": [
"<string>"
],
"remaining_millicents": 123
},
"calibration": [
{
"agreed_pairs": 123,
"by_artifact_kind": {},
"by_grounding_source": {},
"comparable_pairs": 123,
"direct_pairs": 123,
"effective_agreement": 123,
"effective_pairs": 123,
"judge_slug": "<string>",
"misordered_examples": [
{
"experiment_run_id": "<string>",
"judge_winner": "<string>",
"judge_winner_value": 123,
"metric": "<string>",
"reality_winner": "<string>",
"reality_winner_value": 123
}
],
"paired_predictions": 123,
"pairwise_agreement_rate": 123,
"platform_agreement": 123,
"platform_pairs": 123,
"random_arm_pairs": 123,
"total_comparisons": 123,
"total_predictions": 123
}
],
"child_portfolio": [
{
"experiment_count": 123,
"open_attention_count": 123,
"running_experiment_count": 123,
"workstream": {
"autonomy_mode": "<string>",
"completed_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"description": "<string>",
"escalation_budget_per_day": -1,
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"primary_thread_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"project_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"slug": "<string>",
"source_template_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"spent_millicents": 123,
"started_at": "2023-11-07T05:31:56Z",
"status": "<string>",
"title": "<string>",
"token_budget_millicents": 123,
"updated_at": "2023-11-07T05:31:56Z"
}
}
],
"defects": [
{
"experiment_run_id": "<string>",
"judge_slug": "<string>",
"observed_at": "2023-11-07T05:31:56Z",
"reason": "<string>",
"variant_key": "<string>"
}
],
"experiments": [
{
"experiment": {
"created_at": "2023-11-07T05:31:56Z",
"decided_at": "2023-11-07T05:31:56Z",
"decision": "<string>",
"decision_rule_markdown": "<string>",
"guardrail_metrics": [
"<string>"
],
"hypothesis_markdown": "<string>",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"outcome_markdown": "<string>",
"primary_metric": "<string>",
"primary_thread_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"project_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"scope": "<string>",
"slug": "<string>",
"started_at": "2023-11-07T05:31:56Z",
"status": "<string>",
"title": "<string>",
"updated_at": "2023-11-07T05:31:56Z",
"workstream_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
},
"recent_observations": [
{
"action_taken": "<string>",
"agent_run_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_at": "2023-11-07T05:31:56Z",
"details": {},
"evidence_dataset_slug": "<string>",
"evidence_resource_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"experiment_run_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"job_execution_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"metric_name": "<string>",
"metric_value": 123,
"observation_type": "<string>",
"observed_at": "2023-11-07T05:31:56Z",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"project_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"reason_code": "<string>",
"variant_key": "<string>",
"window_end": "2023-11-07T05:31:56Z",
"window_start": "2023-11-07T05:31:56Z"
}
],
"variants": [
{
"allocation_percent": -1,
"created_at": "2023-11-07T05:31:56Z",
"experiment_run_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"is_control": true,
"key": "<string>",
"label": "<string>",
"treatment_class": "<string>",
"treatment_resource_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"treatment_resource_type": "<string>",
"treatment_url": "<string>"
}
]
}
],
"judged_bets": 123,
"open_attention_items": [
{
"answer": {},
"answered_at": "2023-11-07T05:31:56Z",
"answered_by_user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"body_markdown": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"expires_at": "2023-11-07T05:31:56Z",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"kind": "<string>",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"payload": {},
"read_at": "2023-11-07T05:31:56Z",
"severity": "<string>",
"slug": "<string>",
"status": "<string>",
"title": "<string>",
"workstream_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
],
"phases": [
{
"completed_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"skill_slug": "<string>",
"slug": "<string>",
"sort_order": -1,
"started_at": "2023-11-07T05:31:56Z",
"status": "<string>",
"thread_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"updated_at": "2023-11-07T05:31:56Z",
"workstream_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
],
"random_arm_bets": 123,
"recent_events": [
{
"actor_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"actor_type": "<string>",
"body": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"workstream_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
],
"recently_resolved_attention_items": [
{
"answer": {},
"answered_at": "2023-11-07T05:31:56Z",
"answered_by_user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"body_markdown": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"expires_at": "2023-11-07T05:31:56Z",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"kind": "<string>",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"payload": {},
"read_at": "2023-11-07T05:31:56Z",
"severity": "<string>",
"slug": "<string>",
"status": "<string>",
"title": "<string>",
"workstream_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
],
"workstream": {
"autonomy_mode": "<string>",
"completed_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"description": "<string>",
"escalation_budget_per_day": -1,
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"primary_thread_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"project_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"slug": "<string>",
"source_template_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"spent_millicents": 123,
"started_at": "2023-11-07T05:31:56Z",
"status": "<string>",
"title": "<string>",
"token_budget_millicents": 123,
"updated_at": "2023-11-07T05:31:56Z"
}
}{
"code": "not_found",
"details": {},
"message": "<string>"
}Authorizations
An Erdo API key (erdo_api_...) or scoped token (erdo_token_...).
Path Parameters
Query Parameters
-2147483648 <= x <= 2147483647Response
Success response
workstream: a per-bet action + posterior, plus the budget envelope it fit the recommendation inside. Deterministic — same ledger in, same recommendation out.
Show child attributes
Show child attributes
trust dial the loop uses to weight kills and screening. Empty until judges have made forecasts reality later measured. Each entry also carries its residual stream (misordered_examples) — the seed the loop hands to judge generation when a persistent disagreement pattern emerges.
Show child attributes
Show child attributes
It is deliberately one level deep: portfolio supervision does not require an unbounded graph traversal.
Show child attributes
Show child attributes
ledger — the seeded complement to the misordered_examples each judge carries. A defect costs no conversion, so the residual stream can never surface it; the loop reads these alongside misordered_examples so judge generation can propose a lens for a failure only a human eye caught. Bounded per read.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
this project: how many measured bets skipped judge screening vs. were screened. The loop watches the split to keep the random arm alive (roughly one in ten) so it can price what the judges cost.
Show child attributes
Show child attributes
that a human (or the expiry safe-default) resolved within the recent window. The loop reads these to act on ANSWERS to the escalations/choices it asked — a self-reconciling pass must be able to read back the human's reply, not just re-ask. Carries the answer + applied safe_default; newest first.
Show child attributes
Show child attributes
Operational state machine for multi-step work (campaign launches, reports, monitors).
Show child attributes
Show child attributes

