curl --request GET \
--url https://api.teamfollowup.ai/api/tfu-live-agents/{id}/brain/catalog \
--header 'Authorization: Bearer YOUR_API_KEY'import requests
url = "https://api.teamfollowup.ai/api/tfu-live-agents/{id}/brain/catalog"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.teamfollowup.ai/api/tfu-live-agents/{id}/brain/catalog', 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.teamfollowup.ai/api/tfu-live-agents/{id}/brain/catalog",
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.teamfollowup.ai/api/tfu-live-agents/{id}/brain/catalog"
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.teamfollowup.ai/api/tfu-live-agents/{id}/brain/catalog")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.teamfollowup.ai/api/tfu-live-agents/{id}/brain/catalog")
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{
"success": true,
"data": {
"capabilities": [
{
"id": "outreach",
"name": "Messages",
"purpose": "Text the lead during a conversation, now or at a time they ask for. Callbacks, transfers, bookings and the rest are workflows.",
"supported": true,
"equipped": false,
"partiallyEquipped": false
}
],
"voices": [
"marin",
"cedar"
],
"rooms": [
{
"id": "office",
"name": "Office"
}
],
"workflows": {
"configurationRoot": "workflows",
"nodes": [
{
"type": "check_tag",
"name": "Check tag",
"timing": "waits",
"outputs": [
"yes",
"no"
],
"summary": "Checks whether the contact has one tag and continues on Yes or No. The AI learns the answer (checkedTags).",
"settings": {
"tag": "the tag to check"
},
"settingsSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"tag": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "One CRM tag, not tfu_ai_kill_switch or tfu_ai_standby."
}
},
"required": [
"tag"
]
},
"arguments": [],
"argumentSchemas": {}
}
],
"templates": [
{
"key": "check_tag",
"name": "Check tag",
"description": "Use when you need to know whether the lead has this tag.",
"steps": [
{
"id": "check",
"type": "check_tag",
"config": {
"tag": ""
},
"outputs": {
"yes": [],
"no": []
}
}
],
"mustFill": [
{
"step": "check",
"setting": "tag"
}
]
}
],
"rules": [
"Nothing follows Put on DND. Book appointment needs a Find slots node earlier on its path."
],
"limits": {
"workflows": 20,
"outputDepth": 5,
"stepsPerWorkflow": 60,
"nameLength": 60,
"descriptionLength": 3000,
"labelLength": 120,
"totalBytes": 180000,
"toolNameLength": 64,
"toolDescriptionSent": 1024
}
},
"subAccount": {
"crm": "ghl",
"nativeCrm": false,
"tagNodes": true
}
}
}Get TFU Live catalog
TFU Live only. Discover what an agent can be built from: the workflow model (data.workflows: every node with its settings in words and as JSON Schema, its outputs, timing and the arguments it takes, the templates and which of their settings must be filled before saving, the rules and the limits), the sub-account’s CRM (data.subAccount; the native CRM has no tags), the tool groups that stay tools, voice names and background rooms. It is not an agent’s configuration: equipped is always false here; read the agent for that. See the workflows contract guide.
Required scope: agents:read.
Required API key scope: agents:read.
curl --request GET \
--url https://api.teamfollowup.ai/api/tfu-live-agents/{id}/brain/catalog \
--header 'Authorization: Bearer YOUR_API_KEY'import requests
url = "https://api.teamfollowup.ai/api/tfu-live-agents/{id}/brain/catalog"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.teamfollowup.ai/api/tfu-live-agents/{id}/brain/catalog', 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.teamfollowup.ai/api/tfu-live-agents/{id}/brain/catalog",
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.teamfollowup.ai/api/tfu-live-agents/{id}/brain/catalog"
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.teamfollowup.ai/api/tfu-live-agents/{id}/brain/catalog")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.teamfollowup.ai/api/tfu-live-agents/{id}/brain/catalog")
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{
"success": true,
"data": {
"capabilities": [
{
"id": "outreach",
"name": "Messages",
"purpose": "Text the lead during a conversation, now or at a time they ask for. Callbacks, transfers, bookings and the rest are workflows.",
"supported": true,
"equipped": false,
"partiallyEquipped": false
}
],
"voices": [
"marin",
"cedar"
],
"rooms": [
{
"id": "office",
"name": "Office"
}
],
"workflows": {
"configurationRoot": "workflows",
"nodes": [
{
"type": "check_tag",
"name": "Check tag",
"timing": "waits",
"outputs": [
"yes",
"no"
],
"summary": "Checks whether the contact has one tag and continues on Yes or No. The AI learns the answer (checkedTags).",
"settings": {
"tag": "the tag to check"
},
"settingsSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"tag": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "One CRM tag, not tfu_ai_kill_switch or tfu_ai_standby."
}
},
"required": [
"tag"
]
},
"arguments": [],
"argumentSchemas": {}
}
],
"templates": [
{
"key": "check_tag",
"name": "Check tag",
"description": "Use when you need to know whether the lead has this tag.",
"steps": [
{
"id": "check",
"type": "check_tag",
"config": {
"tag": ""
},
"outputs": {
"yes": [],
"no": []
}
}
],
"mustFill": [
{
"step": "check",
"setting": "tag"
}
]
}
],
"rules": [
"Nothing follows Put on DND. Book appointment needs a Find slots node earlier on its path."
],
"limits": {
"workflows": 20,
"outputDepth": 5,
"stepsPerWorkflow": 60,
"nameLength": 60,
"descriptionLength": 3000,
"labelLength": 120,
"totalBytes": 180000,
"toolNameLength": 64,
"toolDescriptionSent": 1024
}
},
"subAccount": {
"crm": "ghl",
"nativeCrm": false,
"tagNodes": true
}
}
}Authorizations
Send your API key as Authorization: Bearer YOUR_API_KEY.
Path Parameters
TFU Live agent id. Never use an ordinary provider agent id.
Query Parameters
Sub-account belonging to the authenticated agency and any narrower credential location binding.
outreach, conversation_history, skills 