API Documentation
Integrate the Agents.NET registry into your applications. Discover agents, search by category, and retrieve detailed profiles programmatically.
https://agents.net/apiπ Endpoints
β‘ Quick Start
The Agents.NET API is free, open, and requires no authentication for read operations. Get started in seconds with any HTTP client:
Basic Request
curl https://agents.net/api/agentsWith Filters
# Get Design agents only
curl "https://agents.net/api/agents?category=Design"
# Search for AI writing agents
curl "https://agents.net/api/agents?search=AI%20writing"
# Combine filters
curl "https://agents.net/api/agents?category=Marketing&platform=OpenClaw"JavaScript Example
const response = await fetch('https://agents.net/api/agents?category=Design');
const { agents, meta } = await response.json();
console.log(`Found ${meta.total} design agents`);
agents.forEach(agent => {
console.log(`β ${agent.name} (${agent.platform})`);
});{
"agents": [
{
"id": 53,
"name": "v0 by Vercel",
"description": "AI-powered UI generation agent that converts natural language descriptions into production-ready React components...",
"category": "Design",
"platform": "Vercel",
"apiEndpoint": "https://v0.dev",
"submittedAt": "2026-04-22T16:05:09.858Z",
"status": "approved"
},
{
"id": 52,
"name": "Midjourney",
"description": "AI image generation agent producing photorealistic and artistic visuals from text prompts...",
"category": "Design",
"platform": "Midjourney",
"apiEndpoint": "https://www.midjourney.com",
"submittedAt": "2026-04-22T16:05:09.841Z",
"status": "approved"
}
],
"meta": {
"total": 37,
"limit": 100,
"offset": 0,
"hasMore": false
}
}π Authentication
No API key required for read operations
All GET endpoints are publicly accessible. List agents, retrieve profiles, and search the directory without authentication.
POST endpoints (agent submission) are also open but include rate limiting and validation. A future API key system will be available with Pro tier accounts for higher rate limits and advanced features.
π‘ Endpoints
/api/agentsReturns approved agents in the registry, ordered by submission date (newest first). Supports filtering by category, platform, and full-text search.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
category | string | Optional | Filter by category (e.g., "Marketing", "Engineering"). Exact match. |
platform | string | Optional | Filter by platform (e.g., "ai.ventures", "OpenClaw"). Exact match. |
search | string | Optional | Search agent names and descriptions (case-insensitive). Alias: q |
limit | integer | Optional | Max agents to return (1-100, default 100) |
offset | integer | Optional | Number of agents to skip for pagination (default 0) |
Response Fields
| Parameter | Type | Required | Description |
|---|---|---|---|
agents | array | Required | Array of agent objects |
agents[].id | integer | Required | Unique agent identifier |
agents[].name | string | Required | Agent display name |
agents[].description | string | Required | Agent description and capabilities |
agents[].category | string | Required | Agent category (e.g., "Marketing", "Engineering", "Analytics") |
agents[].platform | string | Required | Platform the agent runs on (e.g., "ai.ventures", "OpenClaw") |
agents[].apiEndpoint | string | Optional | Agent API endpoint URL (if available) |
agents[].submittedAt | ISO 8601 | Required | When the agent was submitted to the registry |
agents[].status | string | Required | Always "approved" for listed agents |
meta.total | integer | Required | Total number of agents matching the query |
meta.limit | integer | Required | Max results per page (mirrors request param) |
meta.offset | integer | Required | Current offset (mirrors request param) |
meta.hasMore | boolean | Required | True if more results exist beyond current page |
π Basic Queries
curl -s https://agents.net/api/agents | jq '.meta'
# β { "total": 37, "limit": 100, "offset": 0, "hasMore": false }curl -s "https://agents.net/api/agents?category=Design" | jq '.agents[].name'
# β "v0 by Vercel", "Midjourney", "Figma AI"async function getAgents(category) {
try {
const response = await fetch(`https://agents.net/api/agents?category=${category}`);
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const { agents, meta } = await response.json();
console.log(`Found ${meta.total} ${category} agents:`);
agents.forEach(agent => {
console.log(` β ${agent.name} (${agent.platform})`);
});
return agents;
} catch (error) {
console.error('Failed to fetch agents:', error.message);
return [];
}
}
// Usage
const marketingAgents = await getAgents('Marketing');π Advanced Filtering
import requests
def search_agents(category=None, platform=None, search=None, limit=10):
"""Search agents with comprehensive filtering."""
params = {'limit': limit}
if category: params['category'] = category
if platform: params['platform'] = platform
if search: params['search'] = search
try:
response = requests.get('https://agents.net/api/agents', params=params)
response.raise_for_status()
data = response.json()
print(f"Found {data['meta']['total']} agents matching criteria:")
for agent in data['agents']:
print(f" [{agent['category']}] {agent['name']} β {agent['platform']}")
return data['agents']
except requests.RequestException as e:
print(f"API Error: {e}")
return []
# Examples
search_agents(category='Design', search='UI generation')
search_agents(platform='Vercel')
search_agents(search='analytics', limit=20)/api/agents/:idReturns a single agent by ID. Returns 404 if the agent doesn't exist or isn't approved.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id | integer | Required | The agent's unique ID (from the directory listing) |
Response Fields
| Parameter | Type | Required | Description |
|---|---|---|---|
agent | object | Required | Agent object with full profile data |
agent.id | integer | Required | Unique agent identifier |
agent.name | string | Required | Agent display name |
agent.description | string | Required | Agent description and capabilities |
agent.category | string | Required | Agent category |
agent.platform | string | Required | Platform the agent runs on |
agent.apiEndpoint | string | Optional | Agent API endpoint URL |
agent.submittedAt | ISO 8601 | Required | Submission timestamp |
agent.status | string | Required | Agent approval status |
agent.capabilities | array | Optional | Structured capabilities with name, level, and description |
agent.useCases | string | Optional | Detailed use case descriptions |
agent.tags | array | Optional | Searchable tags for categorization |
curl https://agents.net/api/agents/17{
"agent": {
"id": 17,
"name": "Patrick",
"description": "Performance marketing strategist...",
"category": "Marketing",
"platform": "ai.ventures",
"apiEndpoint": "https://ai.ventures/api/agents/patrick",
"submittedAt": "2026-03-30T12:00:00.000Z",
"status": "approved"
}
}{
"error": "Agent not found"
}/api/agents/submitSubmit a new agent to the registry. Agents go through a review process before appearing in the public directory.
Request Body (JSON)
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Required | Agent name (minimum 3 characters) |
description | string | Required | Agent description and capabilities (minimum 20 characters) |
category | string | Required | Agent category (e.g., Marketing, Engineering, Analytics, Design, Finance, Sales, Legal, Operations, Governance, Education, Management, Executive) |
contactEmail | string | Required | Contact email for the agent publisher |
apiEndpoint | string | Optional | Agent's API endpoint URL |
platform | string | Optional | Platform the agent runs on (defaults to "other") |
curl -X POST https://agents.net/api/agents/submit \
-H "Content-Type: application/json" \
-d '{
"name": "DataBot",
"description": "An automated data pipeline agent that extracts, transforms, and loads data from multiple sources into your warehouse.",
"category": "Engineering",
"contactEmail": "dev@example.com",
"apiEndpoint": "https://api.example.com/databot/v1",
"platform": "Custom"
}'{
"success": true,
"message": "Agent submitted successfully! We'll review it and get back to you within 2-3 business days.",
"submissionId": 42
}Error Responses
400Validation error β missing or invalid required fields409Conflict β agent with that name already exists503Service unavailable β database not readyβ±οΈ Rate Limits & Best Practices
π₯ Current Limits
GET Read Endpoints
- β’ Limit: 1000 requests/hour per IP
- β’ Burst: 100 requests/minute
- β’ Cache: 60s server-side caching
- β’ Recommendation: Poll max once/minute
POST Write Endpoints
- β’ Limit: 10 submissions/hour per IP
- β’ Validation: Duplicate detection enabled
- β’ Review: 2-3 business days
- β’ Abuse protection: Auto-blocking enabled
π Performance Tips
Cache Responses Locally
Agent data changes infrequently. Cache for 5-15 minutes in production.
// Simple in-memory cache
const cache = new Map();
const CACHE_TTL = 5 * 60 * 1000; // 5 minutes
async function getCachedAgents(url) {
const cached = cache.get(url);
if (cached && Date.now() - cached.timestamp < CACHE_TTL) {
return cached.data;
}
const response = await fetch(url);
const data = await response.json();
cache.set(url, { data, timestamp: Date.now() });
return data;
}Use Server-Side Filtering
Filter on the server instead of fetching all and filtering client-side.
β EFFICIENT
// Server filters 37 β 3 agents
const url = 'agents.net/api/agents?category=Marketing';
const { agents } = await fetch(url).then(r => r.json());
console.log(agents.length); // 3β WASTEFUL
// Client filters 37 β 3 agents
const { agents } = await fetch('agents.net/api/agents').then(r => r.json());
const marketing = agents.filter(a => a.category === 'Marketing');
console.log(marketing.length); // 3π Agent Categories
Agents in the registry are organized into the following categories. Use these values when submitting agents or filtering the directory.
AnalyticsDesignEducationEngineeringExecutiveFinanceGovernanceLegalManagementMarketingOperationsSalesπ§ Integration Examples
Build an Agent Picker Widget
Fetch agents by category using server-side filtering:
async function getAgentsByCategory(category) {
const res = await fetch(`https://agents.net/api/agents?category=${category}`);
const { agents, meta } = await res.json();
console.log(`${meta.total} agents in ${category}`);
return agents;
}
// Get all Marketing agents β filtered server-side
const marketingAgents = await getAgentsByCategory('Marketing');
// β [{ id: 17, name: "Patrick", ... }, { id: 35, name: "Sophie", ... }]Agent Discovery for Multi-Agent Workflows
Dynamically discover and chain agents at runtime using query parameters:
import requests
def discover_agents(category=None, platform=None):
"""Discover agents from the Agents.NET registry with server-side filtering."""
params = {}
if category:
params["category"] = category
if platform:
params["platform"] = platform
resp = requests.get("https://agents.net/api/agents", params=params)
data = resp.json()
print(f" Found {data['meta']['total']} agents")
return data["agents"]
def build_pipeline(categories):
"""Build a multi-agent pipeline from category sequence."""
pipeline = []
for cat in categories:
agents = discover_agents(category=cat)
if agents:
pipeline.append(agents[0]) # Pick top-rated agent
return pipeline
# Build: Analytics β Engineering β Marketing pipeline
pipeline = build_pipeline(["Analytics", "Engineering", "Marketing"])
for step in pipeline:
print(f" Step: {step['name']} ({step['category']}) via {step['apiEndpoint']}")Monitor Directory Changes
Poll the directory to detect new agents (webhook support coming soon):
#!/bin/bash
# Check for new agents every hour
PREV_COUNT=$(curl -s https://agents.net/api/agents | jq '.agents | length')
while true; do
sleep 3600
CURR_COUNT=$(curl -s https://agents.net/api/agents | jq '.agents | length')
if [ "$CURR_COUNT" -gt "$PREV_COUNT" ]; then
echo "π New agents added! Count: $PREV_COUNT β $CURR_COUNT"
PREV_COUNT=$CURR_COUNT
fi
doneπΊοΈ API Roadmap
Ready to integrate?
Start building with the Agents.NET API today. Browse the directory, submit your agents, or join the community.