from retab import Retab
client = Retab()
review = client.workflows.reviews.get("rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY")
print(review.id, review.run_id, review.block_id)
if review.decision:
print(review.decision.verdict, review.decision.version_id)
import { Retab } from "@retab/node";
const client = new Retab({ apiKey: process.env.RETAB_API_KEY });
const review = await client.workflows.reviews.get(
"rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY",
);
console.log(review.id, review.runId, review.blockId);
if (review.decision) {
console.log(review.decision.verdict, review.decision.versionId);
}
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)
}
review, err := client.Workflows.Reviews.Get(ctx, "rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY")
if err != nil {
log.Fatal(err)
}
fmt.Println(review.ID, review.RunID, review.BlockID)
if review.Decision != nil {
fmt.Println(review.Decision.Verdict, review.Decision.VersionID)
}
}
require 'retab'
client = Retab::Client.new(api_key: ENV['RETAB_API_KEY'])
review = client.workflows.reviews.get(review_id: 'rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY')
puts "#{review.id} #{review.run_id} #{review.block_id}"
if review.decision
puts "#{review.decision.verdict} #{review.decision.version_id}"
end
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 review = client
.workflows().reviews()
.get("rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY")
.await?;
println!("{} {} {}", review.id, review.run_id, review.block_id);
if let Some(decision) = review.decision.as_ref() {
println!("{:?} {}", decision.verdict, decision.version_id);
}
Ok(())
}
<?php
require 'vendor/autoload.php';
use Retab\Client;
$client = new Client(apiKey: getenv('RETAB_API_KEY'));
$result = $client->workflows()->reviews()->get(
reviewId: 'rev_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.Reviews.GetAsync("rev_abc123");
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().reviews().get("review_abc123");
System.out.println(result);
}
}
curl -X GET \
'https://api.retab.com/v1/workflows/reviews/rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY' \
-H 'Authorization: Bearer <your-api-key>'
{
"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
}
Reviews
Get Review
Read one review’s metadata + decision. Versions are fetched separately.
GET
/
v1
/
workflows
/
reviews
/
{review_id}
from retab import Retab
client = Retab()
review = client.workflows.reviews.get("rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY")
print(review.id, review.run_id, review.block_id)
if review.decision:
print(review.decision.verdict, review.decision.version_id)
import { Retab } from "@retab/node";
const client = new Retab({ apiKey: process.env.RETAB_API_KEY });
const review = await client.workflows.reviews.get(
"rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY",
);
console.log(review.id, review.runId, review.blockId);
if (review.decision) {
console.log(review.decision.verdict, review.decision.versionId);
}
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)
}
review, err := client.Workflows.Reviews.Get(ctx, "rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY")
if err != nil {
log.Fatal(err)
}
fmt.Println(review.ID, review.RunID, review.BlockID)
if review.Decision != nil {
fmt.Println(review.Decision.Verdict, review.Decision.VersionID)
}
}
require 'retab'
client = Retab::Client.new(api_key: ENV['RETAB_API_KEY'])
review = client.workflows.reviews.get(review_id: 'rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY')
puts "#{review.id} #{review.run_id} #{review.block_id}"
if review.decision
puts "#{review.decision.verdict} #{review.decision.version_id}"
end
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 review = client
.workflows().reviews()
.get("rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY")
.await?;
println!("{} {} {}", review.id, review.run_id, review.block_id);
if let Some(decision) = review.decision.as_ref() {
println!("{:?} {}", decision.verdict, decision.version_id);
}
Ok(())
}
<?php
require 'vendor/autoload.php';
use Retab\Client;
$client = new Client(apiKey: getenv('RETAB_API_KEY'));
$result = $client->workflows()->reviews()->get(
reviewId: 'rev_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.Reviews.GetAsync("rev_abc123");
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().reviews().get("review_abc123");
System.out.println(result);
}
}
curl -X GET \
'https://api.retab.com/v1/workflows/reviews/rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY' \
-H 'Authorization: Bearer <your-api-key>'
{
"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
}
Get one full review by opaque review id.
from retab import Retab
client = Retab()
review = client.workflows.reviews.get("rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY")
print(review.id, review.run_id, review.block_id)
if review.decision:
print(review.decision.verdict, review.decision.version_id)
import { Retab } from "@retab/node";
const client = new Retab({ apiKey: process.env.RETAB_API_KEY });
const review = await client.workflows.reviews.get(
"rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY",
);
console.log(review.id, review.runId, review.blockId);
if (review.decision) {
console.log(review.decision.verdict, review.decision.versionId);
}
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)
}
review, err := client.Workflows.Reviews.Get(ctx, "rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY")
if err != nil {
log.Fatal(err)
}
fmt.Println(review.ID, review.RunID, review.BlockID)
if review.Decision != nil {
fmt.Println(review.Decision.Verdict, review.Decision.VersionID)
}
}
require 'retab'
client = Retab::Client.new(api_key: ENV['RETAB_API_KEY'])
review = client.workflows.reviews.get(review_id: 'rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY')
puts "#{review.id} #{review.run_id} #{review.block_id}"
if review.decision
puts "#{review.decision.verdict} #{review.decision.version_id}"
end
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 review = client
.workflows().reviews()
.get("rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY")
.await?;
println!("{} {} {}", review.id, review.run_id, review.block_id);
if let Some(decision) = review.decision.as_ref() {
println!("{:?} {}", decision.verdict, decision.version_id);
}
Ok(())
}
<?php
require 'vendor/autoload.php';
use Retab\Client;
$client = new Client(apiKey: getenv('RETAB_API_KEY'));
$result = $client->workflows()->reviews()->get(
reviewId: 'rev_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.Reviews.GetAsync("rev_abc123");
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().reviews().get("review_abc123");
System.out.println(result);
}
}
curl -X GET \
'https://api.retab.com/v1/workflows/reviews/rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY' \
-H 'Authorization: Bearer <your-api-key>'
{
"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
}
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Response
Successful Response
One review and its current decision.
Available options:
extract, split, classifier, for_each Gate every run.
- ReviewAlways
- ReviewValidationFailed
- ReviewConfidenceLt
- ReviewCategoryIn
- ReviewTopMarginLt
- ReviewSplitCountNeq
- ReviewAnySplitPagesLt
- ReviewBoundaryConfidenceLt
- ReviewAnyPagesUnassigned
- ReviewAnyRequiredFieldNull
- ReviewJsonCondition
- ReviewBranchIn
- ReviewAnyOf
- ReviewAllOf
Show child attributes
Show child attributes
When the review was created.
The terminal decision recorded against one review version.
Show child attributes
Show child attributes
When the review's run was cancelled while the review was still undecided, or null.