Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
resolveTurn a domain, URL or GitHub org into the provider it belongs to.
find_cohortsEvery scored population of providers in the catalog.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/forecall-dev:forecall-dev-servers-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Forecall Servers API
version: v1
description: 'Save and read the lints of the MCP servers registered in your Forecall dashboard, and evaluate how models choose their tools. Every endpoint but this document needs an API key from the dashboard (API keys): `Authorization: Bearer fc_…`.'
servers:
- url: https://api.forecall.dev
security:
- apiKey: []
tags:
- name: Servers
paths:
/v1/servers/{id}/lint:
post:
operationId: saveLint
summary: Lint a tools/list and save it as the server's version
description: Adds the tools as the server's new version unless they are the same as its latest version (order included), lints them and saves the lint. Each call takes 1 unit from the month's allowance for the key's kind, then from the organization's credits; with neither, 402 and nothing is saved. Keys of kind ci and vendor may call it.
parameters:
- name: id
in: path
required: true
description: The server's id, as in the dashboard's URL (/servers/{id}).
schema:
type: string
format: uuid
- name: label
in: query
required: false
description: The server's own version, such as 1.4.0 (up to 50 characters).
schema:
type: string
maxLength: 50
requestBody:
required: true
description: 'The tools/list: an array of tools, {"tools": [...]}, or a JSON-RPC response {"result": {"tools": [...]}}. Up to 1048576 bytes and 200 tools, with the MCP wire format''s camelCase keys and one tool per name.'
content:
application/json:
schema:
$ref: '#/components/schemas/ToolsList'
responses:
'200':
description: The saved lint, with the changes from the version before
content:
application/json:
schema:
$ref: '#/components/schemas/SavedLint'
'401':
description: '`unauthorized`'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'402':
description: '`quota_exceeded`, `payment_failed`'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: '`not_found`'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'413':
description: '`input_too_large`'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'422':
description: '`invalid_json`, `unrecognized_shape`, `invalid_tool`, `too_many_tools`, `snake_case_keys`, `duplicate_names`, `invalid_label`'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: '`rate_limited`'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
tags:
- Servers
/v1/servers/{id}/evaluations/estimate:
post:
operationId: estimateEvaluation
summary: Estimate an evaluation of the server's latest version
description: 'What evaluating the server''s latest version would take, in units, without taking them: writing its cases (none when a ready evaluation of the same version and settings has them), and each model''s run (cases whose result the organization already has are not counted). Before the cases are written, each is estimated as an utterance of about 40 tokens. Vendor keys only; the Free plan has no evaluations.'
parameters:
- name: id
in: path
required: true
description: The server's id, as in the dashboard's URL (/servers/{id}).
schema:
type: string
format: uuid
requestBody:
required: false
content:
application/json:
schema:
$ref: '#/components/schemas/EvaluationRequest'
responses:
'200':
description: The estimate
content:
application/json:
schema:
$ref: '#/components/schemas/Estimate'
'401':
description: '`unauthorized`'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'402':
description: '`plan_has_no_evaluations`'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: '`not_found`'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'422':
description: '`invalid_json`, `invalid_request`, `unknown_models`, `unknown_distractors`, `lang_not_in_plan`'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: '`rate_limited`'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
tags:
- Servers
/v1/servers/{id}/evaluations:
post:
operationId: startEvaluation
summary: Evaluate the server's latest version
description: Takes the estimate's units from the month's vendor allowance, then the organization's credits (402 and nothing started when they fall short), and starts the evaluation. Follow it at the Location the answer gives. If the evaluation fails, the units of the cases it did not finish come back as credits. Vendor keys only; the Free plan has no evaluations.
parameters:
- name: id
in: path
required: true
description: The server's id, as in the dashboard's URL (/servers/{id}).
schema:
type: string
format: uuid
requestBody:
required: false
content:
application/json:
schema:
$ref: '#/components/schemas/EvaluationRequest'
responses:
'202':
description: 'Started: the estimate it took, and a run for each model'
headers:
Location:
description: /v1/evaluations/{id}
schema:
type: string
content:
application/json:
schema:
$ref: '#/components/schemas/StartedEvaluation'
'401':
description: '`unauthorized`'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'402':
description: '`quota_exceeded`, `payment_failed`, `plan_has_no_evaluations`'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: '`not_found`'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'422':
description: '`invalid_json`, `invalid_request`, `unknown_models`, `unknown_distractors`, `lang_not_in_plan`'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: '`rate_limited`'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
tags:
- Servers
/v1/servers/{id}/lint/latest:
get:
operationId: getLatestLint
summary: The latest lint of the server's latest version
description: Takes no units.
parameters:
- name: id
in: path
required: true
description: The server's id, as in the dashboard's URL (/servers/{id}).
schema:
type: string
format: uuid
responses:
'200':
description: The latest lint
content:
application/json:
schema:
$ref: '#/components/schemas/LatestLint'
'401':
description: '`unauthorized`'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: '`not_found`'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: '`rate_limited`'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
tags:
- Servers
components:
schemas:
SavedLint:
type: object
properties:
server:
type: object
properties:
id:
type: string
format: uuid
slug:
type: string
name:
type: string
required:
- id
- slug
- name
version:
type: object
properties:
id:
type: string
format: uuid
created:
type: boolean
description: False when the tools matched the latest version
capturedAt:
type: string
format: date-time
label:
type:
- string
- 'null'
required:
- id
- created
- capturedAt
- label
lint:
type: object
properties:
id:
type: string
format: uuid
report:
$ref: '#/components/schemas/LintReport'
required:
- id
- report
changes:
oneOf:
- $ref: '#/components/schemas/VersionDiff'
- type: 'null'
description: Null when there is no version before, or it has no lint
units:
type: object
properties:
fromIncluded:
type: integer
fromCredits:
type: integer
required:
- fromIncluded
- fromCredits
required:
- server
- version
- lint
- changes
- units
VersionDiff:
type: object
properties:
sameRules:
type: boolean
description: Scores compare only within one rules version
scoreAvg:
type: object
properties:
before:
type: number
after:
type: number
required:
- before
- after
confusablePairsTotal:
type: object
properties:
before:
type: integer
after:
type: integer
required:
- before
- after
added:
type: array
items:
type: object
properties:
name:
type: string
score:
type: integer
required:
- name
- score
removed:
type: array
items:
type: object
properties:
name:
type: string
score:
type: integer
required:
- name
- score
changed:
type: array
items:
type: object
serverIssuesResolved:
type: array
items:
type: object
serverIssuesAdded:
type: array
items:
type: object
required:
- sameRules
- scoreAvg
- confusablePairsTotal
- added
- removed
- changed
- serverIssuesResolved
- serverIssuesAdded
description: 'What changed from the version before: scores, tools added and removed, issues resolved and new, word diffs of descriptions and arguments'
ToolsList:
oneOf:
- type: array
items:
$ref: '#/components/schemas/Tool'
- type: object
properties:
tools:
type: array
items:
$ref: '#/components/schemas/Tool'
required:
- tools
- type: object
properties:
result:
type: object
properties:
tools:
type: array
items:
$ref: '#/components/schemas/Tool'
required:
- tools
required:
- result
LatestLint:
type: object
properties:
server:
type: object
properties:
id:
type: string
format: uuid
slug:
type: string
name:
type: string
required:
- id
- slug
- name
version:
type: object
properties:
id:
type: string
format: uuid
capturedAt:
type: string
format: date-time
label:
type:
- string
- 'null'
required:
- id
- capturedAt
- label
lint:
type: object
properties:
id:
type: string
format: uuid
source:
type: string
enum:
- server
- ci
createdAt:
type: string
format: date-time
report:
$ref: '#/components/schemas/LintReport'
required:
- id
- source
- createdAt
- report
required:
- server
- version
- lint
Error:
type: object
properties:
error:
type: object
properties:
code:
type: string
enum:
- unauthorized
- quota_exceeded
- payment_failed
- plan_has_no_evaluations
- not_found
- input_too_large
- invalid_json
- unrecognized_shape
- invalid_tool
- too_many_tools
- snake_case_keys
- duplicate_names
- invalid_label
- invalid_request
- unknown_models
- unknown_distractors
- lang_not_in_plan
- rate_limited
- internal
message:
type: string
detail:
type: object
description: 'Where the input went wrong: path, keys, names, count and limit…'
required:
- code
- message
required:
- error
StartedEvaluation:
type: object
properties:
id:
type: string
format: uuid
name:
type: string
status:
type: string
enum:
- queued
server:
type: object
properties:
id:
type: string
format: uuid
slug:
type: string
name:
type: string
required:
- id
- slug
- name
version:
type: object
properties:
id:
type: string
format: uuid
label:
type:
- string
- 'null'
required:
- id
- label
cases:
type: integer
description: 'The cases: reused, or planned'
casesReused:
type: boolean
settings:
$ref: '#/components/schemas/EvaluationSettings'
units:
type: integer
description: All the units the evaluation takes
casegen:
type: object
properties:
calls:
type: integer
units:
type: integer
required:
- calls
- units
models:
type: array
items:
type: object
properties:
model:
type: string
calls:
type: integer
reused:
type: integer
description: Cases whose result is reused
units:
type: integer
required:
- model
- calls
- reused
- units
warnings:
type: array
items:
type: object
runs:
type: array
items:
type: object
properties:
id:
type: string
format: uuid
model:
type: string
units:
type: integer
description: 'The units taken for the run: the first''s include writing the cases'
required:
- id
- model
- units
required:
- id
- name
- status
- server
- version
- cases
- casesReused
- settings
- units
- casegen
- models
- warnings
- runs
Estimate:
type: object
properties:
server:
type: object
properties:
id:
type: string
format: uuid
slug:
type: string
name:
type: string
required:
- id
- slug
- name
version:
type: object
properties:
id:
type: string
format: uuid
label:
type:
- string
- 'null'
required:
- id
- label
cases:
type: integer
description: 'The cases: reused, or planned'
casesReused:
type: boolean
settings:
$ref: '#/components/schemas/EvaluationSettings'
units:
type: integer
description: All the units the evaluation takes
casegen:
type: object
properties:
calls:
type: integer
units:
type: integer
required:
- calls
- units
models:
type: array
items:
type: object
properties:
model:
type: string
calls:
type: integer
reused:
type: integer
description: Cases whose result is reused
units:
type: integer
required:
- model
- calls
- reused
- units
warnings:
type: array
items:
type: object
balance:
type: object
properties:
included:
type: integer
description: This month's vendor units left
credits:
type: integer
required:
- included
- credits
required:
- server
- version
- cases
- casesReused
- settings
- units
- casegen
- models
- warnings
- balance
Tool:
type: object
properties:
name:
type: string
title:
type: string
description:
type: string
inputSchema:
type: object
outputSchema:
type: object
annotations:
type: object
required:
- name
LintReport:
type: object
properties:
lintVersion:
type: integer
description: The scoring rules' version
toolCount:
type: integer
scoreAvg:
type: number
description: Out of 100, one decimal
confusablePairsTotal:
type: integer
tools:
type: array
items:
type: object
properties:
name:
type: string
score:
type: integer
components:
type: object
description: Points of each of the six items
issues:
type: array
items:
type: object
required:
- name
- score
- components
- issues
serverIssues:
type: array
items:
type: object
required:
- lintVersion
- toolCount
- scoreAvg
- confusablePairsTotal
- tools
- serverIssues
description: 'The same report as the web linter''s (scores and issue codes: forecall.dev/en/docs/reading-scores)'
EvaluationSettings:
type: object
properties:
casesPerTool:
type: integer
description: 'Positive cases per tool: 8 on Pro, 20 on Team'
lang:
type: string
enum:
- en
- ja
distractors:
type: array
items:
type: string
required:
- casesPerTool
- lang
- distractors
EvaluationRequest:
type: object
properties:
models:
type: array
maxItems: 10
items:
type: string
examples:
- anthropic/claude-sonnet-5-5
description: 'vendor/name of the models to evaluate. Default: anthropic/claude-sonnet-5-5 and openai/gpt-6.1-sol (google/gemini-3.8-flash is paused)'
distractors:
type: array
maxItems: 10
items:
type: string
description: 'Bundled public servers whose tools the models see too, by name (bhived, context7, debugbase, filesystem, firecrawl, memory, notion, playwright). Default: none'
lang:
type: string
enum:
- en
- ja
description: 'The utterances'' language. Default: en; ja on Team'
name:
type: string
minLength: 1
maxLength: 100
required: []
securitySchemes:
apiKey:
type: http
scheme: bearer
description: 'An API key: fc_ci_… or fc_vendor_…'