Developer API
Build widgets, automate feeds, and search our curated directory of AI tools directly inside your own platforms with our production-ready REST API.
1. Getting Started
AI Tools One provides developer-friendly JSON endpoints allowing you to query, search, and integrate our verified listings of AI products directly into your platforms. Whether you are building an AI newsletter, a directory website, automated social media bots, or custom research aggregators, our API gives you high-performance, real-time structured directory data.
2. Authentication
API requests are authenticated by passing your secure API key. Generate and manage up to 5 keys with custom labels (e.g. Development, Production) from your dashboard.
Option A: HTTP Header (Recommended)
Pass your key inside the X-API-Key request header. This keeps keys out of server logs and browser history.
X-API-Key: atk_your_secure_api_key_here
Option B: URL Query Parameter
For quick testing, append api_key directly to the URL query string.
https://ai-tools.one/api/v1/tools.php?api_key=atk_your_secure_api_key_here
3. API Endpoints
All endpoints return application/json payloads and support browser CORS preflights.
https://ai-tools.one/api/v1/status.php
No Auth Required
Public health check. Returns API version, date-timestamp, and database connectivity. Use this to verify system uptime before making queries.
{
"status": "ok",
"api_version": "1.0",
"database": "connected",
"timestamp": "2026-06-05T12:00:00+06:00",
"server_time_ms": 3,
"endpoints": {
"tools": "/api/v1/tools.php",
"tool": "/api/v1/tool.php",
"categories": "/api/v1/categories.php",
"search": "/api/v1/search.php",
"status": "/api/v1/status.php"
}
}
https://ai-tools.one/api/v1/tools.php
Fetch approved and active directory tools. Supports pagination, pricing filters, search keywords, categories, custom sorting, and column filter blocks.
https://ai-tools.one/api/v1/tool.php
Retrieve single tool data by slug or database ID. Includes ratings, logo paths, pricing types, tags, and category info.
https://ai-tools.one/api/v1/categories.php
Retrieve active directory categories alongside real-time tools_count statistics inside each.
https://ai-tools.one/api/v1/search.php
New
Unified smart search. Pass query q to search and return matched tools and categories in a single call — perfect for dropdowns and typeahead bars.
4. Query Parameters
Parameters to filter and select columns returned by the API:
Tools List Parameters
| Parameter | Type | Description |
|---|---|---|
| page | integer | Page index. Default is 1. |
| limit | integer | Maximum items per page. Max 100, Default 15. |
| search | string | Keyword search filter matches tool name, tagline, description, and tags. |
| category | string|int | Filter by category slug (e.g. coding) or ID. |
| pricing | string | Filter by model: Free, Freemium, or Paid. |
| sort | string | Order by: latest, popular, or rating. |
| featured | integer | Pass 1 to return only featured/curated tools. New |
| fields | string | Comma-separated field selection (e.g. name,slug,rating). Updated |
Unified Search Parameters
| Parameter | Type | Description |
|---|---|---|
| q | string | Search term. Minimum 2 characters. *Required.* |
| limit | integer | Maximum tools to return (default 8, max 20). |
Single Tool Parameters
| Parameter | Type | Description |
|---|---|---|
| id | integer | Tool ID. Required if slug is not provided. |
| slug | string | Tool URL slug (e.g. claude-ai). Required if id is not provided. |
| fields | string | Comma-separated columns to include (e.g. name,tagline,tags,website_url). |
5. Response Schema
Success JSON envelope schema. The meta block contains execution trace UUIDs and timings:
Tools List Response
{
"status": "success",
"meta": {
"request_id": "4f9a2c1e-b83c-41ab-8ea2-1f4a9b2c3e1e",
"version": "1.0",
"response_time_ms": 12,
"endpoint": "/api/v1/tools.php"
},
"pagination": {
"total_results": 39,
"total_pages": 3,
"current_page": 1,
"limit": 15
},
"data": [
{
"id": 10,
"name": "Claude",
"slug": "claude-ai",
"tagline": "Anthropic advanced AI assistant with 200K context window.",
"overview": "...",
"logo_url": "https://lh3.googleusercontent.com/...",
"website_url": "https://claude.ai",
"pricing_type": "Freemium",
"pricing_details": null,
"rating": "5.0",
"upvotes": 7207,
"tags": ["LLM", "Chat", "Analysis", "Coding"],
"created_at": "2026-05-14 22:46:22",
"category_name": "AI Writing",
"category_slug": "ai-writing"
}
]
}
Rate Limit Headers
X-RateLimit-Limit: 60 # Requests allowed per minute (RPM) X-RateLimit-Remaining: 58 # Calls left in current minute window X-RateLimit-Reset: 1748975400 # Unix timestamp of when window resets
Check X-RateLimit-Reset in your code to wait for rate window resets.
Unified Search Response
{
"status": "success",
"meta": {
"request_id": "15baf7ac-877a-435d-ab4a-fb33c2e17f8f",
"version": "1.0",
"response_time_ms": 4,
"endpoint": "/api/v1/search.php",
"query": "chat"
},
"data": {
"tools": [
{
"id": 10,
"name": "Claude",
"slug": "claude-ai",
"tagline": "Anthropic advanced AI assistant",
"logo_url": "https://lh3.googleusercontent.com/...",
"pricing_type": "Freemium",
"rating": "5.0",
"upvotes": 7207,
"tags": ["LLM", "Chat"],
"category_name": "AI Writing",
"category_slug": "ai-writing"
}
],
"categories": [
{
"id": 1,
"name": "AI Writing",
"slug": "ai-writing",
"icon": "edit",
"tools_count": 8
}
]
}
}
6. Error Handling & Rate Limits
Errors are accompanied by standard HTTP status codes and a structured JSON payload with error classifications:
{
"status": "error",
"error_code": "RATE_LIMIT_EXCEEDED",
"message": "Too Many Requests: Rate limit of 60 requests per minute exceeded.",
"meta": {
"request_id": "93aedcc7-e0e7-48bf-89d0-e25ba4eba2ee",
"version": "1.0"
}
}
| error_code | HTTP Status | Reason |
|---|---|---|
| MISSING_API_KEY | 401 | API key is missing in X-API-Key header or URL parameters. |
| INVALID_API_KEY | 401 | Key is invalid, deactivated, or revoked. |
| RATE_LIMIT_EXCEEDED | 429 | Minute call quota exceeded. Back off until reset timestamp. |
| MISSING_PARAMETER | 400 | A required query parameter (e.g. search "q") is missing. |
| TOOL_NOT_FOUND | 404 | Requested tool slug or database ID does not exist. |
| DB_ERROR | 500 | Internal database query exception. Try again. |
7. Code Examples
Health Check (No Auth Required)
curl -i "https://ai-tools.one/api/v1/status.php"
Query Tools — cURL
curl -X GET "https://ai-tools.one/api/v1/tools.php?featured=1&limit=6&fields=name,slug,logo_url,tags" \ -H "X-API-Key: atk_your_secure_api_key_here"
Autocomplete Search — JavaScript (Fetch)
async function searchAITools(query) {
const response = await fetch(
`https://ai-tools.one/api/v1/search.php?q=${encodeURIComponent(query)}&limit=6`,
{
headers: {
'X-API-Key': 'atk_your_secure_api_key_here'
}
}
);
const result = await response.json();
console.log('Matching Tools:', result.data.tools);
console.log('Matching Categories:', result.data.categories);
console.log('Trace Request ID:', result.meta.request_id);
}
searchAITools('image creation');
Exponential Backoff Header Check — JS
const response = await fetch('https://ai-tools.one/api/v1/tools.php', {
headers: { 'X-API-Key': 'atk_your_key_here' }
});
if (response.status === 429) {
const resetTimestamp = parseInt(response.headers.get('X-RateLimit-Reset'));
const delayMs = (resetTimestamp * 1000) - Date.now();
const delaySec = Math.ceil(delayMs / 1000);
console.warn(`Rate limited. Waiting ${delaySec} seconds before re-calling...`);
// setTimeout(() => recall(), delayMs);
} else {
const remainingCalls = response.headers.get('X-RateLimit-Remaining');
console.log(`RPM remaining quota: ${remainingCalls}`);
}
Single Tool Query — PHP (cURL)
<?php
$ch = curl_init("https://ai-tools.one/api/v1/tool.php?slug=claude-ai&fields=name,tagline,tags,website_url");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['X-API-Key: atk_your_secure_api_key_here'],
]);
$response = curl_exec($ch);
curl_close($ch);
$res = json_decode($response, true);
if ($res && $res['status'] === 'success') {
echo "Tool Name: " . $res['data']['name'] . "\n";
echo "Tags: " . implode(', ', $res['data']['tags']);
}
?>
Query Tools List — Python (requests)
import requests
resp = requests.get(
"https://ai-tools.one/api/v1/tools.php",
params={"category": "ai-writing", "sort": "popular", "limit": 10, "fields": "name,slug,tags"},
headers={"X-API-Key": "atk_your_secure_api_key_here"}
)
if resp.status_code == 200:
res = resp.json()
print(f"Total: {res['pagination']['total_results']} tools")
print(f"Request ID: {res['meta']['request_id']}")
for tool in res['data']:
print(f"- {tool['name']} | Tags: {tool['tags']}")
8. Developer FAQ
Yes. Every registered user can generate up to 5 active API keys and call the directory API for free.
Up to 5 active keys. You can specify custom labels for each (e.g., Local Dev, Prod Server) to monitor usage separately.
It is a standard Unix timestamp representing when your 1-minute call window expires and resets. It helps you schedule subsequent requests efficiently.
Use the new /api/v1/search.php?q=keyword endpoint. It aggregates matched categories and tools in a single call.
It is a unique UUID generated for each API request. If you encounter errors, reference this UUID when contacting support to help trace logs.
Always parsed as a clean array of strings (e.g., ["LLM", "Chat"]). Empty tag values return empty arrays [].
Yes. The default limit is 60 RPM. If your project requires higher throughput, contact us through the support channel with details of your application.
Yes. All endpoints support browser CORS headers and correctly process preflight OPTIONS requests, meaning you can integrate widgets directly inside client-side JS code.