from retab import Retab
client = Retab()
queue = client.workflows.reviews.list(
workflow_id="wf_1",
decision_status="pending",
limit=50,
)
for item in queue.data:
print(item.id, item.run_id, item.block_id)
import { Retab } from "@retab/node";
const client = new Retab({ apiKey: process.env.RETAB_API_KEY });
const queue = await client.workflows.reviews.list({
workflowId: "wf_1",
decisionStatus: "pending",
limit: 50,
});
for (const item of queue.data) {
console.log(item.id, item.runId, item.blockId);
}
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)
}
queue, err := client.Workflows.Reviews.List(ctx, &retab.WorkflowReviewsListParams{
PaginationParams: retab.PaginationParams{Limit: ptr(50)},
WorkflowID: ptr("wf_1"),
DecisionStatus: ptr(retab.ReviewDecisionStatusPending),
})
if err != nil {
log.Fatal(err)
}
for _, item := range queue.Data {
fmt.Println(item.ID, item.RunID, item.BlockID)
}
}
use retab::enums::ReviewDecisionStatus;
use retab::resources::workflow_reviews::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 queue = client
.workflows().reviews()
.list(ListParams {
workflow_id: Some("wf_1".into()),
decision_status: Some(ReviewDecisionStatus::Pending),
limit: Some(50),
..Default::default()
})
.await?;
for item in &queue.data {
println!("{} {} {}", item.id, item.run_id, item.block_id);
}
Ok(())
}
<?php
require 'vendor/autoload.php';
use Retab\Client;
$client = new Client(apiKey: getenv('RETAB_API_KEY'));
$result = $client->workflows()->reviews()->list();
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.Reviews.ListAsync(new WorkflowReviewsListOptions());
Console.WriteLine(result);
require 'retab'
client = Retab::Client.new(api_key: ENV['RETAB_API_KEY'])
result = client.workflows.reviews.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().reviews().list("wf_abc123", "run_abc123", "block_abc123", "step_abc123", null, null, null, null, 10L, null);
System.out.println(result);
}
}
curl -X GET \
'https://api.retab.com/v1/workflows/reviews?workflow_id=wf_1&decision_status=pending&limit=50' \
-H 'Authorization: Bearer <your-api-key>'
{
"data": [
{
"id": "rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY",
"workflow_id": "wf_1",
"workflow_version_id": "wfv_1",
"run_id": "run_abc123",
"block_id": "block_extract",
"step_id": "run_abc123_block_extract",
"parent_step_id": null,
"iteration_key": null,
"block_type": "extract",
"triggered_by": { "kind": "always" },
"created_at": "2026-05-13T08:14:02.341Z",
"decision": null
}
],
"list_metadata": {
"before": null,
"after": null
}
}
List Reviews
List reviews — the review queue, oldest first by created_at.
from retab import Retab
client = Retab()
queue = client.workflows.reviews.list(
workflow_id="wf_1",
decision_status="pending",
limit=50,
)
for item in queue.data:
print(item.id, item.run_id, item.block_id)
import { Retab } from "@retab/node";
const client = new Retab({ apiKey: process.env.RETAB_API_KEY });
const queue = await client.workflows.reviews.list({
workflowId: "wf_1",
decisionStatus: "pending",
limit: 50,
});
for (const item of queue.data) {
console.log(item.id, item.runId, item.blockId);
}
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)
}
queue, err := client.Workflows.Reviews.List(ctx, &retab.WorkflowReviewsListParams{
PaginationParams: retab.PaginationParams{Limit: ptr(50)},
WorkflowID: ptr("wf_1"),
DecisionStatus: ptr(retab.ReviewDecisionStatusPending),
})
if err != nil {
log.Fatal(err)
}
for _, item := range queue.Data {
fmt.Println(item.ID, item.RunID, item.BlockID)
}
}
use retab::enums::ReviewDecisionStatus;
use retab::resources::workflow_reviews::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 queue = client
.workflows().reviews()
.list(ListParams {
workflow_id: Some("wf_1".into()),
decision_status: Some(ReviewDecisionStatus::Pending),
limit: Some(50),
..Default::default()
})
.await?;
for item in &queue.data {
println!("{} {} {}", item.id, item.run_id, item.block_id);
}
Ok(())
}
<?php
require 'vendor/autoload.php';
use Retab\Client;
$client = new Client(apiKey: getenv('RETAB_API_KEY'));
$result = $client->workflows()->reviews()->list();
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.Reviews.ListAsync(new WorkflowReviewsListOptions());
Console.WriteLine(result);
require 'retab'
client = Retab::Client.new(api_key: ENV['RETAB_API_KEY'])
result = client.workflows.reviews.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().reviews().list("wf_abc123", "run_abc123", "block_abc123", "step_abc123", null, null, null, null, 10L, null);
System.out.println(result);
}
}
curl -X GET \
'https://api.retab.com/v1/workflows/reviews?workflow_id=wf_1&decision_status=pending&limit=50' \
-H 'Authorization: Bearer <your-api-key>'
{
"data": [
{
"id": "rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY",
"workflow_id": "wf_1",
"workflow_version_id": "wfv_1",
"run_id": "run_abc123",
"block_id": "block_extract",
"step_id": "run_abc123_block_extract",
"parent_step_id": null,
"iteration_key": null,
"block_type": "extract",
"triggered_by": { "kind": "always" },
"created_at": "2026-05-13T08:14:02.341Z",
"decision": null
}
],
"list_metadata": {
"before": null,
"after": null
}
}
decision_status="pending" for the open review queue. Use approved, rejected, decided, or all for terminal-review views.
from retab import Retab
client = Retab()
queue = client.workflows.reviews.list(
workflow_id="wf_1",
decision_status="pending",
limit=50,
)
for item in queue.data:
print(item.id, item.run_id, item.block_id)
import { Retab } from "@retab/node";
const client = new Retab({ apiKey: process.env.RETAB_API_KEY });
const queue = await client.workflows.reviews.list({
workflowId: "wf_1",
decisionStatus: "pending",
limit: 50,
});
for (const item of queue.data) {
console.log(item.id, item.runId, item.blockId);
}
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)
}
queue, err := client.Workflows.Reviews.List(ctx, &retab.WorkflowReviewsListParams{
PaginationParams: retab.PaginationParams{Limit: ptr(50)},
WorkflowID: ptr("wf_1"),
DecisionStatus: ptr(retab.ReviewDecisionStatusPending),
})
if err != nil {
log.Fatal(err)
}
for _, item := range queue.Data {
fmt.Println(item.ID, item.RunID, item.BlockID)
}
}
use retab::enums::ReviewDecisionStatus;
use retab::resources::workflow_reviews::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 queue = client
.workflows().reviews()
.list(ListParams {
workflow_id: Some("wf_1".into()),
decision_status: Some(ReviewDecisionStatus::Pending),
limit: Some(50),
..Default::default()
})
.await?;
for item in &queue.data {
println!("{} {} {}", item.id, item.run_id, item.block_id);
}
Ok(())
}
<?php
require 'vendor/autoload.php';
use Retab\Client;
$client = new Client(apiKey: getenv('RETAB_API_KEY'));
$result = $client->workflows()->reviews()->list();
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.Reviews.ListAsync(new WorkflowReviewsListOptions());
Console.WriteLine(result);
require 'retab'
client = Retab::Client.new(api_key: ENV['RETAB_API_KEY'])
result = client.workflows.reviews.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().reviews().list("wf_abc123", "run_abc123", "block_abc123", "step_abc123", null, null, null, null, 10L, null);
System.out.println(result);
}
}
curl -X GET \
'https://api.retab.com/v1/workflows/reviews?workflow_id=wf_1&decision_status=pending&limit=50' \
-H 'Authorization: Bearer <your-api-key>'
{
"data": [
{
"id": "rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY",
"workflow_id": "wf_1",
"workflow_version_id": "wfv_1",
"run_id": "run_abc123",
"block_id": "block_extract",
"step_id": "run_abc123_block_extract",
"parent_step_id": null,
"iteration_key": null,
"block_type": "extract",
"triggered_by": { "kind": "always" },
"created_at": "2026-05-13T08:14:02.341Z",
"decision": null
}
],
"list_metadata": {
"before": null,
"after": null
}
}
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Query Parameters
Filter by decision state: pending, approved, rejected, decided, or all.
pending, approved, rejected, decided, all Cursor: only return reviews that appear before this review id in the result order. Use list_metadata.before from the previous page.
Cursor: only return reviews that appear after this review id in the result order. Use list_metadata.after from the previous page.
1 <= x <= 200Sort direction over created_at. 'asc' (default) returns the oldest reviews first; 'desc' returns the newest first. Cursor paging with before/after follows the chosen direction.
asc, desc Response
Successful Response
A page of WorkflowReview resources. data holds the items and list_metadata carries the before/after cursors; pass after to fetch the next page.