AI bots
List a bot's runs
Every run of a bot you own or steward, newest first, a page at a time, including starts that were refused and why. Each run names the settings version it used.
Needs the we_bots.view permission.
GET
/
api
/
company
/
v2026-10
/
bots
/
{bot_id}
/
runs
List a bot's runs
curl --request GET \
--url https://api.fluid.app/api/company/v2026-10/bots/{bot_id}/runs \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/company/v2026-10/bots/{bot_id}/runs"
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/bots/{bot_id}/runs', 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",
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/bots/{bot_id}/runs"
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/bots/{bot_id}/runs")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/company/v2026-10/bots/{bot_id}/runs")
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{
"runs": [
{
"id": "0192f3d0-1a2b-7c3d-8e4f-5a6b7c8d9e0f",
"trigger_kind": "mention",
"status": "refused",
"refusal_reason": "grant_empty",
"failure_reason": null,
"on_behalf_of": {
"id": "0190a1b2-7c3d-7e4f-8a5b-6c7d8e9f0a2c",
"name": "Maya"
},
"settings_version": 3,
"effective_permission_keys": [],
"created_at": "2026-10-22T09:20:00.000Z",
"deadline_at": "2026-10-22T09:20:00.000Z",
"ended_at": "2026-10-22T09:20:00.000Z"
}
],
"status": 200,
"meta": {
"request_uuid": "7e2c9b41-3f8a-4d15-b6e0-9a4c21d7f583",
"timestamp": "2026-10-22T09:25:00Z",
"pagination": {
"cursor": null,
"limit": 25,
"prev_cursor": null,
"next_cursor": null
}
}
}{
"message": "Invalid credentials."
}{
"message": "Not authorized."
}{
"error": {
"message": "Bot not found",
"details": {}
},
"status": 404,
"meta": {
"request_uuid": "7e2c9b41-3f8a-4d15-b6e0-9a4c21d7f583",
"timestamp": "2026-10-21T15:32:08Z"
}
}{
"error": {
"message": "Invalid parameters",
"details": {
"filter": {
"status": [
"must be one of running, parked, succeeded, failed, refused"
]
}
}
},
"status": 422,
"meta": {
"request_uuid": "7e2c9b41-3f8a-4d15-b6e0-9a4c21d7f583",
"timestamp": "2026-10-22T09:25:00Z"
}
}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.
Query Parameters
Only runs with this status.
Available options:
running, parked, succeeded, failed, refused Only runs started this way.
Available options:
manual, mention Runs per page, 1 to 100. Defaults to 25.
Required range:
1 <= x <= 100A cursor from meta.pagination, to read another page.
⌘I
List a bot's runs
curl --request GET \
--url https://api.fluid.app/api/company/v2026-10/bots/{bot_id}/runs \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/company/v2026-10/bots/{bot_id}/runs"
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/bots/{bot_id}/runs', 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",
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/bots/{bot_id}/runs"
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/bots/{bot_id}/runs")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/company/v2026-10/bots/{bot_id}/runs")
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{
"runs": [
{
"id": "0192f3d0-1a2b-7c3d-8e4f-5a6b7c8d9e0f",
"trigger_kind": "mention",
"status": "refused",
"refusal_reason": "grant_empty",
"failure_reason": null,
"on_behalf_of": {
"id": "0190a1b2-7c3d-7e4f-8a5b-6c7d8e9f0a2c",
"name": "Maya"
},
"settings_version": 3,
"effective_permission_keys": [],
"created_at": "2026-10-22T09:20:00.000Z",
"deadline_at": "2026-10-22T09:20:00.000Z",
"ended_at": "2026-10-22T09:20:00.000Z"
}
],
"status": 200,
"meta": {
"request_uuid": "7e2c9b41-3f8a-4d15-b6e0-9a4c21d7f583",
"timestamp": "2026-10-22T09:25:00Z",
"pagination": {
"cursor": null,
"limit": 25,
"prev_cursor": null,
"next_cursor": null
}
}
}{
"message": "Invalid credentials."
}{
"message": "Not authorized."
}{
"error": {
"message": "Bot not found",
"details": {}
},
"status": 404,
"meta": {
"request_uuid": "7e2c9b41-3f8a-4d15-b6e0-9a4c21d7f583",
"timestamp": "2026-10-21T15:32:08Z"
}
}{
"error": {
"message": "Invalid parameters",
"details": {
"filter": {
"status": [
"must be one of running, parked, succeeded, failed, refused"
]
}
}
},
"status": 422,
"meta": {
"request_uuid": "7e2c9b41-3f8a-4d15-b6e0-9a4c21d7f583",
"timestamp": "2026-10-22T09:25:00Z"
}
}