from retab import Retab
client = Retab()
# Export every successful run's extract output
export = client.workflows.runs.export(
workflow_id="wf_abc123xyz",
block_id="extract-1",
export_source="outputs",
status="completed",
from_date="2026-04-01",
to_date="2026-04-30",
preferred_columns=["invoice_number", "total", "vendor.name"],
)
print(f"{export.rows} rows, {export.columns} columns")
with open("invoices.csv", "w") as f:
f.write(export.csv_data)
# Export a hand-picked set of runs
export = client.workflows.runs.export(
workflow_id="wf_abc123xyz",
block_id="extract-1",
selected_run_ids=["run_abc123", "run_def456"],
)
import { Retab } from "@retab/node";
import { writeFileSync } from "node:fs";
const client = new Retab({ apiKey: process.env.RETAB_API_KEY });
const exportResult = await client.workflows.runs.export("wf_abc123xyz", "extract-1", "outputs", undefined, undefined, "completed", undefined, "2026-04-01", "2026-04-30", undefined, ["invoice_number", "total", "vendor.name"]);
console.log(`${exportResult.rows} rows, ${exportResult.columns} columns`);
writeFileSync("invoices.csv", exportResult.csvData);
package main
import (
"context"
"fmt"
"log"
"os"
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)
}
exportResult, err := client.Workflows.Runs.Export(ctx, &retab.WorkflowRunsExportParams{
WorkflowID: "wf_abc123xyz",
BlockID: "extract-1",
ExportSource: ptr(retab.WorkflowExportPayloadRequestExportSourceOutputs),
Status: ptr(retab.WorkflowExportPayloadRequestExcludeStatusCompleted),
FromDate: ptr("2026-04-01"),
ToDate: ptr("2026-04-30"),
PreferredColumns: []string{"invoice_number", "total", "vendor.name"},
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("%d rows, %d columns\n", exportResult.Rows, exportResult.Columns)
if err := os.WriteFile("invoices.csv", []byte(exportResult.CsvData), 0o644); err != nil {
log.Fatal(err)
}
}
require 'retab'
client = Retab::Client.new(api_key: ENV['RETAB_API_KEY'])
export = client.workflows.runs.export(
workflow_id: 'wf_abc123xyz',
block_id: 'extract-1',
export_source: 'outputs',
status: 'completed',
from_date: '2026-04-01',
to_date: '2026-04-30',
preferred_columns: ['invoice_number', 'total', 'vendor.name'],
)
puts "#{export.rows} rows, #{export.columns} columns"
File.write('invoices.csv', export.csv_data)
use retab::enums::{WorkflowExportPayloadRequestExportSource, WorkflowExportPayloadRequestStatus};
use retab::models::WorkflowExportPayloadRequest;
use retab::resources::workflow_runs::ExportParams;
use retab::Retab;
use std::fs::write;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = Retab::new(std::env::var("RETAB_API_KEY")?);
let mut body = WorkflowExportPayloadRequest::new("wf_abc123xyz", "extract-1");
body.export_source = Some(WorkflowExportPayloadRequestExportSource::Outputs);
body.status = Some(WorkflowExportPayloadRequestStatus::Completed);
body.from_date = Some("2026-04-01".into());
body.to_date = Some("2026-04-30".into());
body.preferred_columns = Some(vec![
"invoice_number".into(),
"total".into(),
"vendor.name".into(),
]);
let export = client
.workflows().runs()
.export(ExportParams::new(body))
.await?;
println!("{} rows, {} columns", export.rows, export.columns);
write("invoices.csv", export.csv_data)?;
Ok(())
}
<?php
require 'vendor/autoload.php';
use Retab\Client;
$client = new Client(apiKey: getenv('RETAB_API_KEY'));
$result = $client->workflows()->runs()->export(
workflowId: 'wf_abc123',
blockId: 'blk_extract_1',
);
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.Runs.ExportAsync(new WorkflowRunsExportOptions());
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().runs().export("wf_abc123", "block_abc123", null, null, null, null, null, null, null, null, null, null, null, null);
System.out.println(result);
}
}
curl -X 'POST' \
'https://api.retab.com/v1/workflows/runs/export' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <your-api-key>' \
-d '{
"workflow_id": "wf_abc123xyz",
"block_id": "extract-1",
"export_source": "outputs",
"status": "completed",
"from_date": "2026-04-01",
"to_date": "2026-04-30",
"preferred_columns": ["invoice_number", "total", "vendor.name"]
}'
{
"csv_data": "run_id,invoice_number,total,vendor.name\nrun_abc123,INV-2026-001,1234.56,Acme Corp\nrun_def456,INV-2026-002,987.00,Globex\n",
"rows": 2,
"columns": 4
}
{
"detail": "Block extract-1 has no exportable outputs"
}
{
"detail": "Workflow not found"
}
Export Runs
Build CSV content for workflow run exports.
from retab import Retab
client = Retab()
# Export every successful run's extract output
export = client.workflows.runs.export(
workflow_id="wf_abc123xyz",
block_id="extract-1",
export_source="outputs",
status="completed",
from_date="2026-04-01",
to_date="2026-04-30",
preferred_columns=["invoice_number", "total", "vendor.name"],
)
print(f"{export.rows} rows, {export.columns} columns")
with open("invoices.csv", "w") as f:
f.write(export.csv_data)
# Export a hand-picked set of runs
export = client.workflows.runs.export(
workflow_id="wf_abc123xyz",
block_id="extract-1",
selected_run_ids=["run_abc123", "run_def456"],
)
import { Retab } from "@retab/node";
import { writeFileSync } from "node:fs";
const client = new Retab({ apiKey: process.env.RETAB_API_KEY });
const exportResult = await client.workflows.runs.export("wf_abc123xyz", "extract-1", "outputs", undefined, undefined, "completed", undefined, "2026-04-01", "2026-04-30", undefined, ["invoice_number", "total", "vendor.name"]);
console.log(`${exportResult.rows} rows, ${exportResult.columns} columns`);
writeFileSync("invoices.csv", exportResult.csvData);
package main
import (
"context"
"fmt"
"log"
"os"
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)
}
exportResult, err := client.Workflows.Runs.Export(ctx, &retab.WorkflowRunsExportParams{
WorkflowID: "wf_abc123xyz",
BlockID: "extract-1",
ExportSource: ptr(retab.WorkflowExportPayloadRequestExportSourceOutputs),
Status: ptr(retab.WorkflowExportPayloadRequestExcludeStatusCompleted),
FromDate: ptr("2026-04-01"),
ToDate: ptr("2026-04-30"),
PreferredColumns: []string{"invoice_number", "total", "vendor.name"},
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("%d rows, %d columns\n", exportResult.Rows, exportResult.Columns)
if err := os.WriteFile("invoices.csv", []byte(exportResult.CsvData), 0o644); err != nil {
log.Fatal(err)
}
}
require 'retab'
client = Retab::Client.new(api_key: ENV['RETAB_API_KEY'])
export = client.workflows.runs.export(
workflow_id: 'wf_abc123xyz',
block_id: 'extract-1',
export_source: 'outputs',
status: 'completed',
from_date: '2026-04-01',
to_date: '2026-04-30',
preferred_columns: ['invoice_number', 'total', 'vendor.name'],
)
puts "#{export.rows} rows, #{export.columns} columns"
File.write('invoices.csv', export.csv_data)
use retab::enums::{WorkflowExportPayloadRequestExportSource, WorkflowExportPayloadRequestStatus};
use retab::models::WorkflowExportPayloadRequest;
use retab::resources::workflow_runs::ExportParams;
use retab::Retab;
use std::fs::write;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = Retab::new(std::env::var("RETAB_API_KEY")?);
let mut body = WorkflowExportPayloadRequest::new("wf_abc123xyz", "extract-1");
body.export_source = Some(WorkflowExportPayloadRequestExportSource::Outputs);
body.status = Some(WorkflowExportPayloadRequestStatus::Completed);
body.from_date = Some("2026-04-01".into());
body.to_date = Some("2026-04-30".into());
body.preferred_columns = Some(vec![
"invoice_number".into(),
"total".into(),
"vendor.name".into(),
]);
let export = client
.workflows().runs()
.export(ExportParams::new(body))
.await?;
println!("{} rows, {} columns", export.rows, export.columns);
write("invoices.csv", export.csv_data)?;
Ok(())
}
<?php
require 'vendor/autoload.php';
use Retab\Client;
$client = new Client(apiKey: getenv('RETAB_API_KEY'));
$result = $client->workflows()->runs()->export(
workflowId: 'wf_abc123',
blockId: 'blk_extract_1',
);
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.Runs.ExportAsync(new WorkflowRunsExportOptions());
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().runs().export("wf_abc123", "block_abc123", null, null, null, null, null, null, null, null, null, null, null, null);
System.out.println(result);
}
}
curl -X 'POST' \
'https://api.retab.com/v1/workflows/runs/export' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <your-api-key>' \
-d '{
"workflow_id": "wf_abc123xyz",
"block_id": "extract-1",
"export_source": "outputs",
"status": "completed",
"from_date": "2026-04-01",
"to_date": "2026-04-30",
"preferred_columns": ["invoice_number", "total", "vendor.name"]
}'
{
"csv_data": "run_id,invoice_number,total,vendor.name\nrun_abc123,INV-2026-001,1234.56,Acme Corp\nrun_def456,INV-2026-002,987.00,Globex\n",
"rows": 2,
"columns": 4
}
{
"detail": "Block extract-1 has no exportable outputs"
}
{
"detail": "Workflow not found"
}
- Which workflow + which block to export (
workflow_id,block_id). - What to export for that block (
export_source):"outputs"(default) — what the block produced."inputs"— what the block received.
- Which runs to include — either a fixed list (
selected_run_ids) or all runs that match the filters (status,exclude_status,from_date,to_date,trigger_type). - Column ordering via
preferred_columns. Columns you don’t list still appear, in the order the block emits them.
from retab import Retab
client = Retab()
# Export every successful run's extract output
export = client.workflows.runs.export(
workflow_id="wf_abc123xyz",
block_id="extract-1",
export_source="outputs",
status="completed",
from_date="2026-04-01",
to_date="2026-04-30",
preferred_columns=["invoice_number", "total", "vendor.name"],
)
print(f"{export.rows} rows, {export.columns} columns")
with open("invoices.csv", "w") as f:
f.write(export.csv_data)
# Export a hand-picked set of runs
export = client.workflows.runs.export(
workflow_id="wf_abc123xyz",
block_id="extract-1",
selected_run_ids=["run_abc123", "run_def456"],
)
import { Retab } from "@retab/node";
import { writeFileSync } from "node:fs";
const client = new Retab({ apiKey: process.env.RETAB_API_KEY });
const exportResult = await client.workflows.runs.export("wf_abc123xyz", "extract-1", "outputs", undefined, undefined, "completed", undefined, "2026-04-01", "2026-04-30", undefined, ["invoice_number", "total", "vendor.name"]);
console.log(`${exportResult.rows} rows, ${exportResult.columns} columns`);
writeFileSync("invoices.csv", exportResult.csvData);
package main
import (
"context"
"fmt"
"log"
"os"
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)
}
exportResult, err := client.Workflows.Runs.Export(ctx, &retab.WorkflowRunsExportParams{
WorkflowID: "wf_abc123xyz",
BlockID: "extract-1",
ExportSource: ptr(retab.WorkflowExportPayloadRequestExportSourceOutputs),
Status: ptr(retab.WorkflowExportPayloadRequestExcludeStatusCompleted),
FromDate: ptr("2026-04-01"),
ToDate: ptr("2026-04-30"),
PreferredColumns: []string{"invoice_number", "total", "vendor.name"},
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("%d rows, %d columns\n", exportResult.Rows, exportResult.Columns)
if err := os.WriteFile("invoices.csv", []byte(exportResult.CsvData), 0o644); err != nil {
log.Fatal(err)
}
}
require 'retab'
client = Retab::Client.new(api_key: ENV['RETAB_API_KEY'])
export = client.workflows.runs.export(
workflow_id: 'wf_abc123xyz',
block_id: 'extract-1',
export_source: 'outputs',
status: 'completed',
from_date: '2026-04-01',
to_date: '2026-04-30',
preferred_columns: ['invoice_number', 'total', 'vendor.name'],
)
puts "#{export.rows} rows, #{export.columns} columns"
File.write('invoices.csv', export.csv_data)
use retab::enums::{WorkflowExportPayloadRequestExportSource, WorkflowExportPayloadRequestStatus};
use retab::models::WorkflowExportPayloadRequest;
use retab::resources::workflow_runs::ExportParams;
use retab::Retab;
use std::fs::write;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = Retab::new(std::env::var("RETAB_API_KEY")?);
let mut body = WorkflowExportPayloadRequest::new("wf_abc123xyz", "extract-1");
body.export_source = Some(WorkflowExportPayloadRequestExportSource::Outputs);
body.status = Some(WorkflowExportPayloadRequestStatus::Completed);
body.from_date = Some("2026-04-01".into());
body.to_date = Some("2026-04-30".into());
body.preferred_columns = Some(vec![
"invoice_number".into(),
"total".into(),
"vendor.name".into(),
]);
let export = client
.workflows().runs()
.export(ExportParams::new(body))
.await?;
println!("{} rows, {} columns", export.rows, export.columns);
write("invoices.csv", export.csv_data)?;
Ok(())
}
<?php
require 'vendor/autoload.php';
use Retab\Client;
$client = new Client(apiKey: getenv('RETAB_API_KEY'));
$result = $client->workflows()->runs()->export(
workflowId: 'wf_abc123',
blockId: 'blk_extract_1',
);
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.Runs.ExportAsync(new WorkflowRunsExportOptions());
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().runs().export("wf_abc123", "block_abc123", null, null, null, null, null, null, null, null, null, null, null, null);
System.out.println(result);
}
}
curl -X 'POST' \
'https://api.retab.com/v1/workflows/runs/export' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <your-api-key>' \
-d '{
"workflow_id": "wf_abc123xyz",
"block_id": "extract-1",
"export_source": "outputs",
"status": "completed",
"from_date": "2026-04-01",
"to_date": "2026-04-30",
"preferred_columns": ["invoice_number", "total", "vendor.name"]
}'
{
"csv_data": "run_id,invoice_number,total,vendor.name\nrun_abc123,INV-2026-001,1234.56,Acme Corp\nrun_def456,INV-2026-002,987.00,Globex\n",
"rows": 2,
"columns": 4
}
{
"detail": "Block extract-1 has no exportable outputs"
}
{
"detail": "Workflow not found"
}
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
Body describing which block outputs (or inputs) across a workflow's runs to export as CSV, with optional run, doc-type, and status filters.
Workflow ID to export
Block ID to export
Use block outputs or inputs
outputs, inputs Run IDs filter (null means all runs)
Doc type filter (null/empty means all)
Optional status filter (intersects with completed-only export scope)
pending, queued, running, completed, error, failed, awaiting_review, cancelled Optional status exclusion filter (intersects with completed-only export scope)
pending, queued, running, completed, error, failed, awaiting_review, cancelled Optional start date filter (YYYY-MM-DD)
Optional end date filter (YYYY-MM-DD)
Optional trigger type filter
manual, api, schedule, webhook, email, restart Preferred data column order
CSV field delimiter. Default is ';' (the Excel EU-locale default); pass ',' for RFC 4180 compatibility. Cell values are always quoted when they contain the delimiter, the line terminator, or the quote character, with embedded quotes doubled per RFC 4180.
CSV line delimiter
CSV quote character