from retab import Retab
client = Retab()
step = client.workflows.steps.get("step_extract_1")
print(step.lifecycle.status)
print(step.handle_outputs)
if step.handle_outputs:
payload = step.handle_outputs["output-json-0"]
print(payload.type)
print(payload.data)
import { Retab } from "@retab/node";
const client = new Retab({ apiKey: process.env.RETAB_API_KEY });
const step = await client.workflows.steps.get("step_extract_1");
console.log(`Step status: ${step.lifecycle.status}`);
const payload = step.handleOutputs["output-json-0"];
if (payload?.type === "json") {
console.log(payload.data);
}
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)
}
step, err := client.Workflows.Steps.Get(ctx, "step_extract_1", nil)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Step status: %v\n", step.Lifecycle.Status())
if payload, ok := step.HandleOutputs["output-json-0"]; ok {
fmt.Println(payload.Type)
fmt.Println(payload.Data)
}
}
require 'retab'
client = Retab::Client.new(api_key: ENV['RETAB_API_KEY'])
step = client.workflows.steps.get(step_id: 'step_extract_1')
puts step.lifecycle.status
puts step.handle_outputs
if step.handle_outputs
payload = step.handle_outputs['output-json-0']
puts payload.type
puts payload.data
end
use retab::resources::workflow_steps::GetParams;
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 step = client
.workflows().steps()
.get("step_extract_1", GetParams::default())
.await?;
println!("{:?}", step.lifecycle);
if let Some(outputs) = &step.handle_outputs {
if let Some(payload) = outputs.get("output-json-0") {
println!("{:?}", payload);
}
}
Ok(())
}
<?php
require 'vendor/autoload.php';
use Retab\Client;
$client = new Client(apiKey: getenv('RETAB_API_KEY'));
$result = $client->workflows()->steps()->get(
stepId: 'step_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.Steps.GetAsync("step_abc123", new WorkflowStepsGetOptions());
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().steps().get("step_abc123", "run_abc123");
System.out.println(result);
}
}
curl -X 'GET' \
'https://api.retab.com/v1/workflows/steps/step_extract_1' \
-H 'Authorization: Bearer <your-api-key>'
{
"step_id": "step_extract_1",
"run_id": "run_abc123xyz",
"block_id": "extract-block-1",
"block_type": "extract",
"block_label": "Extract Invoice",
"lifecycle": { "status": "completed" },
"started_at": "2026-05-18T10:00:00Z",
"completed_at": "2026-05-18T10:00:04Z",
"loop_containers": [],
"artifact": { "operation": "extraction", "id": "ext_abc123" },
"retry_count": 0,
"created_at": "2026-05-18T10:00:00Z",
"handle_outputs": {
"output-json-0": {
"type": "json",
"data": {
"invoice_number": "INV-2024-001",
"total_amount": 1234.56,
"vendor_name": "Acme Corp"
}
}
},
"handle_inputs": {
"input-file-0": {
"type": "file",
"document": {
"id": "file_123",
"filename": "invoice.pdf",
"mime_type": "application/pdf"
}
}
},
"model": null
}
{
"step_id": "step_extract_1",
"run_id": "run_abc123xyz",
"block_id": "extract-block-1",
"block_type": "extract",
"block_label": "Extract Invoice",
"lifecycle": { "status": "error", "message": "Model request failed" },
"started_at": "2026-05-18T10:00:00Z",
"completed_at": "2026-05-18T10:00:04Z",
"loop_containers": [],
"artifact": null,
"retry_count": 0,
"created_at": "2026-05-18T10:00:00Z",
"handle_outputs": {},
"handle_inputs": {},
"model": null
}
{
"detail": "Step 'step_extract_1' not found"
}
Get Step
Get one step by its step id.
Returns the same step shape as GET /workflows/steps.
from retab import Retab
client = Retab()
step = client.workflows.steps.get("step_extract_1")
print(step.lifecycle.status)
print(step.handle_outputs)
if step.handle_outputs:
payload = step.handle_outputs["output-json-0"]
print(payload.type)
print(payload.data)
import { Retab } from "@retab/node";
const client = new Retab({ apiKey: process.env.RETAB_API_KEY });
const step = await client.workflows.steps.get("step_extract_1");
console.log(`Step status: ${step.lifecycle.status}`);
const payload = step.handleOutputs["output-json-0"];
if (payload?.type === "json") {
console.log(payload.data);
}
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)
}
step, err := client.Workflows.Steps.Get(ctx, "step_extract_1", nil)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Step status: %v\n", step.Lifecycle.Status())
if payload, ok := step.HandleOutputs["output-json-0"]; ok {
fmt.Println(payload.Type)
fmt.Println(payload.Data)
}
}
require 'retab'
client = Retab::Client.new(api_key: ENV['RETAB_API_KEY'])
step = client.workflows.steps.get(step_id: 'step_extract_1')
puts step.lifecycle.status
puts step.handle_outputs
if step.handle_outputs
payload = step.handle_outputs['output-json-0']
puts payload.type
puts payload.data
end
use retab::resources::workflow_steps::GetParams;
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 step = client
.workflows().steps()
.get("step_extract_1", GetParams::default())
.await?;
println!("{:?}", step.lifecycle);
if let Some(outputs) = &step.handle_outputs {
if let Some(payload) = outputs.get("output-json-0") {
println!("{:?}", payload);
}
}
Ok(())
}
<?php
require 'vendor/autoload.php';
use Retab\Client;
$client = new Client(apiKey: getenv('RETAB_API_KEY'));
$result = $client->workflows()->steps()->get(
stepId: 'step_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.Steps.GetAsync("step_abc123", new WorkflowStepsGetOptions());
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().steps().get("step_abc123", "run_abc123");
System.out.println(result);
}
}
curl -X 'GET' \
'https://api.retab.com/v1/workflows/steps/step_extract_1' \
-H 'Authorization: Bearer <your-api-key>'
{
"step_id": "step_extract_1",
"run_id": "run_abc123xyz",
"block_id": "extract-block-1",
"block_type": "extract",
"block_label": "Extract Invoice",
"lifecycle": { "status": "completed" },
"started_at": "2026-05-18T10:00:00Z",
"completed_at": "2026-05-18T10:00:04Z",
"loop_containers": [],
"artifact": { "operation": "extraction", "id": "ext_abc123" },
"retry_count": 0,
"created_at": "2026-05-18T10:00:00Z",
"handle_outputs": {
"output-json-0": {
"type": "json",
"data": {
"invoice_number": "INV-2024-001",
"total_amount": 1234.56,
"vendor_name": "Acme Corp"
}
}
},
"handle_inputs": {
"input-file-0": {
"type": "file",
"document": {
"id": "file_123",
"filename": "invoice.pdf",
"mime_type": "application/pdf"
}
}
},
"model": null
}
{
"step_id": "step_extract_1",
"run_id": "run_abc123xyz",
"block_id": "extract-block-1",
"block_type": "extract",
"block_label": "Extract Invoice",
"lifecycle": { "status": "error", "message": "Model request failed" },
"started_at": "2026-05-18T10:00:00Z",
"completed_at": "2026-05-18T10:00:04Z",
"loop_containers": [],
"artifact": null,
"retry_count": 0,
"created_at": "2026-05-18T10:00:00Z",
"handle_outputs": {},
"handle_inputs": {},
"model": null
}
{
"detail": "Step 'step_extract_1' not found"
}
step_id. The response uses the same step
shape as List Steps: lifecycle, handle
payloads, artifact ref, and timing fields.
from retab import Retab
client = Retab()
step = client.workflows.steps.get("step_extract_1")
print(step.lifecycle.status)
print(step.handle_outputs)
if step.handle_outputs:
payload = step.handle_outputs["output-json-0"]
print(payload.type)
print(payload.data)
import { Retab } from "@retab/node";
const client = new Retab({ apiKey: process.env.RETAB_API_KEY });
const step = await client.workflows.steps.get("step_extract_1");
console.log(`Step status: ${step.lifecycle.status}`);
const payload = step.handleOutputs["output-json-0"];
if (payload?.type === "json") {
console.log(payload.data);
}
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)
}
step, err := client.Workflows.Steps.Get(ctx, "step_extract_1", nil)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Step status: %v\n", step.Lifecycle.Status())
if payload, ok := step.HandleOutputs["output-json-0"]; ok {
fmt.Println(payload.Type)
fmt.Println(payload.Data)
}
}
require 'retab'
client = Retab::Client.new(api_key: ENV['RETAB_API_KEY'])
step = client.workflows.steps.get(step_id: 'step_extract_1')
puts step.lifecycle.status
puts step.handle_outputs
if step.handle_outputs
payload = step.handle_outputs['output-json-0']
puts payload.type
puts payload.data
end
use retab::resources::workflow_steps::GetParams;
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 step = client
.workflows().steps()
.get("step_extract_1", GetParams::default())
.await?;
println!("{:?}", step.lifecycle);
if let Some(outputs) = &step.handle_outputs {
if let Some(payload) = outputs.get("output-json-0") {
println!("{:?}", payload);
}
}
Ok(())
}
<?php
require 'vendor/autoload.php';
use Retab\Client;
$client = new Client(apiKey: getenv('RETAB_API_KEY'));
$result = $client->workflows()->steps()->get(
stepId: 'step_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.Steps.GetAsync("step_abc123", new WorkflowStepsGetOptions());
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().steps().get("step_abc123", "run_abc123");
System.out.println(result);
}
}
curl -X 'GET' \
'https://api.retab.com/v1/workflows/steps/step_extract_1' \
-H 'Authorization: Bearer <your-api-key>'
{
"step_id": "step_extract_1",
"run_id": "run_abc123xyz",
"block_id": "extract-block-1",
"block_type": "extract",
"block_label": "Extract Invoice",
"lifecycle": { "status": "completed" },
"started_at": "2026-05-18T10:00:00Z",
"completed_at": "2026-05-18T10:00:04Z",
"loop_containers": [],
"artifact": { "operation": "extraction", "id": "ext_abc123" },
"retry_count": 0,
"created_at": "2026-05-18T10:00:00Z",
"handle_outputs": {
"output-json-0": {
"type": "json",
"data": {
"invoice_number": "INV-2024-001",
"total_amount": 1234.56,
"vendor_name": "Acme Corp"
}
}
},
"handle_inputs": {
"input-file-0": {
"type": "file",
"document": {
"id": "file_123",
"filename": "invoice.pdf",
"mime_type": "application/pdf"
}
}
},
"model": null
}
{
"step_id": "step_extract_1",
"run_id": "run_abc123xyz",
"block_id": "extract-block-1",
"block_type": "extract",
"block_label": "Extract Invoice",
"lifecycle": { "status": "error", "message": "Model request failed" },
"started_at": "2026-05-18T10:00:00Z",
"completed_at": "2026-05-18T10:00:04Z",
"loop_containers": [],
"artifact": null,
"retry_count": 0,
"created_at": "2026-05-18T10:00:00Z",
"handle_outputs": {},
"handle_inputs": {},
"model": null
}
{
"detail": "Step 'step_extract_1' not found"
}
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Query Parameters
Optional workflow run ID disambiguator.
Response
Successful Response
Public step status object.
Logical ID of the block
Full step ID with iteration context. Assigned ONCE at creation, never recomputed.
Type of the block
start_document, start_json, note, parse, edit, extract, split, classifier, conditional, api_call, function, while_loop, for_each, merge_dicts, while_loop_sentinel_start, while_loop_sentinel_end, for_each_sentinel_start, for_each_sentinel_end Label of the block
The step has been created but execution has not started.
- PendingStepLifecycle
- QueuedStepLifecycle
- RunningStepLifecycle
- CompletedStepLifecycle
- AwaitingReviewStepLifecycle
- ErrorStepLifecycle
- SkippedStepLifecycle
- CancelledStepLifecycle
Show child attributes
Show child attributes
Parent workflow run ID
When the step started executing
When the step finished executing
LLM model used by this step, when applicable
Container hierarchy from outermost to innermost. Empty when not inside any container.
Show child attributes
Show child attributes
When the step was created
Handle input payloads consumed by this step
Show child attributes
Show child attributes
Handle output payloads produced by this step
Show child attributes
Show child attributes
Reference to the result produced by this step, if any.
Show child attributes
Show child attributes
Number of retry attempts