AI bots
Check one fluid_api call
Before a bot’s run makes one Fluid API call, the permission its route declares, whether the bot’s owner holds it, and the call’s autonomy mode under the run’s policy, so the We-Bots runtime runs a read, parks a write for approval or explains a missing permission. It authorizes nothing; Rails authorizes the call itself as the owner. An automatic write sent with request_id is counted against its class’s caps, once per id; past a cap its mode is off with the reason.
POST
/
api
/
company
/
v2026-10
/
bots
/
{bot_id}
/
runs
/
{run_id}
/
api-check
Check one fluid_api call
curl --request POST \
--url https://api.fluid.app/api/company/v2026-10/bots/{bot_id}/runs/{run_id}/api-check \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"method": "POST",
"path": "/api/v202506/orders/1001/notes",
"body": {
"note": "Customer asked to ship on Friday."
},
"request_id": "wses_8f2a1c:call_3"
}
'import requests
url = "https://api.fluid.app/api/company/v2026-10/bots/{bot_id}/runs/{run_id}/api-check"
payload = {
"method": "POST",
"path": "/api/v202506/orders/1001/notes",
"body": { "note": "Customer asked to ship on Friday." },
"request_id": "wses_8f2a1c:call_3"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
method: 'POST',
path: '/api/v202506/orders/1001/notes',
body: JSON.stringify({note: 'Customer asked to ship on Friday.'}),
request_id: 'wses_8f2a1c:call_3'
})
};
fetch('https://api.fluid.app/api/company/v2026-10/bots/{bot_id}/runs/{run_id}/api-check', 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/bots/{bot_id}/runs/{run_id}/api-check",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'method' => 'POST',
'path' => '/api/v202506/orders/1001/notes',
'body' => [
'note' => 'Customer asked to ship on Friday.'
],
'request_id' => 'wses_8f2a1c:call_3'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.fluid.app/api/company/v2026-10/bots/{bot_id}/runs/{run_id}/api-check"
payload := strings.NewReader("{\n \"method\": \"POST\",\n \"path\": \"/api/v202506/orders/1001/notes\",\n \"body\": {\n \"note\": \"Customer asked to ship on Friday.\"\n },\n \"request_id\": \"wses_8f2a1c:call_3\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
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.fluid.app/api/company/v2026-10/bots/{bot_id}/runs/{run_id}/api-check")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"method\": \"POST\",\n \"path\": \"/api/v202506/orders/1001/notes\",\n \"body\": {\n \"note\": \"Customer asked to ship on Friday.\"\n },\n \"request_id\": \"wses_8f2a1c:call_3\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/company/v2026-10/bots/{bot_id}/runs/{run_id}/api-check")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"method\": \"POST\",\n \"path\": \"/api/v202506/orders/1001/notes\",\n \"body\": {\n \"note\": \"Customer asked to ship on Friday.\"\n },\n \"request_id\": \"wses_8f2a1c:call_3\"\n}"
response = http.request(request)
puts response.read_body{
"check": {
"allowed": true,
"permission_key": "orders.update",
"held": true,
"mode": "approval",
"reason": null,
"missing_fields": []
},
"status": 200,
"meta": {
"request_uuid": "7e2c9b41-3f8a-4d15-b6e0-9a4c21d7f583",
"timestamp": "2026-10-21T16:10:00Z"
}
}{
"message": "Invalid credentials."
}{
"message": "Not authorized."
}{
"error": {
"message": "Run not found",
"details": {}
},
"status": 404,
"meta": {
"request_uuid": "7e2c9b41-3f8a-4d15-b6e0-9a4c21d7f583",
"timestamp": "2026-10-26T15:32:08Z"
}
}Authorizations
The session token of an admin of your company. Company API, partner and droplet installation tokens are refused.
Path Parameters
The bot's id.
The id of one of the bot's runs.
Body
application/json
⌘I
Check one fluid_api call
curl --request POST \
--url https://api.fluid.app/api/company/v2026-10/bots/{bot_id}/runs/{run_id}/api-check \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"method": "POST",
"path": "/api/v202506/orders/1001/notes",
"body": {
"note": "Customer asked to ship on Friday."
},
"request_id": "wses_8f2a1c:call_3"
}
'import requests
url = "https://api.fluid.app/api/company/v2026-10/bots/{bot_id}/runs/{run_id}/api-check"
payload = {
"method": "POST",
"path": "/api/v202506/orders/1001/notes",
"body": { "note": "Customer asked to ship on Friday." },
"request_id": "wses_8f2a1c:call_3"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
method: 'POST',
path: '/api/v202506/orders/1001/notes',
body: JSON.stringify({note: 'Customer asked to ship on Friday.'}),
request_id: 'wses_8f2a1c:call_3'
})
};
fetch('https://api.fluid.app/api/company/v2026-10/bots/{bot_id}/runs/{run_id}/api-check', 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/bots/{bot_id}/runs/{run_id}/api-check",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'method' => 'POST',
'path' => '/api/v202506/orders/1001/notes',
'body' => [
'note' => 'Customer asked to ship on Friday.'
],
'request_id' => 'wses_8f2a1c:call_3'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.fluid.app/api/company/v2026-10/bots/{bot_id}/runs/{run_id}/api-check"
payload := strings.NewReader("{\n \"method\": \"POST\",\n \"path\": \"/api/v202506/orders/1001/notes\",\n \"body\": {\n \"note\": \"Customer asked to ship on Friday.\"\n },\n \"request_id\": \"wses_8f2a1c:call_3\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
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.fluid.app/api/company/v2026-10/bots/{bot_id}/runs/{run_id}/api-check")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"method\": \"POST\",\n \"path\": \"/api/v202506/orders/1001/notes\",\n \"body\": {\n \"note\": \"Customer asked to ship on Friday.\"\n },\n \"request_id\": \"wses_8f2a1c:call_3\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/company/v2026-10/bots/{bot_id}/runs/{run_id}/api-check")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"method\": \"POST\",\n \"path\": \"/api/v202506/orders/1001/notes\",\n \"body\": {\n \"note\": \"Customer asked to ship on Friday.\"\n },\n \"request_id\": \"wses_8f2a1c:call_3\"\n}"
response = http.request(request)
puts response.read_body{
"check": {
"allowed": true,
"permission_key": "orders.update",
"held": true,
"mode": "approval",
"reason": null,
"missing_fields": []
},
"status": 200,
"meta": {
"request_uuid": "7e2c9b41-3f8a-4d15-b6e0-9a4c21d7f583",
"timestamp": "2026-10-21T16:10:00Z"
}
}{
"message": "Invalid credentials."
}{
"message": "Not authorized."
}{
"error": {
"message": "Run not found",
"details": {}
},
"status": 404,
"meta": {
"request_uuid": "7e2c9b41-3f8a-4d15-b6e0-9a4c21d7f583",
"timestamp": "2026-10-26T15:32:08Z"
}
}