from retab import Retab
client = Retab()
workflow_eval = client.workflows.evals.get(
eval_id="wfnodeeval_hsLEQiM61ez9Piv147MWk",
)
print(workflow_eval.assertion.condition)
print(workflow_eval.schema_drift)
import { Retab } from "@retab/node";
const client = new Retab({ apiKey: process.env.RETAB_API_KEY });
const workflowEval = await client.workflows.evals.get("wfnodeeval_hsLEQiM61ez9Piv147MWk");
console.log(workflowEval.assertion.condition);
console.log(workflowEval.schemaDrift);
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)
}
workflowEval, err := client.Workflows.Evals.Get(ctx, "wfnodeeval_hsLEQiM61ez9Piv147MWk")
if err != nil {
log.Fatal(err)
}
fmt.Println(workflowEval.Assertion)
fmt.Println(workflowEval.SchemaDrift)
}
require 'retab'
client = Retab::Client.new(api_key: ENV['RETAB_API_KEY'])
workflow_eval = client.workflows.evals.get(eval_id: 'wfnodeeval_hsLEQiM61ez9Piv147MWk')
puts workflow_eval.assertion.condition
puts workflow_eval.schema_drift
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 workflow_eval = client
.workflows().evals()
.get("wfnodeeval_hsLEQiM61ez9Piv147MWk")
.await?;
if let Some(assertion) = workflow_eval.assertion.as_ref() {
println!("{:?}", assertion.condition);
}
println!("{:?}", workflow_eval.schema_drift);
Ok(())
}
<?php
require 'vendor/autoload.php';
use Retab\Client;
$client = new Client(apiKey: getenv('RETAB_API_KEY'));
$result = $client->workflows()->evals()->get(
evalId: 'eval_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.Evals.GetAsync("eval_abc123");
Console.WriteLine(result);
import com.retab.RetabClient;
import com.retab.workflowevals.WorkflowEvalsApi;
public final class Example {
public static void main(String[] args) throws Exception {
RetabClient client = new RetabClient(System.getenv("RETAB_API_KEY"));
var result = new WorkflowEvalsApi(client).get("eval_abc123");
System.out.println(result);
}
}
curl -X 'GET' \
'https://api.retab.com/v1/workflows/evals/wfnodeeval_hsLEQiM61ez9Piv147MWk' \
-H 'accept: application/json' \
-H 'Authorization: Bearer <your-api-key>'
{
"id": "wfnodeeval_hsLEQiM61ez9Piv147MWk",
"workflow_id": "wf_abc123xyz",
"target": { "type": "block", "block_id": "block_extract_invoice" },
"source": {
"type": "manual",
"handle_inputs": {
"input-document-0": {
"type": "file",
"document": {
"id": "file_invoice_q1",
"filename": "invoice.pdf",
"mime_type": "application/pdf"
}
}
}
},
"name": "Q1 invoice total",
"assertion": {
"id": "assert_xyz",
"target": { "output_handle_id": "output-json-0", "path": "total" },
"condition": { "kind": "equals", "expected": 1234.56 },
"label": null
},
"schema_drift": "none",
"schema_drift_detail": null,
"validation_status": "valid",
"validation_issues": [],
"latest_run_summary": {
"run_record_id": "wfnodeevalrun_abc123",
"status": "completed",
"outcome": "passed",
"started_at": "2026-05-01T13:55:00Z",
"completed_at": "2026-05-01T13:55:18Z",
"duration_ms": 18221,
"workflow_draft_fingerprint": "ddd95baadce6045f",
"block_execution_fingerprint": "0ff93ddc7cefcb42",
"assertions_passed": 1,
"assertions_failed": 0,
"blocked_assertions": 0
},
"latest_passing_run_summary": { "...": "as above" },
"latest_failing_run_summary": null,
"created_at": "2026-04-08T14:22:26Z",
"updated_at": "2026-04-08T14:27:52Z"
}
{
"detail": "Workflow eval not found: wfnodeeval_hsLEQiM61ez9Piv147MWk"
}
Get Workflow Eval
Retrieve a single workflow eval.
Identified by eval_id. Returns the eval with its target block,
assertion, input source, and latest-run summaries. Returns 404 if no eval
with that ID exists.
from retab import Retab
client = Retab()
workflow_eval = client.workflows.evals.get(
eval_id="wfnodeeval_hsLEQiM61ez9Piv147MWk",
)
print(workflow_eval.assertion.condition)
print(workflow_eval.schema_drift)
import { Retab } from "@retab/node";
const client = new Retab({ apiKey: process.env.RETAB_API_KEY });
const workflowEval = await client.workflows.evals.get("wfnodeeval_hsLEQiM61ez9Piv147MWk");
console.log(workflowEval.assertion.condition);
console.log(workflowEval.schemaDrift);
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)
}
workflowEval, err := client.Workflows.Evals.Get(ctx, "wfnodeeval_hsLEQiM61ez9Piv147MWk")
if err != nil {
log.Fatal(err)
}
fmt.Println(workflowEval.Assertion)
fmt.Println(workflowEval.SchemaDrift)
}
require 'retab'
client = Retab::Client.new(api_key: ENV['RETAB_API_KEY'])
workflow_eval = client.workflows.evals.get(eval_id: 'wfnodeeval_hsLEQiM61ez9Piv147MWk')
puts workflow_eval.assertion.condition
puts workflow_eval.schema_drift
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 workflow_eval = client
.workflows().evals()
.get("wfnodeeval_hsLEQiM61ez9Piv147MWk")
.await?;
if let Some(assertion) = workflow_eval.assertion.as_ref() {
println!("{:?}", assertion.condition);
}
println!("{:?}", workflow_eval.schema_drift);
Ok(())
}
<?php
require 'vendor/autoload.php';
use Retab\Client;
$client = new Client(apiKey: getenv('RETAB_API_KEY'));
$result = $client->workflows()->evals()->get(
evalId: 'eval_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.Evals.GetAsync("eval_abc123");
Console.WriteLine(result);
import com.retab.RetabClient;
import com.retab.workflowevals.WorkflowEvalsApi;
public final class Example {
public static void main(String[] args) throws Exception {
RetabClient client = new RetabClient(System.getenv("RETAB_API_KEY"));
var result = new WorkflowEvalsApi(client).get("eval_abc123");
System.out.println(result);
}
}
curl -X 'GET' \
'https://api.retab.com/v1/workflows/evals/wfnodeeval_hsLEQiM61ez9Piv147MWk' \
-H 'accept: application/json' \
-H 'Authorization: Bearer <your-api-key>'
{
"id": "wfnodeeval_hsLEQiM61ez9Piv147MWk",
"workflow_id": "wf_abc123xyz",
"target": { "type": "block", "block_id": "block_extract_invoice" },
"source": {
"type": "manual",
"handle_inputs": {
"input-document-0": {
"type": "file",
"document": {
"id": "file_invoice_q1",
"filename": "invoice.pdf",
"mime_type": "application/pdf"
}
}
}
},
"name": "Q1 invoice total",
"assertion": {
"id": "assert_xyz",
"target": { "output_handle_id": "output-json-0", "path": "total" },
"condition": { "kind": "equals", "expected": 1234.56 },
"label": null
},
"schema_drift": "none",
"schema_drift_detail": null,
"validation_status": "valid",
"validation_issues": [],
"latest_run_summary": {
"run_record_id": "wfnodeevalrun_abc123",
"status": "completed",
"outcome": "passed",
"started_at": "2026-05-01T13:55:00Z",
"completed_at": "2026-05-01T13:55:18Z",
"duration_ms": 18221,
"workflow_draft_fingerprint": "ddd95baadce6045f",
"block_execution_fingerprint": "0ff93ddc7cefcb42",
"assertions_passed": 1,
"assertions_failed": 0,
"blocked_assertions": 0
},
"latest_passing_run_summary": { "...": "as above" },
"latest_failing_run_summary": null,
"created_at": "2026-04-08T14:22:26Z",
"updated_at": "2026-04-08T14:27:52Z"
}
{
"detail": "Workflow eval not found: wfnodeeval_hsLEQiM61ez9Piv147MWk"
}
validation_status and schema-drift state against the current workflow draft
before returning, so the caller always sees the latest staleness.
from retab import Retab
client = Retab()
workflow_eval = client.workflows.evals.get(
eval_id="wfnodeeval_hsLEQiM61ez9Piv147MWk",
)
print(workflow_eval.assertion.condition)
print(workflow_eval.schema_drift)
import { Retab } from "@retab/node";
const client = new Retab({ apiKey: process.env.RETAB_API_KEY });
const workflowEval = await client.workflows.evals.get("wfnodeeval_hsLEQiM61ez9Piv147MWk");
console.log(workflowEval.assertion.condition);
console.log(workflowEval.schemaDrift);
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)
}
workflowEval, err := client.Workflows.Evals.Get(ctx, "wfnodeeval_hsLEQiM61ez9Piv147MWk")
if err != nil {
log.Fatal(err)
}
fmt.Println(workflowEval.Assertion)
fmt.Println(workflowEval.SchemaDrift)
}
require 'retab'
client = Retab::Client.new(api_key: ENV['RETAB_API_KEY'])
workflow_eval = client.workflows.evals.get(eval_id: 'wfnodeeval_hsLEQiM61ez9Piv147MWk')
puts workflow_eval.assertion.condition
puts workflow_eval.schema_drift
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 workflow_eval = client
.workflows().evals()
.get("wfnodeeval_hsLEQiM61ez9Piv147MWk")
.await?;
if let Some(assertion) = workflow_eval.assertion.as_ref() {
println!("{:?}", assertion.condition);
}
println!("{:?}", workflow_eval.schema_drift);
Ok(())
}
<?php
require 'vendor/autoload.php';
use Retab\Client;
$client = new Client(apiKey: getenv('RETAB_API_KEY'));
$result = $client->workflows()->evals()->get(
evalId: 'eval_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.Evals.GetAsync("eval_abc123");
Console.WriteLine(result);
import com.retab.RetabClient;
import com.retab.workflowevals.WorkflowEvalsApi;
public final class Example {
public static void main(String[] args) throws Exception {
RetabClient client = new RetabClient(System.getenv("RETAB_API_KEY"));
var result = new WorkflowEvalsApi(client).get("eval_abc123");
System.out.println(result);
}
}
curl -X 'GET' \
'https://api.retab.com/v1/workflows/evals/wfnodeeval_hsLEQiM61ez9Piv147MWk' \
-H 'accept: application/json' \
-H 'Authorization: Bearer <your-api-key>'
{
"id": "wfnodeeval_hsLEQiM61ez9Piv147MWk",
"workflow_id": "wf_abc123xyz",
"target": { "type": "block", "block_id": "block_extract_invoice" },
"source": {
"type": "manual",
"handle_inputs": {
"input-document-0": {
"type": "file",
"document": {
"id": "file_invoice_q1",
"filename": "invoice.pdf",
"mime_type": "application/pdf"
}
}
}
},
"name": "Q1 invoice total",
"assertion": {
"id": "assert_xyz",
"target": { "output_handle_id": "output-json-0", "path": "total" },
"condition": { "kind": "equals", "expected": 1234.56 },
"label": null
},
"schema_drift": "none",
"schema_drift_detail": null,
"validation_status": "valid",
"validation_issues": [],
"latest_run_summary": {
"run_record_id": "wfnodeevalrun_abc123",
"status": "completed",
"outcome": "passed",
"started_at": "2026-05-01T13:55:00Z",
"completed_at": "2026-05-01T13:55:18Z",
"duration_ms": 18221,
"workflow_draft_fingerprint": "ddd95baadce6045f",
"block_execution_fingerprint": "0ff93ddc7cefcb42",
"assertions_passed": 1,
"assertions_failed": 0,
"blocked_assertions": 0
},
"latest_passing_run_summary": { "...": "as above" },
"latest_failing_run_summary": null,
"created_at": "2026-04-08T14:22:26Z",
"updated_at": "2026-04-08T14:27:52Z"
}
{
"detail": "Workflow eval not found: wfnodeeval_hsLEQiM61ez9Piv147MWk"
}
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Response
Successful Response
A saved workflow eval: a target block, an input source, and the assertion evaluated against its output.
Public workflow-eval target.
The storage layer remains block-scoped today, but the API shape names the tested entity explicitly so workflow-level targets can be added later.
Show child attributes
Show child attributes
- ManualWorkflowEvalSource
- RunStepWorkflowEvalSource
Show child attributes
Show child attributes
Block-eval assertion against one declared output handle.
target is the only supported shape: an output handle id and an
optional relative path inside that handle's payload.
Show child attributes
Show child attributes
Single-rule schema dependency for Level 2 drift detection.
Show child attributes
Show child attributes
valid, drifted, broken none, partial, drifted, unknown Show child attributes
Show child attributes
Show child attributes
Show child attributes
Summary of the most recent block-eval run.
Execution status and verdict outcome are exposed as separate fields.
The summary is written on terminal-state transitions, so in practice
status is one of completed | error | cancelled and outcome is
populated when status == "completed".
Show child attributes
Show child attributes
Summary of the most recent block-eval run.
Execution status and verdict outcome are exposed as separate fields.
The summary is written on terminal-state transitions, so in practice
status is one of completed | error | cancelled and outcome is
populated when status == "completed".
Show child attributes
Show child attributes
Summary of the most recent block-eval run.
Execution status and verdict outcome are exposed as separate fields.
The summary is written on terminal-state transitions, so in practice
status is one of completed | error | cancelled and outcome is
populated when status == "completed".
Show child attributes
Show child attributes
When the workflow eval was created
When the workflow eval was last updated