Skip to main content
POST
/
api
/
v1
/
runs
/
{id}
/
approve
Approve Run
curl --request POST \
  --url https://api.example.com/api/v1/runs/{id}/approve \
  --header 'Authorization: Bearer <token>'
import requests

url = "https://api.example.com/api/v1/runs/{id}/approve"

headers = {"Authorization": "Bearer <token>"}

response = requests.post(url, headers=headers)

print(response.text)
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};

fetch('https://api.example.com/api/v1/runs/{id}/approve', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/api/v1/runs/{id}/approve",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
package main

import (
"fmt"
"net/http"
"io"
)

func main() {

url := "https://api.example.com/api/v1/runs/{id}/approve"

req, _ := http.NewRequest("POST", url, nil)

req.Header.Add("Authorization", "Bearer <token>")

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.post("https://api.example.com/api/v1/runs/{id}/approve")
.header("Authorization", "Bearer <token>")
.asString();
require 'uri'
require 'net/http'

url = URI("https://api.example.com/api/v1/runs/{id}/approve")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
{
  "id": "<string>",
  "children_count": 1,
  "title": "<string>",
  "goal": "<string>",
  "workflow": {
    "slug": "<string>",
    "name": "<string>",
    "graph_name": "<string>",
    "node_count": 123,
    "edge_count": 123
  },
  "automation": {
    "id": "<string>",
    "name": "<string>",
    "trigger_id": "<string>"
  },
  "repository": {
    "name": "fabro-sh/fabro",
    "origin_url": "https://github.com/fabro-sh/fabro.git"
  },
  "created_by": {
    "kind": "user",
    "identity": {
      "issuer": "<string>",
      "subject": "<string>"
    },
    "login": "<string>",
    "avatar_url": "<string>"
  },
  "origin": {
    "kind": "api"
  },
  "labels": {},
  "lifecycle": {
    "status": {
      "kind": "submitted"
    },
    "approval": {
      "requested_at": "2023-11-07T05:31:56Z",
      "decided_at": "2023-11-07T05:31:56Z",
      "denial_reason": "<string>"
    },
    "queue_position": 123,
    "error": {
      "message": "Stage 'apply-changes' exceeded maximum retries."
    },
    "archived": true,
    "archived_at": "2023-11-07T05:31:56Z"
  },
  "sandbox": {
    "plan": {
      "image": "<string>",
      "snapshot": "<string>"
    },
    "instance": {
      "runtime": {
        "id": "<string>",
        "working_directory": "<string>",
        "repo_cloned": true,
        "clone_origin_url": "<string>",
        "clone_branch": "<string>",
        "workspace_root": "<string>",
        "repos_root": "<string>",
        "primary_repo_path": "<string>",
        "primary_repo_link": "<string>"
      },
      "image": "<string>",
      "snapshot": "<string>"
    },
    "failure": {
      "provider": "<string>",
      "error": "<string>",
      "causes": [
        "<string>"
      ],
      "duration_ms": 1
    }
  },
  "models": [
    {
      "provider": "<string>",
      "name": "<string>"
    }
  ],
  "source_directory": "<string>",
  "timestamps": {
    "created_at": "2023-11-07T05:31:56Z",
    "started_at": "2023-11-07T05:31:56Z",
    "last_event_at": "2023-11-07T05:31:56Z",
    "completed_at": "2023-11-07T05:31:56Z"
  },
  "timing": {
    "wall_time_ms": 420000,
    "active_time_ms": 180000,
    "inference_time_ms": 120000,
    "tool_time_ms": 60000
  },
  "billing": {
    "total_usd_micros": 123
  },
  "ask_fabro": {
    "available": true,
    "default_model": "<string>"
  },
  "diff": {
    "files_changed": 42,
    "additions": 567,
    "deletions": 234
  },
  "pull_request": {
    "owner": "fabro-sh",
    "repo": "fabro",
    "number": 123,
    "html_url": "https://github.com/fabro-sh/fabro/pull/123"
  },
  "current_question": {
    "text": "Accept or push for another round?"
  },
  "superseded_by": "<string>",
  "retried_from": "<string>",
  "links": {
    "web": "<string>"
  },
  "parent_id": "<string>"
}
{
"errors": [
{
"status": "404",
"title": "Not Found",
"detail": "Run not found.",
"code": "access_token_expired",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
],
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"leftover_env_keys": [
"<string>"
],
"removed_env_keys": [
"<string>"
]
}
{
"errors": [
{
"status": "404",
"title": "Not Found",
"detail": "Run not found.",
"code": "access_token_expired",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
],
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"leftover_env_keys": [
"<string>"
],
"removed_env_keys": [
"<string>"
]
}

Authorizations

Authorization
string
header
required

Raw dev token passed as Authorization: Bearer fabro_dev_... when server.auth.methods includes dev-token.

Path Parameters

id
string
required

Unique run identifier (ULID).

Response

Run approved

Canonical public run shape.

id
string
required
children_count
integer<uint64>
required

Number of runs currently linked to this run as their orchestration parent.

Required range: x >= 0
title
string
required
goal
string
required
workflow
object
required
automation
object | null
required
repository
object | null
required

Durable repository metadata for a run.

created_by
object
required
origin
object
required
labels
object
required
lifecycle
object
required
sandbox
object | null
required

Sandbox lifecycle record for a run. A run can have a requested sandbox plan before it has an initialized sandbox instance.

models
object[]
required
source_directory
string | null
required
timestamps
object
required
timing
object | null
required

Run-level timing rollup. Wall time is the run's clock duration; active timing sums work across stage visits.

billing
object | null
required
size
enum<string>
required

Run size bucket derived from current best-effort billed usage.

Available options:
XS,
S,
M,
L,
XL
ask_fabro
object
required

Readiness and defaults for starting an Ask Fabro session on this run.

diff
object | null
required

Cheap aggregate file and line counts for a run diff.

pull_request
object | null
required

Minimal GitHub pull request link associated with a run.

current_question
object | null
required

A pending human-in-the-loop question summary.

superseded_by
string | null
required

Run ID that superseded this run via rewind, if any.

retried_from
string | null
required

Source run ID when this run was created by manual retry.

parent_id
string | null

Current orchestration parent run ID, if linked.