from retab import Retab
client = Retab()
page = client.workflows.experiments.list(workflow_id="wf_abc123")
for exp in page.data:
print(exp.id, exp.name, exp.status, exp.score)
import { Retab } from "@retab/node";
const client = new Retab({ apiKey: process.env.RETAB_API_KEY });
const page = await client.workflows.experiments.list({ workflowId: "wf_abc123" });
for (const exp of page.data) {
console.log(exp.id, exp.name, exp.status, exp.score);
}
package main
import (
"context"
"fmt"
"log"
retab "github.com/retab-dev/retab/clients/go"
)
func ptr[T any](v T) *T { return &v }
func main() {
ctx := context.Background()
client, err := retab.NewClient("")
if err != nil {
log.Fatal(err)
}
page, err := client.Workflows.Experiments.List(ctx, &retab.WorkflowExperimentsListParams{
WorkflowID: "wf_abc123",
})
if err != nil {
log.Fatal(err)
}
for _, exp := range page.Data {
fmt.Println(exp.ID, exp.Name, exp.Status, exp.Score)
}
}
require 'retab'
client = Retab::Client.new(api_key: ENV['RETAB_API_KEY'])
page = client.workflows.experiments.list(workflow_id: 'wf_abc123')
page.data.each do |exp|
puts "#{exp.id} #{exp.name} #{exp.status} #{exp.score}"
end
use retab::resources::workflow_experiments::ListParams;
use retab::Retab;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = Retab::new(std::env::var("RETAB_API_KEY")?);
let page = client
.workflows().experiments()
.list(ListParams::new("wf_abc123"))
.await?;
for exp in &page.data {
println!("{} {} {:?} {:?}", exp.id, exp.name, exp.status, exp.score);
}
Ok(())
}
<?php
require 'vendor/autoload.php';
use Retab\Client;
$client = new Client(apiKey: getenv('RETAB_API_KEY'));
$result = $client->workflows()->experiments()->list(
workflowId: 'wf_abc123',
);
print_r($result);
using Retab;
using RetabClient = Retab.Retab;
var apiKey = Environment.GetEnvironmentVariable("RETAB_API_KEY")!;
var client = new RetabClient(apiKey);
var result = await client.Workflows.Experiments.ListAsync(new WorkflowExperimentsListOptions());
Console.WriteLine(result);
import com.retab.RetabClient;
public final class Example {
public static void main(String[] args) throws Exception {
RetabClient client = new RetabClient(System.getenv("RETAB_API_KEY"));
var result = client.workflows().experiments().list("wf_abc123", null, null, null, 10L, null);
System.out.println(result);
}
}
curl -X 'GET' \
'https://api.retab.com/v1/workflows/experiments?workflow_id=wf_abc123' \
-H 'Authorization: Bearer <your-api-key>'
{
"data": [
{
"id": "exp_abc",
"workflow_id": "wf_abc123",
"block_id": "extract-invoice",
"block_kind": "extract",
"n_consensus": 5,
"document_count": 12,
"name": "Q1 invoices",
"last_run_id": "exprun_1",
"status": "completed",
"score": 0.87,
"is_stale": false,
"schema_drift": "none",
"schema_drift_detail": null,
"created_at": "2026-05-01T14:30:00Z",
"updated_at": "2026-05-02T09:00:00Z"
}
],
"list_metadata": {
"before": null,
"after": null
}
}
Experiments
List Experiments
List experiments under one workflow with cursor pagination.
Optionally filter by block_id. Each experiment is returned with its
latest-run snapshot, block info, and drift detection.
GET
/
v1
/
workflows
/
experiments
from retab import Retab
client = Retab()
page = client.workflows.experiments.list(workflow_id="wf_abc123")
for exp in page.data:
print(exp.id, exp.name, exp.status, exp.score)
import { Retab } from "@retab/node";
const client = new Retab({ apiKey: process.env.RETAB_API_KEY });
const page = await client.workflows.experiments.list({ workflowId: "wf_abc123" });
for (const exp of page.data) {
console.log(exp.id, exp.name, exp.status, exp.score);
}
package main
import (
"context"
"fmt"
"log"
retab "github.com/retab-dev/retab/clients/go"
)
func ptr[T any](v T) *T { return &v }
func main() {
ctx := context.Background()
client, err := retab.NewClient("")
if err != nil {
log.Fatal(err)
}
page, err := client.Workflows.Experiments.List(ctx, &retab.WorkflowExperimentsListParams{
WorkflowID: "wf_abc123",
})
if err != nil {
log.Fatal(err)
}
for _, exp := range page.Data {
fmt.Println(exp.ID, exp.Name, exp.Status, exp.Score)
}
}
require 'retab'
client = Retab::Client.new(api_key: ENV['RETAB_API_KEY'])
page = client.workflows.experiments.list(workflow_id: 'wf_abc123')
page.data.each do |exp|
puts "#{exp.id} #{exp.name} #{exp.status} #{exp.score}"
end
use retab::resources::workflow_experiments::ListParams;
use retab::Retab;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = Retab::new(std::env::var("RETAB_API_KEY")?);
let page = client
.workflows().experiments()
.list(ListParams::new("wf_abc123"))
.await?;
for exp in &page.data {
println!("{} {} {:?} {:?}", exp.id, exp.name, exp.status, exp.score);
}
Ok(())
}
<?php
require 'vendor/autoload.php';
use Retab\Client;
$client = new Client(apiKey: getenv('RETAB_API_KEY'));
$result = $client->workflows()->experiments()->list(
workflowId: 'wf_abc123',
);
print_r($result);
using Retab;
using RetabClient = Retab.Retab;
var apiKey = Environment.GetEnvironmentVariable("RETAB_API_KEY")!;
var client = new RetabClient(apiKey);
var result = await client.Workflows.Experiments.ListAsync(new WorkflowExperimentsListOptions());
Console.WriteLine(result);
import com.retab.RetabClient;
public final class Example {
public static void main(String[] args) throws Exception {
RetabClient client = new RetabClient(System.getenv("RETAB_API_KEY"));
var result = client.workflows().experiments().list("wf_abc123", null, null, null, 10L, null);
System.out.println(result);
}
}
curl -X 'GET' \
'https://api.retab.com/v1/workflows/experiments?workflow_id=wf_abc123' \
-H 'Authorization: Bearer <your-api-key>'
{
"data": [
{
"id": "exp_abc",
"workflow_id": "wf_abc123",
"block_id": "extract-invoice",
"block_kind": "extract",
"n_consensus": 5,
"document_count": 12,
"name": "Q1 invoices",
"last_run_id": "exprun_1",
"status": "completed",
"score": 0.87,
"is_stale": false,
"schema_drift": "none",
"schema_drift_detail": null,
"created_at": "2026-05-01T14:30:00Z",
"updated_at": "2026-05-02T09:00:00Z"
}
],
"list_metadata": {
"before": null,
"after": null
}
}
List all experiments attached to a workflow, with the latest run’s
status, score, staleness flag, and schema-drift state.
The response uses the canonical Retab list envelope:
{ "data": [...], "list_metadata": { "before": null, "after": null } }.
from retab import Retab
client = Retab()
page = client.workflows.experiments.list(workflow_id="wf_abc123")
for exp in page.data:
print(exp.id, exp.name, exp.status, exp.score)
import { Retab } from "@retab/node";
const client = new Retab({ apiKey: process.env.RETAB_API_KEY });
const page = await client.workflows.experiments.list({ workflowId: "wf_abc123" });
for (const exp of page.data) {
console.log(exp.id, exp.name, exp.status, exp.score);
}
package main
import (
"context"
"fmt"
"log"
retab "github.com/retab-dev/retab/clients/go"
)
func ptr[T any](v T) *T { return &v }
func main() {
ctx := context.Background()
client, err := retab.NewClient("")
if err != nil {
log.Fatal(err)
}
page, err := client.Workflows.Experiments.List(ctx, &retab.WorkflowExperimentsListParams{
WorkflowID: "wf_abc123",
})
if err != nil {
log.Fatal(err)
}
for _, exp := range page.Data {
fmt.Println(exp.ID, exp.Name, exp.Status, exp.Score)
}
}
require 'retab'
client = Retab::Client.new(api_key: ENV['RETAB_API_KEY'])
page = client.workflows.experiments.list(workflow_id: 'wf_abc123')
page.data.each do |exp|
puts "#{exp.id} #{exp.name} #{exp.status} #{exp.score}"
end
use retab::resources::workflow_experiments::ListParams;
use retab::Retab;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = Retab::new(std::env::var("RETAB_API_KEY")?);
let page = client
.workflows().experiments()
.list(ListParams::new("wf_abc123"))
.await?;
for exp in &page.data {
println!("{} {} {:?} {:?}", exp.id, exp.name, exp.status, exp.score);
}
Ok(())
}
<?php
require 'vendor/autoload.php';
use Retab\Client;
$client = new Client(apiKey: getenv('RETAB_API_KEY'));
$result = $client->workflows()->experiments()->list(
workflowId: 'wf_abc123',
);
print_r($result);
using Retab;
using RetabClient = Retab.Retab;
var apiKey = Environment.GetEnvironmentVariable("RETAB_API_KEY")!;
var client = new RetabClient(apiKey);
var result = await client.Workflows.Experiments.ListAsync(new WorkflowExperimentsListOptions());
Console.WriteLine(result);
import com.retab.RetabClient;
public final class Example {
public static void main(String[] args) throws Exception {
RetabClient client = new RetabClient(System.getenv("RETAB_API_KEY"));
var result = client.workflows().experiments().list("wf_abc123", null, null, null, 10L, null);
System.out.println(result);
}
}
curl -X 'GET' \
'https://api.retab.com/v1/workflows/experiments?workflow_id=wf_abc123' \
-H 'Authorization: Bearer <your-api-key>'
{
"data": [
{
"id": "exp_abc",
"workflow_id": "wf_abc123",
"block_id": "extract-invoice",
"block_kind": "extract",
"n_consensus": 5,
"document_count": 12,
"name": "Q1 invoices",
"last_run_id": "exprun_1",
"status": "completed",
"score": 0.87,
"is_stale": false,
"schema_drift": "none",
"schema_drift_detail": null,
"created_at": "2026-05-01T14:30:00Z",
"updated_at": "2026-05-02T09:00:00Z"
}
],
"list_metadata": {
"before": null,
"after": null
}
}
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Query Parameters
Required range:
1 <= x <= 100Available options:
asc, desc Response
Successful Response
A page of WorkflowExperiment resources. data holds the items and list_metadata carries the before/after cursors; pass after to fetch the next page.
⌘I