Kerq API Docs
Everything you need to query trust scores, search tools, and integrate reliability signals directly into your agents and pipelines.
https://kerq.dev
Get a trust score for any tool in under a minute. Three steps:
1. Get your API key at kerq.dev/developer
2. Query the trust score endpoint (curl)
# Replace YOUR_API_KEY and the tool slug
curl -s https://kerq.dev/api/tools/github-mcp-server/score \
-H "Authorization: Bearer YOUR_API_KEY"
3. Parse the response
{
"success": true,
"tool_id": 42,
"slug": "github-mcp-server",
"name": "GitHub MCP Server",
"trust_score": 91,
"tier": "certified",
"score_breakdown": {
"uptime": 98,
"response_time": 95,
"error_rate": 100,
"consistency": 88,
"throughput": 85,
"recovery_behavior": 90,
"performance_trend": 80
},
"endpoint_ms": 124,
"calculated_at": "2026-03-30T20:00:00.000Z"
}
trust_score is below your threshold (e.g. 70), reject the tool connection or fall back to an alternative. Higher is more reliable.Or use fetch (JavaScript)
const res = await fetch('https://kerq.dev/api/tools/github-mcp-server/score', {
headers: { 'Authorization': `Bearer ${API_KEY}` }
});
const { trust_score, tier } = await res.json();
if (trust_score < 70) throw new Error('Tool reliability below threshold');
Most Kerq API endpoints require an API key. Keys are tied to your developer account and your access tier (Free or High Volume).
Where to get a key: Sign up at kerq.dev, then visit the Developer Portal to generate and manage keys.
Three ways to pass your API key
# Option 1 — Authorization header (recommended)
Authorization: Bearer <your-api-key>
# Option 2 — X-API-Key header
X-API-Key: <your-api-key>
# Option 3 — Query parameter (useful for quick tests)
GET /api/tools/my-tool/score?api_key=<your-api-key>
KERQ_API_KEY.Missing key response
# HTTP 401
{
"success": false,
"error": "MISSING_API_KEY",
"message": "API key required. Add header: Authorization: Bearer <your-api-key>",
"docs": "https://kerq.dev/developer"
}
The primary endpoint. Returns the trust score and full 7-metric breakdown for any tool. Safe to call on every agent step.
| Parameter | Type | Description | |
|---|---|---|---|
| :id | string | required | Tool ID (numeric) or slug (e.g. github-mcp-server) |
Example response
{
"success": true,
"tool_id": 42,
"slug": "github-mcp-server",
"name": "GitHub MCP Server",
"trust_score": 91,
"tier": "certified",
"score_breakdown": {
"uptime": 98,
"response_time": 95,
"error_rate": 100,
"consistency": 88,
"throughput": 85,
"recovery_behavior": 90,
"performance_trend": 80
},
"endpoint_ms": 124,
"calculated_at": "2026-03-30T20:00:00.000Z"
}
Paginated list of all tools in the Score Index. Supports filtering by category, score threshold, and verification tier. Use this to build your own tool discovery layer.
| Parameter | Type | Description | |
|---|---|---|---|
| page | integer | optional | Page number. Default: 1 |
| limit | integer | optional | Results per page. Default: 20, max: 100 |
| search | string | optional | Search tools by name or description |
| category | string | optional | Filter by category slug |
| min_score | integer | optional | Minimum trust score filter (0–100) |
| verification_tier | string | optional | certified, community, or unverified |
| sort | string | optional | Sort order (e.g. score_desc) |
Example response
{
"success": true,
"tools": [
{
"id": 42,
"slug": "github-mcp-server",
"name": "GitHub MCP Server",
"category": "Development",
"trust_score": 91,
"tier": "certified"
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 347,
"pages": 18
}
}
Full metadata for a single tool — name, description, category, endpoint URL, certification status, and current score.
| Parameter | Type | Description | |
|---|---|---|---|
| :id | string | required | Tool ID (numeric) or slug |
Example response
{
"success": true,
"tool": {
"id": 42,
"slug": "github-mcp-server",
"name": "GitHub MCP Server",
"description": "Official GitHub MCP server for code access",
"category": "Development",
"endpoint_url": "https://api.githubcopilot.com/mcp",
"trust_score": 91,
"tier": "certified",
"is_certified": true,
"is_claimed": true
}
}
Leaderboard of the highest-scoring tools, sorted by trust score descending. Useful for surfacing reliable options when a user hasn't specified a tool.
| Parameter | Type | Description | |
|---|---|---|---|
| limit | integer | optional | Number of results. Default: 20, max: 100 |
Heartbeat endpoint. No auth required. Use this for uptime checks or pre-flight verification before your agent makes scored requests.
{
"status": "ok",
"timestamp": "2026-03-30T21:00:00.000Z"
}
Every Kerq trust score is a weighted composite of 7 independent metrics. Availability and uptime carry the most weight — an unreachable tool is an unusable tool. Response time and error rate are the next strongest signals. Consistency, throughput, recovery behavior, and performance trend are supporting factors that provide a complete reliability picture. The exact weighting formula is proprietary.
| Field | Description |
|---|---|
| uptime | Rolling availability over the measurement window. |
| response_time | Median latency in milliseconds. |
| error_rate | Proportion of requests returning server error status codes. |
| consistency | Variance in response times. Low jitter = stable service. |
| throughput | Ability to handle sustained load without degradation. |
| recovery_behavior | Speed of returning to healthy state after an error period. |
| performance_trend | Tracks whether a tool's reliability is improving, stable, or declining over recent history. |
| Plan | Monthly calls | Req/sec | Cost |
|---|---|---|---|
| Free | 10,000 / month | 20 req/s | $0 |
| High Volume | Unlimited | 100 req/s | $499 / month |
Monthly quotas reset on your billing cycle date. If you exceed the Free tier limit, you'll get a 429 until the next reset. Upgrade any time from the Developer Portal.
There are no per-query charges on either plan. No surprise invoices.
Rate limit response headers
X-RateLimit-Limit: 10000
X-RateLimit-Remaining: 9847
X-RateLimit-Reset: 1743638400
All error responses follow the same JSON format:
{
"success": false,
"error": "ERROR_CODE",
"message": "Human-readable description of the problem"
}
| Status | Error code | Cause |
|---|---|---|
| 400 | INVALID_PARAMS | Missing or invalid query parameters |
| 401 | MISSING_API_KEY | No API key in the request |
| 401 | INVALID_API_KEY | Key does not exist or has been revoked |
| 404 | TOOL_NOT_FOUND | No tool matches the provided ID or slug |
| 429 | RATE_LIMIT_EXCEEDED | Monthly call quota exhausted. Resets on billing date. |
| 500 | INTERNAL_ERROR | Unexpected server error. Retry with exponential backoff. |
Questions? Email info@kerq.dev — we read everything.
After each tool call in your agent, report the result to Kerq. Your data improves trust scores for every developer on the platform — the more real-world reports Kerq receives for a tool, the more accurate its score becomes.
Base URL for telemetry: https://kerq.dev/api/v1/report
Report the outcome of a single tool call. Send the tool's ID, the HTTP status code it returned, and how long the call took. Kerq uses this data to supplement automated probes with real-world usage patterns at scale.
Request body
| Field | Type | Description | |
|---|---|---|---|
| tool_id | string | integer | required | Tool slug (e.g. github-mcp-server) or numeric ID |
| status_code | integer | required | HTTP status code returned by the tool (100–599). Use 200–299 for success, 5xx for server errors. |
| latency_ms | integer | required | Round-trip latency in milliseconds (0–300000). Measure from the moment you send the request to when you receive the response. |
| timestamp | string (ISO 8601) | optional | When the tool call occurred. Defaults to server receipt time. Must be within ±1 hour of server time. |
Example request body
{
"tool_id": "github-mcp-server",
"status_code": 200,
"latency_ms": 145,
"timestamp": "2026-04-07T19:14:00.000Z"
}
Example success response (HTTP 200)
{
"success": true,
"message": "Telemetry recorded",
"is_outlier": false
}
Response codes
| Status | Meaning |
|---|---|
| 200 | Report accepted. is_outlier: true flags reports with unusual values that may indicate transient issues. |
| 400 | Invalid payload — missing required fields or values out of range. |
| 401 | Missing or invalid API key. |
| 429 | Rate limit exceeded (1 000 reports/hour per key). Check Retry-After header. |
curl example
POST https://kerq.dev/api/v1/report
curl -s -X POST https://kerq.dev/api/v1/report \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"tool_id":"github-mcp-server","status_code":200,"latency_ms":145}'
JavaScript (fetch)
const t0 = Date.now();
const response = await fetch(toolEndpoint, { method: 'POST', body: payload });
const latency_ms = Date.now() - t0;
// Fire-and-forget — don't await in your critical path
fetch('https://kerq.dev/api/v1/report', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.KERQ_API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
tool_id: 'github-mcp-server',
status_code: response.status,
latency_ms
})
}).catch(() => {}); // never let telemetry throw
Python (requests)
import time, requests, os
t0 = time.monotonic()
resp = requests.post(tool_endpoint, json=payload, timeout=10)
latency_ms = int((time.monotonic() - t0) * 1000)
# Report to Kerq (best-effort, non-blocking in production)
try:
requests.post(
"https://kerq.dev/api/v1/report",
json={
"tool_id": "github-mcp-server",
"status_code": resp.status_code,
"latency_ms": latency_ms
},
headers={"Authorization": f"Bearer {os.environ['KERQ_API_KEY']}"},
timeout=2
)
except Exception:
pass # telemetry is optional — never block on it
await them in your agent's critical path. Wrap in try/catch and swallow errors — a failed report should never cause your agent to fail.Skip the manual fetch boilerplate. Use the Kerq SDK helper to report telemetry in one line. It works in Node.js, Deno, and the browser. It never throws — telemetry failures are silently swallowed so your agent keeps running.
Load via script tag (browser)
<script src="https://kerq.dev/kerq-sdk.js"></script>
<script>
const kerq = window.kerq.createClient('YOUR_API_KEY');
</script>
Node.js (CommonJS)
const { createClient } = require('./kerq-sdk');
const kerq = createClient(process.env.KERQ_API_KEY);
Basic usage — plain data
// After a tool call completes, report it:
await kerq.reportTelemetry('github-mcp-server', {
status_code: 200,
latency_ms: 145
});
// With an explicit timestamp:
await kerq.reportTelemetry('slack-mcp', {
status_code: 503,
latency_ms: 4200,
timestamp: new Date().toISOString()
});
With a fetch Response object
const t0 = Date.now();
const response = await fetch(toolEndpointUrl, options);
const latency_ms = Date.now() - t0;
// Pass the Response directly — SDK extracts status automatically
kerq.reportTelemetry('my-mcp-tool', response, { latency_ms }); // fire-and-forget
Express.js middleware pattern
// middleware/kerq-telemetry.js
const { createClient } = require('./kerq-sdk');
const kerq = createClient(process.env.KERQ_API_KEY);
function kerqTelemetry(toolId) {
return async function(req, res, next) {
const t0 = Date.now();
res.on('finish', () => {
kerq.reportTelemetry(toolId, {
status_code: res.statusCode,
latency_ms: Date.now() - t0
}); // fire-and-forget
});
next();
};
}
// Usage:
app.post('/call-github-tool', kerqTelemetry('github-mcp-server'), handler);
Axios interceptor pattern
const axios = require('axios');
const { createClient } = require('./kerq-sdk');
const kerq = createClient(process.env.KERQ_API_KEY);
axios.interceptors.request.use(config => {
config.metadata = { t0: Date.now() };
return config;
});
axios.interceptors.response.use(
response => {
const latency_ms = Date.now() - response.config.metadata.t0;
kerq.reportTelemetry(response.config.headers['X-Kerq-Tool-Id'], {
status_code: response.status,
latency_ms
});
return response;
},
error => {
if (error.response) {
const latency_ms = Date.now() - error.config.metadata.t0;
kerq.reportTelemetry(error.config.headers['X-Kerq-Tool-Id'], {
status_code: error.response.status,
latency_ms
});
}
return Promise.reject(error);
}
);
reportTelemetry(toolId, response, opts?) returns Promise<boolean>. Download kerq-sdk.js and add a .d.ts file, or inline the types from the source comments.Every Kerq trust score is built from two independent data sources: automated probes run by Kerq's infrastructure, and real-world telemetry contributed by the developer community. Both feed into the same 7 trust metrics — giving each score both a rigorous baseline and production-scale signal.
Kerq continuously monitors every registered tool's endpoint, measuring availability, performance, and error behavior on a rolling schedule. The same test runs the same way for every tool, making scores comparable across the entire registry.
When developers report tool call outcomes via the Telemetry API, Kerq aggregates that data as a second scoring signal. Probes test from Kerq's infrastructure — telemetry captures real-world behavior across diverse callers, networks, and load patterns.
The weighting, aggregation methodology, and blending logic between these data sources is proprietary.
You can see the full 7-metric breakdown for any tool in the Score Schema section.
After each tool call in your agent, report the result using the SDK helper or the REST endpoint. Takes one line of code. Your data makes scores more accurate for everyone.
See the telemetry quick-start →Kerq is designed to sit inside your agent's execution loop without adding noticeable latency. Trust score lookups are fast enough that your agent won't notice them.
| Metric | Value | Notes |
|---|---|---|
| Average response time | <30ms | Single trust score lookup (p50) |
| P95 response time | <35ms | 95th percentile across all requests |
| Concurrent load (50 req) | <100ms | 50 simultaneous requests in parallel |
/api/tools/:id — Returns the trust score for a tool. Best choice for standard trust verification in agent workflows.
/api/tools/:id/score — Returns a freshly measured trust score. Use this when you need an up-to-date measurement.
At 27ms average, a Kerq lookup adds less latency than resolving a hostname. Built for real-time agent workflows where every millisecond counts.