Catalogue
A network is assembled from building blocks that Agent Hub offers you. These read-only endpoints return those building blocks in the form networks use. Workspaces, domains, agents and skills are read from Agent Hub with your access token, so each list contains exactly what you can see there, and models come from your deployment's routing catalogue.
Responses are plain JSON lists or objects, without the success and data envelope that Agent Hub uses. Errors have the shape {"detail": "…"}. A 401 means the request carried no access token or Agent Hub rejected it; other client errors from Agent Hub are passed through with their status. A 502 means Agent Hub could not be reached, and a 504 that it did not answer in time.
List workspaces
GET /networks-api/workspaces
Returns the workspaces you can see.
Returns the same workspace objects as Agent Hub's List workspaces, as a plain list: system workspaces, your own, and workspaces shared with your company. Each workspace includes its domains, agent_count, explicit_agent_ids and component_counts.
- Authentication
- Bearer token How it works
Parameters
No parameters.
Returns
Returns a list of workspace objects.
curl "$VDF_BASE_URL/networks-api/workspaces" \
-H "Authorization: Bearer $VDF_ACCESS_TOKEN" const response = await fetch(`${process.env.VDF_BASE_URL}/networks-api/workspaces`, {
headers: {
Authorization: `Bearer ${process.env.VDF_ACCESS_TOKEN}`,
},
});
if (!response.ok) throw new Error(`Request failed with status ${response.status}`);
const data = await response.json(); import os
import requests
response = requests.get(
f"{os.environ['VDF_BASE_URL']}/networks-api/workspaces",
headers={"Authorization": f"Bearer {os.environ['VDF_ACCESS_TOKEN']}"},
timeout=30,
)
response.raise_for_status()
data = response.json() [
{
"id": "5b0c7d2e-3f41-4c8e-9a57-0f6d2b1e8c34",
"name": "Claims operations",
"slug": "claims-operations",
"description": "Agents and tools for the claims team.",
"icon": "mdi:briefcase-outline",
"color": "#2563EB",
"owner_user_id": 42,
"company_id": 7,
"visibility": "company",
"settings": {
"apply_to_new_chats": true,
"allow_callable_networks": true,
"shared_knowledge": true,
"workspace_tools_first": true
},
"updated_by_user_id": 42,
"is_default": false,
"is_system": false,
"sort_order": 0,
"created_at": "2026-08-12T10:04:31.518204",
"updated_at": "2026-09-01T09:30:00.412345",
"domains": [
{
"id": "3f2b8c1e-6a4d-4e0b-9d2f-8a1c5e7b9d02",
"name": "Claims",
"slug": "claims",
"description": "Insurance claims intake, triage and settlement.",
"owner_user_id": 42,
"is_system": false,
"created_at": "2026-08-12T10:01:09.227518",
"updated_at": "2026-08-20T15:44:36.901442",
"execution_style": "analysis",
"preferred_output_formats": [
"markdown"
],
"action_set": [],
"context_instructions": "Cite the policy clause behind every recommendation.",
"tool_preferences": {
"preferred": [
"web_search"
],
"blocked": [
"web_crawler"
]
},
"model_hints": {
"preferred_capability": "analysis",
"min_context_window": 32000
},
"regulated": true
}
],
"domain_count": 1,
"agent_count": 4,
"explicit_agent_ids": [
"7c9e6679-7425-40de-944b-e07fc1f90ae7"
],
"component_counts": {
"tool": 1,
"network_template": 1,
"db_connection": 0,
"integration": 0
}
}
] Retrieve a workspace by slug
GET /networks-api/workspaces/slug/{slug}
Returns a workspace by its slug, including the components attached to it.
Returns the same object as Agent Hub's Retrieve a workspace by slug. The slug is resolved against your own workspaces first, then system workspaces, then workspaces shared with your company. The response adds components: the tools, network templates, data connections and integrations attached to the workspace, grouped by type.
- Authentication
- Bearer token How it works
Path parameters
-
slugstring RequiredSlug of the workspace, such as
claims-operations.
Returns
Returns a workspace object with components.
Errors
- 404 No workspace with this slug is visible to you.
curl "$VDF_BASE_URL/networks-api/workspaces/slug/claims-operations" \
-H "Authorization: Bearer $VDF_ACCESS_TOKEN" const response = await fetch(`${process.env.VDF_BASE_URL}/networks-api/workspaces/slug/claims-operations`, {
headers: {
Authorization: `Bearer ${process.env.VDF_ACCESS_TOKEN}`,
},
});
if (!response.ok) throw new Error(`Request failed with status ${response.status}`);
const data = await response.json(); import os
import requests
response = requests.get(
f"{os.environ['VDF_BASE_URL']}/networks-api/workspaces/slug/claims-operations",
headers={"Authorization": f"Bearer {os.environ['VDF_ACCESS_TOKEN']}"},
timeout=30,
)
response.raise_for_status()
data = response.json() {
"id": "5b0c7d2e-3f41-4c8e-9a57-0f6d2b1e8c34",
"name": "Claims operations",
"slug": "claims-operations",
"description": "Agents and tools for the claims team.",
"icon": "mdi:briefcase-outline",
"color": "#2563EB",
"owner_user_id": 42,
"company_id": 7,
"visibility": "company",
"settings": {
"apply_to_new_chats": true,
"allow_callable_networks": true,
"shared_knowledge": true,
"workspace_tools_first": true
},
"updated_by_user_id": 42,
"is_default": false,
"is_system": false,
"sort_order": 0,
"created_at": "2026-08-12T10:04:31.518204",
"updated_at": "2026-09-01T09:30:00.412345",
"domains": [
{
"id": "3f2b8c1e-6a4d-4e0b-9d2f-8a1c5e7b9d02",
"name": "Claims",
"slug": "claims",
"description": "Insurance claims intake, triage and settlement.",
"owner_user_id": 42,
"is_system": false,
"created_at": "2026-08-12T10:01:09.227518",
"updated_at": "2026-08-20T15:44:36.901442",
"execution_style": "analysis",
"preferred_output_formats": [
"markdown"
],
"action_set": [],
"context_instructions": "Cite the policy clause behind every recommendation.",
"tool_preferences": {
"preferred": [
"web_search"
],
"blocked": [
"web_crawler"
]
},
"model_hints": {
"preferred_capability": "analysis",
"min_context_window": 32000
},
"regulated": true
}
],
"domain_count": 1,
"agent_count": 4,
"explicit_agent_ids": [
"7c9e6679-7425-40de-944b-e07fc1f90ae7"
],
"component_counts": {
"tool": 1,
"network_template": 1,
"db_connection": 0,
"integration": 0
},
"components": {
"tool": [
{
"id": "d1e6b3a8-4c2f-4f7e-9b05-6a8c2d4e1f93",
"workspace_id": "5b0c7d2e-3f41-4c8e-9a57-0f6d2b1e8c34",
"component_type": "tool",
"ref": "web_search",
"label": "Web search",
"meta": {},
"sort_order": 0,
"created_at": "2026-08-12T10:06:12.774390"
}
],
"network_template": [
{
"id": "f4a2c7e9-1b3d-4e6f-8a50-2c9d7b1e4f68",
"workspace_id": "5b0c7d2e-3f41-4c8e-9a57-0f6d2b1e8c34",
"component_type": "network_template",
"ref": "claims-intake-review",
"label": "Claims intake review",
"meta": {},
"sort_order": 1,
"created_at": "2026-08-12T10:06:12.775021"
}
],
"db_connection": [],
"integration": []
}
} List domains
GET /networks-api/domains
Returns the domains you can see in Agent Hub (system domains and your own), reshaped for networks:
domain_idis the domain's slug, which is how a network refers to a domain.tool_preferencesmerges Agent Hub's preferred and blocked tools into one list; blocked tools are prefixedblocked:.proof_weightsare the default weights used to compute a run's proof score.
For the full domain object as Agent Hub stores it, use List domains in Agent Hub.
- Authentication
- Bearer token How it works
Parameters
No parameters.
Returns
Returns a list of domains.
curl "$VDF_BASE_URL/networks-api/domains" \
-H "Authorization: Bearer $VDF_ACCESS_TOKEN" const response = await fetch(`${process.env.VDF_BASE_URL}/networks-api/domains`, {
headers: {
Authorization: `Bearer ${process.env.VDF_ACCESS_TOKEN}`,
},
});
if (!response.ok) throw new Error(`Request failed with status ${response.status}`);
const data = await response.json(); import os
import requests
response = requests.get(
f"{os.environ['VDF_BASE_URL']}/networks-api/domains",
headers={"Authorization": f"Bearer {os.environ['VDF_ACCESS_TOKEN']}"},
timeout=30,
)
response.raise_for_status()
data = response.json() [
{
"domain_id": "claims",
"name": "Claims",
"description": "Insurance claims intake, triage and settlement.",
"execution_style": "analysis",
"preferred_output_formats": [
"markdown"
],
"action_set": [],
"context_instructions": "Cite the policy clause behind every recommendation.",
"tool_preferences": [
"web_search",
"blocked:web_crawler"
],
"model_hints": {
"preferred_capability": "analysis",
"min_context_window": 32000
},
"regulated": true,
"proof_weights": {
"eval_weight": 0.4,
"energy_weight": 0.3,
"determinism_weight": 0.3
},
"created_at": "2026-08-12T10:01:09.227518",
"updated_at": "2026-08-20T15:44:36.901442",
"tags": []
}
] Retrieve a domain
GET /networks-api/domains/{domain_id}
Returns one domain in the form networks use.
Returns a domain in the same form as List domains. When no domain has the UUID you pass, domain_id is matched case-insensitively against the slug and the name of the domains you can list, so the slug a network stores also works.
- Authentication
- Bearer token How it works
Path parameters
-
domain_idstring RequiredThe domain's UUID, slug or name.
Returns
Returns a domain.
Errors
- 404 No domain matches
domain_id.
curl "$VDF_BASE_URL/networks-api/domains/claims" \
-H "Authorization: Bearer $VDF_ACCESS_TOKEN" const response = await fetch(`${process.env.VDF_BASE_URL}/networks-api/domains/claims`, {
headers: {
Authorization: `Bearer ${process.env.VDF_ACCESS_TOKEN}`,
},
});
if (!response.ok) throw new Error(`Request failed with status ${response.status}`);
const data = await response.json(); import os
import requests
response = requests.get(
f"{os.environ['VDF_BASE_URL']}/networks-api/domains/claims",
headers={"Authorization": f"Bearer {os.environ['VDF_ACCESS_TOKEN']}"},
timeout=30,
)
response.raise_for_status()
data = response.json() {
"domain_id": "claims",
"name": "Claims",
"description": "Insurance claims intake, triage and settlement.",
"execution_style": "analysis",
"preferred_output_formats": [
"markdown"
],
"action_set": [],
"context_instructions": "Cite the policy clause behind every recommendation.",
"tool_preferences": [
"web_search",
"blocked:web_crawler"
],
"model_hints": {
"preferred_capability": "analysis",
"min_context_window": 32000
},
"regulated": true,
"proof_weights": {
"eval_weight": 0.4,
"energy_weight": 0.3,
"determinism_weight": 0.3
},
"created_at": "2026-08-12T10:01:09.227518",
"updated_at": "2026-08-20T15:44:36.901442",
"tags": []
} List agents
GET /networks-api/agents
Returns the agents you can place in a network, in a compact form for pickers.
Returns the system agents and the agents you created, in the order Agent Hub lists them. domain is the slug of the agent's domain, or its category when it has no domain. An agent without a database ID uses its name as id. capabilities and tags are reserved and currently always empty.
For full agent records, use List agents in Agent Hub.
- Authentication
- Bearer token How it works
Headers
-
X-Workspace-SlugstringWorkspace slug to filter by when
workspace_slugis not set.
Query parameters
-
workspace_slugstringOnly return agents that belong to the workspace with this slug.
-
limitintegerMaximum number of agents to return, from 1 to 500. Values outside that range are clamped.
Returns
Returns a list of agents with id, name, description, domain, domain_id, capabilities and tags.
curl "$VDF_BASE_URL/networks-api/agents?workspace_slug=claims-operations" \
-H "Authorization: Bearer $VDF_ACCESS_TOKEN" const response = await fetch(`${process.env.VDF_BASE_URL}/networks-api/agents?workspace_slug=claims-operations`, {
headers: {
Authorization: `Bearer ${process.env.VDF_ACCESS_TOKEN}`,
},
});
if (!response.ok) throw new Error(`Request failed with status ${response.status}`);
const data = await response.json(); import os
import requests
response = requests.get(
f"{os.environ['VDF_BASE_URL']}/networks-api/agents",
headers={"Authorization": f"Bearer {os.environ['VDF_ACCESS_TOKEN']}"},
params={
"workspace_slug": "claims-operations",
},
timeout=30,
)
response.raise_for_status()
data = response.json() [
{
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"name": "claims_triage",
"description": "Classifies incoming claims and drafts a first response.",
"domain": "claims",
"domain_id": "3f2b8c1e-6a4d-4e0b-9d2f-8a1c5e7b9d02",
"capabilities": [],
"tags": []
}
] List skills
GET /networks-api/skills
Returns the skills you can bind to an LLM node.
Returns the active system skills, your own skills and skills shared with you, sorted by name. When a user skill has the same name as a system skill, the user skill is listed instead. unresolved_tools lists the entries of allowed_tools that are not in the tool catalogue.
For full skill records, see Skills in Agent Hub.
- Authentication
- Bearer token How it works
Query parameters
-
scopestringsystemfor system skills only oruserfor your own only. Any other value returns both. -
qstringOnly return skills whose name or description contains this text, ignoring case.
Returns
Returns a list of skills with name, description, version, scope, allowed_tools, unresolved_tools, allow_implicit_invocation and argument_hint.
curl "$VDF_BASE_URL/networks-api/skills?q=letter" \
-H "Authorization: Bearer $VDF_ACCESS_TOKEN" const response = await fetch(`${process.env.VDF_BASE_URL}/networks-api/skills?q=letter`, {
headers: {
Authorization: `Bearer ${process.env.VDF_ACCESS_TOKEN}`,
},
});
if (!response.ok) throw new Error(`Request failed with status ${response.status}`);
const data = await response.json(); import os
import requests
response = requests.get(
f"{os.environ['VDF_BASE_URL']}/networks-api/skills",
headers={"Authorization": f"Bearer {os.environ['VDF_ACCESS_TOKEN']}"},
params={
"q": "letter",
},
timeout=30,
)
response.raise_for_status()
data = response.json() [
{
"name": "claims-letter-style",
"description": "House style and mandatory wording for letters to claimants.",
"version": "1.0",
"scope": "user",
"allowed_tools": [
"web_search"
],
"unresolved_tools": [],
"allow_implicit_invocation": true,
"argument_hint": null
}
] List models
GET /networks-api/models
Returns the models in your deployment's routing catalogue.
Returns the models networks can route to, sorted by model_id, for choosing pinned and fallback models and required capabilities while you design a network or template. The list reflects the catalogue as of the service's most recent refresh. If the catalogue cannot be loaded, the endpoint returns an empty list rather than an error.
capabilitiesalways includesgeneral, plus tags such asanalysis,coding,reasoning,tool_useorembeddings.availabilityisalwaysfor a routable model,disabledwhen the model is deactivated in the catalogue, anddownwhen its runtime cannot be reached.regulated_approvedsays whether the model may be used in domains markedregulated.
- Authentication
- Bearer token How it works
Parameters
No parameters.
Returns
Returns a list of models with model_id, name, provider, capabilities, availability, regulated_approved and context_window (in tokens, or null when unknown).
curl "$VDF_BASE_URL/networks-api/models" \
-H "Authorization: Bearer $VDF_ACCESS_TOKEN" const response = await fetch(`${process.env.VDF_BASE_URL}/networks-api/models`, {
headers: {
Authorization: `Bearer ${process.env.VDF_ACCESS_TOKEN}`,
},
});
if (!response.ok) throw new Error(`Request failed with status ${response.status}`);
const data = await response.json(); import os
import requests
response = requests.get(
f"{os.environ['VDF_BASE_URL']}/networks-api/models",
headers={"Authorization": f"Bearer {os.environ['VDF_ACCESS_TOKEN']}"},
timeout=30,
)
response.raise_for_status()
data = response.json() [
{
"model_id": "acme-chat-70b",
"name": "Acme Chat 70B",
"provider": "local-cluster",
"capabilities": [
"analysis",
"general",
"tool_use"
],
"availability": "always",
"regulated_approved": true,
"context_window": 131072
}
]