Skip to main content
GET
/
v1
/
workflows
/
experiments
/
results
from retab import Retab

client = Retab()

results = client.workflows.experiments.results.list("exprun_2")
for result in results.data:
    print(result.document_id, result.lifecycle.status, result.artifact)
import { Retab } from "@retab/node";

const client = new Retab({ apiKey: process.env.RETAB_API_KEY });

const results = await client.workflows.experiments.results.list({
  runId: "exprun_2",
});
for (const result of results.data) {
  console.log(result.documentId, result.lifecycle.status, result.artifact);
}
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)
	}

	results, err := client.Workflows.Experiments.Results.List(ctx, &retab.ExperimentRunResultsListParams{
		RunID: "exprun_2",
		PaginationParams: retab.PaginationParams{
			Limit: ptr(20),
		},
	})
	if err != nil {
		log.Fatal(err)
	}

	for _, result := range results.Data {
		fmt.Println(result.DocumentID, result.Lifecycle.Status(), result.Artifact)
	}
}
use retab::resources::experiment_run_results::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 results = client
        .workflows().experiments().results()
        .list(ListParams::new("exprun_2"))
        .await?;
    for result in &results.data {
        println!(
            "{} {:?} {:?}",
            result.document_id, result.lifecycle, result.artifact
        );
    }
    Ok(())
}
<?php
require 'vendor/autoload.php';

use Retab\Client;

$client = new Client(apiKey: getenv('RETAB_API_KEY'));

$result = $client->workflows()->experiments()->results()->list(
    runId: 'run_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.Results.ListAsync(new ExperimentRunResultsListOptions());
Console.WriteLine(result);
require 'retab'

client = Retab::Client.new(api_key: ENV['RETAB_API_KEY'])

result = client.workflows.experiments.results.list
puts 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().results().list("run_abc123", null, null, 10L, null);
    System.out.println(result);
  }
}
curl -X 'GET' \
  'https://api.retab.com/v1/workflows/experiments/results?run_id=exprun_2&limit=20' \
  -H 'Authorization: Bearer <your-api-key>'
{
  "data": [
    {
      "id": "expresult_1",
      "run_id": "exprun_2",
      "experiment_id": "exp_abc",
      "document_id": "expdoc_xyz",
      "block_kind": "extract",
      "lifecycle": { "status": "completed" },
      "timing": {
        "started_at": "2026-05-02T11:00:01Z",
        "completed_at": "2026-05-02T11:00:05Z",
        "duration_ms": 4120
      },
      "handle_inputs": {
        "input-document-0": { "type": "file", "filename": "invoice_q1.pdf" }
      },
      "artifact": { "operation": "extraction", "id": "ext_xyz" },
      "attempt": 0
    }
  ],
  "list_metadata": {
    "before": null,
    "after": null
  }
}
List per-document results for one experiment run. Filter by run_id; each result also has its own opaque id; use Get Experiment Run Result to refresh one row directly. The response uses the canonical Retab list envelope: { "data": [...], "list_metadata": { "before": null, "after": null } }.
from retab import Retab

client = Retab()

results = client.workflows.experiments.results.list("exprun_2")
for result in results.data:
    print(result.document_id, result.lifecycle.status, result.artifact)
import { Retab } from "@retab/node";

const client = new Retab({ apiKey: process.env.RETAB_API_KEY });

const results = await client.workflows.experiments.results.list({
  runId: "exprun_2",
});
for (const result of results.data) {
  console.log(result.documentId, result.lifecycle.status, result.artifact);
}
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)
	}

	results, err := client.Workflows.Experiments.Results.List(ctx, &retab.ExperimentRunResultsListParams{
		RunID: "exprun_2",
		PaginationParams: retab.PaginationParams{
			Limit: ptr(20),
		},
	})
	if err != nil {
		log.Fatal(err)
	}

	for _, result := range results.Data {
		fmt.Println(result.DocumentID, result.Lifecycle.Status(), result.Artifact)
	}
}
use retab::resources::experiment_run_results::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 results = client
        .workflows().experiments().results()
        .list(ListParams::new("exprun_2"))
        .await?;
    for result in &results.data {
        println!(
            "{} {:?} {:?}",
            result.document_id, result.lifecycle, result.artifact
        );
    }
    Ok(())
}
<?php
require 'vendor/autoload.php';

use Retab\Client;

$client = new Client(apiKey: getenv('RETAB_API_KEY'));

$result = $client->workflows()->experiments()->results()->list(
    runId: 'run_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.Results.ListAsync(new ExperimentRunResultsListOptions());
Console.WriteLine(result);
require 'retab'

client = Retab::Client.new(api_key: ENV['RETAB_API_KEY'])

result = client.workflows.experiments.results.list
puts 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().results().list("run_abc123", null, null, 10L, null);
    System.out.println(result);
  }
}
curl -X 'GET' \
  'https://api.retab.com/v1/workflows/experiments/results?run_id=exprun_2&limit=20' \
  -H 'Authorization: Bearer <your-api-key>'
{
  "data": [
    {
      "id": "expresult_1",
      "run_id": "exprun_2",
      "experiment_id": "exp_abc",
      "document_id": "expdoc_xyz",
      "block_kind": "extract",
      "lifecycle": { "status": "completed" },
      "timing": {
        "started_at": "2026-05-02T11:00:01Z",
        "completed_at": "2026-05-02T11:00:05Z",
        "duration_ms": 4120
      },
      "handle_inputs": {
        "input-document-0": { "type": "file", "filename": "invoice_q1.pdf" }
      },
      "artifact": { "operation": "extraction", "id": "ext_xyz" },
      "attempt": 0
    }
  ],
  "list_metadata": {
    "before": null,
    "after": null
  }
}

Authorizations

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Query Parameters

run_id
string
required
before
string | null
after
string | null
limit
integer
default:100
Required range: 1 <= x <= 1000
order
enum<string>
default:desc
Available options:
asc,
desc

Response

Successful Response

A page of WorkflowExperimentResult resources. data holds the items and list_metadata carries the before/after cursors; pass after to fetch the next page.

data
WorkflowExperimentResult · object[]
required
list_metadata
ListMetadata · object
required

Boundary resource IDs for page navigation.