AI bots
Read an approval
One approval, with its request body and whether you may decide it, for its card in the app. Only someone in the conversation the card is in who holds every permission the bot’s run used reads it; to anyone else it answers 404.
Needs the we_bots.view permission.
GET
/
api
/
company
/
v2026-10
/
bot-approvals
/
{approval_id}
Read an approval
curl --request GET \
--url https://api.fluid.app/api/company/v2026-10/bot-approvals/{approval_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/company/v2026-10/bot-approvals/{approval_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.fluid.app/api/company/v2026-10/bot-approvals/{approval_id}', 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.fluid.app/api/company/v2026-10/bot-approvals/{approval_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
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.fluid.app/api/company/v2026-10/bot-approvals/{approval_id}"
req, _ := http.NewRequest("GET", 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.get("https://api.fluid.app/api/company/v2026-10/bot-approvals/{approval_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/company/v2026-10/bot-approvals/{approval_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"approval": {
"id": "0199a1b2-c3d4-7e5f-8a9b-0c1d2e3f4a90",
"bot_id": "0192f3c4-5a6b-7c8d-9e0f-1a2b3c4d5e6f",
"run_id": "0199a1b2-c3d4-7e5f-8a9b-0c1d2e3f4a80",
"action_class": "change_store",
"tool_key": "update_order_status",
"http_method": "PATCH",
"path": "/api/orders/1234",
"inputs_digest": "5f2b8c3a1d4e6f708192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8",
"required_permission_keys": [
"orders.update"
],
"status": "pending",
"requested_at": "2026-10-22T15:40:00.000Z",
"expires_at": "2026-10-25T15:40:00.000Z",
"decided_at": null,
"decline_reason": null,
"consumed_at": null,
"conversation_id": "0199a1b2-c3d4-7e5f-8a9b-0c1d2e3f4a60",
"decided_by": null,
"inputs": {
"order": {
"order_status": "cancelled"
}
},
"can_decide": true
},
"status": 200,
"meta": {
"request_uuid": "7e2c9b41-3f8a-4d15-b6e0-9a4c21d7f583",
"timestamp": "2026-10-22T15:45:00Z"
}
}{
"message": "Invalid credentials."
}{
"message": "Not authorized."
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_uuid": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"pagination": {
"cursor": "<string>",
"limit": 25,
"prev_cursor": "<string>",
"next_cursor": "<string>"
}
}
}Authorizations
The session token of an admin of your company. Company API, partner and droplet installation tokens are refused.
Path Parameters
The approval's id.
⌘I
Read an approval
curl --request GET \
--url https://api.fluid.app/api/company/v2026-10/bot-approvals/{approval_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/company/v2026-10/bot-approvals/{approval_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.fluid.app/api/company/v2026-10/bot-approvals/{approval_id}', 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.fluid.app/api/company/v2026-10/bot-approvals/{approval_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
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.fluid.app/api/company/v2026-10/bot-approvals/{approval_id}"
req, _ := http.NewRequest("GET", 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.get("https://api.fluid.app/api/company/v2026-10/bot-approvals/{approval_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/company/v2026-10/bot-approvals/{approval_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"approval": {
"id": "0199a1b2-c3d4-7e5f-8a9b-0c1d2e3f4a90",
"bot_id": "0192f3c4-5a6b-7c8d-9e0f-1a2b3c4d5e6f",
"run_id": "0199a1b2-c3d4-7e5f-8a9b-0c1d2e3f4a80",
"action_class": "change_store",
"tool_key": "update_order_status",
"http_method": "PATCH",
"path": "/api/orders/1234",
"inputs_digest": "5f2b8c3a1d4e6f708192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8",
"required_permission_keys": [
"orders.update"
],
"status": "pending",
"requested_at": "2026-10-22T15:40:00.000Z",
"expires_at": "2026-10-25T15:40:00.000Z",
"decided_at": null,
"decline_reason": null,
"consumed_at": null,
"conversation_id": "0199a1b2-c3d4-7e5f-8a9b-0c1d2e3f4a60",
"decided_by": null,
"inputs": {
"order": {
"order_status": "cancelled"
}
},
"can_decide": true
},
"status": 200,
"meta": {
"request_uuid": "7e2c9b41-3f8a-4d15-b6e0-9a4c21d7f583",
"timestamp": "2026-10-22T15:45:00Z"
}
}{
"message": "Invalid credentials."
}{
"message": "Not authorized."
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_uuid": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"pagination": {
"cursor": "<string>",
"limit": 25,
"prev_cursor": "<string>",
"next_cursor": "<string>"
}
}
}