from retab import Retab
client = Retab()
result = client.workflows.reviews.approve(
"rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY",
version_id="rvr_PFBGO3R6T3PG5O37U4Y3NDXWAM",
)
print(result.review.decision.verdict)
import { Retab } from "@retab/node";
const client = new Retab({ apiKey: process.env.RETAB_API_KEY });
const result = await client.workflows.reviews.approve("rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY", "rvr_PFBGO3R6T3PG5O37U4Y3NDXWAM");
console.log(result.review.decision?.verdict);
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)
}
result, err := client.Workflows.Reviews.Approve(ctx, "rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY", &retab.WorkflowReviewsApproveParams{
VersionID: "rvr_PFBGO3R6T3PG5O37U4Y3NDXWAM",
})
if err != nil {
log.Fatal(err)
}
if result.Review.Decision != nil {
fmt.Println(result.Review.Decision.Verdict)
}
}
use retab::models::ApproveReviewRequest;
use retab::resources::workflow_reviews::ApproveParams;
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 body = ApproveReviewRequest::new("rvr_PFBGO3R6T3PG5O37U4Y3NDXWAM");
let result = client
.workflows().reviews()
.approve(
"rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY",
ApproveParams::new(body),
)
.await?;
if let Some(decision) = result.review.decision.as_ref() {
println!("{:?}", decision.verdict);
}
Ok(())
}
<?php
require 'vendor/autoload.php';
use Retab\Client;
$client = new Client(apiKey: getenv('RETAB_API_KEY'));
$result = $client->workflows()->reviews()->approve(
reviewId: 'rev_abc123',
versionId: 'ver_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.ApproveAsync(
"rev_abc123",
new WorkflowReviewsApproveOptions { VersionId = "ver_abc123" }
);
Console.WriteLine(result);
require 'retab'
client = Retab::Client.new(api_key: ENV['RETAB_API_KEY'])
result = client.workflows.reviews.approve(
review_id: 'rev_abc123',
version_id: 'ver_abc123',
)
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().approve("review_abc123", "version_abc123");
System.out.println(result);
}
}
curl -X POST \
'https://api.retab.com/v1/workflows/reviews/rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY/approve' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <your-api-key>' \
-d '{ "version_id": "rvr_PFBGO3R6T3PG5O37U4Y3NDXWAM" }'
{
"submission_status": "accepted",
"resume_status": "resumed",
"resume_error": null,
"review": {
"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",
"block_type": "extract",
"triggered_by": { "kind": "always" },
"created_at": "2026-05-13T08:14:02.341Z",
"decision": {
"verdict": "approved",
"version_id": "rvr_PFBGO3R6T3PG5O37U4Y3NDXWAM",
"author": { "kind": "human", "id": "user_42", "display_name": "Dana Rivera" },
"reason": null,
"created_at": "2026-05-13T09:10:00.000Z"
}
}
}
Approve Review
Approve one review version and resume the workflow run.
The response carries resume_status so callers can see whether the run
resumed successfully.
from retab import Retab
client = Retab()
result = client.workflows.reviews.approve(
"rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY",
version_id="rvr_PFBGO3R6T3PG5O37U4Y3NDXWAM",
)
print(result.review.decision.verdict)
import { Retab } from "@retab/node";
const client = new Retab({ apiKey: process.env.RETAB_API_KEY });
const result = await client.workflows.reviews.approve("rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY", "rvr_PFBGO3R6T3PG5O37U4Y3NDXWAM");
console.log(result.review.decision?.verdict);
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)
}
result, err := client.Workflows.Reviews.Approve(ctx, "rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY", &retab.WorkflowReviewsApproveParams{
VersionID: "rvr_PFBGO3R6T3PG5O37U4Y3NDXWAM",
})
if err != nil {
log.Fatal(err)
}
if result.Review.Decision != nil {
fmt.Println(result.Review.Decision.Verdict)
}
}
use retab::models::ApproveReviewRequest;
use retab::resources::workflow_reviews::ApproveParams;
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 body = ApproveReviewRequest::new("rvr_PFBGO3R6T3PG5O37U4Y3NDXWAM");
let result = client
.workflows().reviews()
.approve(
"rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY",
ApproveParams::new(body),
)
.await?;
if let Some(decision) = result.review.decision.as_ref() {
println!("{:?}", decision.verdict);
}
Ok(())
}
<?php
require 'vendor/autoload.php';
use Retab\Client;
$client = new Client(apiKey: getenv('RETAB_API_KEY'));
$result = $client->workflows()->reviews()->approve(
reviewId: 'rev_abc123',
versionId: 'ver_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.ApproveAsync(
"rev_abc123",
new WorkflowReviewsApproveOptions { VersionId = "ver_abc123" }
);
Console.WriteLine(result);
require 'retab'
client = Retab::Client.new(api_key: ENV['RETAB_API_KEY'])
result = client.workflows.reviews.approve(
review_id: 'rev_abc123',
version_id: 'ver_abc123',
)
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().approve("review_abc123", "version_abc123");
System.out.println(result);
}
}
curl -X POST \
'https://api.retab.com/v1/workflows/reviews/rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY/approve' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <your-api-key>' \
-d '{ "version_id": "rvr_PFBGO3R6T3PG5O37U4Y3NDXWAM" }'
{
"submission_status": "accepted",
"resume_status": "resumed",
"resume_error": null,
"review": {
"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",
"block_type": "extract",
"triggered_by": { "kind": "always" },
"created_at": "2026-05-13T08:14:02.341Z",
"decision": {
"verdict": "approved",
"version_id": "rvr_PFBGO3R6T3PG5O37U4Y3NDXWAM",
"author": { "kind": "human", "id": "user_42", "display_name": "Dana Rivera" },
"reason": null,
"created_at": "2026-05-13T09:10:00.000Z"
}
}
}
from retab import Retab
client = Retab()
result = client.workflows.reviews.approve(
"rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY",
version_id="rvr_PFBGO3R6T3PG5O37U4Y3NDXWAM",
)
print(result.review.decision.verdict)
import { Retab } from "@retab/node";
const client = new Retab({ apiKey: process.env.RETAB_API_KEY });
const result = await client.workflows.reviews.approve("rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY", "rvr_PFBGO3R6T3PG5O37U4Y3NDXWAM");
console.log(result.review.decision?.verdict);
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)
}
result, err := client.Workflows.Reviews.Approve(ctx, "rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY", &retab.WorkflowReviewsApproveParams{
VersionID: "rvr_PFBGO3R6T3PG5O37U4Y3NDXWAM",
})
if err != nil {
log.Fatal(err)
}
if result.Review.Decision != nil {
fmt.Println(result.Review.Decision.Verdict)
}
}
use retab::models::ApproveReviewRequest;
use retab::resources::workflow_reviews::ApproveParams;
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 body = ApproveReviewRequest::new("rvr_PFBGO3R6T3PG5O37U4Y3NDXWAM");
let result = client
.workflows().reviews()
.approve(
"rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY",
ApproveParams::new(body),
)
.await?;
if let Some(decision) = result.review.decision.as_ref() {
println!("{:?}", decision.verdict);
}
Ok(())
}
<?php
require 'vendor/autoload.php';
use Retab\Client;
$client = new Client(apiKey: getenv('RETAB_API_KEY'));
$result = $client->workflows()->reviews()->approve(
reviewId: 'rev_abc123',
versionId: 'ver_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.ApproveAsync(
"rev_abc123",
new WorkflowReviewsApproveOptions { VersionId = "ver_abc123" }
);
Console.WriteLine(result);
require 'retab'
client = Retab::Client.new(api_key: ENV['RETAB_API_KEY'])
result = client.workflows.reviews.approve(
review_id: 'rev_abc123',
version_id: 'ver_abc123',
)
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().approve("review_abc123", "version_abc123");
System.out.println(result);
}
}
curl -X POST \
'https://api.retab.com/v1/workflows/reviews/rev_D4J7WZBRV4H7C2SKQJ4NP6W2EY/approve' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <your-api-key>' \
-d '{ "version_id": "rvr_PFBGO3R6T3PG5O37U4Y3NDXWAM" }'
{
"submission_status": "accepted",
"resume_status": "resumed",
"resume_error": null,
"review": {
"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",
"block_type": "extract",
"triggered_by": { "kind": "always" },
"created_at": "2026-05-13T08:14:02.341Z",
"decision": {
"verdict": "approved",
"version_id": "rvr_PFBGO3R6T3PG5O37U4Y3NDXWAM",
"author": { "kind": "human", "id": "user_42", "display_name": "Dana Rivera" },
"reason": null,
"created_at": "2026-05-13T09:10:00.000Z"
}
}
}
/v1/workflows/reviews/versions. Use
List Versions to fetch
them.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Body
Approve a specific version of a review.
Exact content-addressed key of the version to approve.
^rvr_[A-Z2-7]{26}$Version ids the caller has seen and is deliberately superseding. A review's versions form a lineage; deciding (or parenting on) a version that is not its only latest version discards every other latest version, so the server refuses that write with a 409 unless every discarded id is listed here. Leave empty unless you are intentionally rolling back to an earlier version or choosing one arm of a forked lineage. The 409 detail names the exact ids to pass.
Response
Successful Response
Response to a review approve or reject request.
Carries resume_status so callers can see whether the run resumed
successfully.
One review and its current decision.
Show child attributes
Show child attributes
accepted, already_applied, conflict resumed, pending, failed, skipped