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/ayushrai-site:ayushrai-site-projects-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
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: Ayush Rai public Projects API
version: 1.0.0
description: 'Read-only API over the same public content as Ayush Rai''s website. Unverified award metrics are omitted. There is no separate dataset for this API.
Access: Free and public. No account or API key is needed because every endpoint is read-only over published content. There is no separate test environment or paid tier. Clients may cache responses for five minutes. REST responses grant CORS only to the site''s own origins, so call the REST API from a server, an agent, or the CLI rather than from a browser page on another site. The MCP endpoint and its Server Card allow any origin.
Rate limits: 60 requests per 60 seconds per client address, counted per server instance. Every response carries RateLimit-Policy and RateLimit headers (draft-ietf-httpapi-ratelimit-headers-11). Over the limit, the API returns 429 with a Retry-After header in seconds and error code rate_limited.
Errors: every error body is { "error": { "code", "message", "hint", "docs" } }. code is stable; hint says how to fix the request.
Versioning: Versioned in the URL path. /api/v1 is stable: fields may be added, but none are removed or renamed. Breaking changes ship under a new path such as /api/v2. A replaced version keeps working for at least 90 days; during that window its responses carry Deprecation and Sunset headers and a Link with rel="successor-version", and the dates are listed on /developers. The unversioned /api/search and /api/projects are aliases of v1 and follow the same policy. No version is deprecated today.
MCP: the same project and search tools are available over Streamable HTTP at POST /api/mcp. Its Server Card is at GET /api/mcp/server-card.'
contact:
name: Ayush Rai
email: ayushrai0211@gmail.com
url: https://www.ayushrai.site/developers/
servers:
- url: https://www.ayushrai.site
security: []
tags:
- name: Projects
paths:
/api/projects:
get:
operationId: projects
summary: List, fetch, or compare public projects
description: v1 alias. No query lists projects in pages, like /api/v1/projects. slug returns one project. compare accepts 2 to 4 comma-separated slugs.
parameters:
- name: category
in: query
required: false
schema:
type: string
enum:
- tooling
- education
- client
- studio
- web
- personal
- data
- name: type
in: query
required: false
schema:
type: string
enum:
- product
- project
- client
- experiment
- open-source
- name: limit
in: query
required: false
schema:
type: integer
minimum: 1
maximum: 20
- name: archive
in: query
required: false
description: Pass 1 to include archived projects.
schema:
type: string
enum:
- '1'
- name: cursor
in: query
required: false
description: Opaque nextCursor from the previous page. Omit for the first page.
schema:
type: string
- name: slug
in: query
required: false
schema:
type: string
- name: compare
in: query
required: false
description: Comma-separated slugs, two to four
schema:
type: string
- name: slugs
in: query
required: false
description: Same as compare; read only when compare is absent.
schema:
type: string
responses:
'200':
description: A page of projects, one project, or a comparison
headers:
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimitPolicy'
content:
application/json:
schema:
$ref: '#/components/schemas/ProjectsAliasResponse'
'400':
description: Invalid query, filter, slug, cursor, or compare list. error.code is one of invalid_query, invalid_slug, invalid_filter, invalid_compare, invalid_cursor.
headers:
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimitPolicy'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'404':
description: Unknown or archived slug. error.code is not_found.
headers:
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimitPolicy'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'405':
description: Unsupported HTTP method. error.code is method_not_allowed. REST accepts GET, HEAD, and OPTIONS.
headers:
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimitPolicy'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'429':
description: Rate limit exceeded. error.code is rate_limited.
headers:
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimitPolicy'
Retry-After:
$ref: '#/components/headers/RetryAfter'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Unexpected server fault, not a problem with the request. error.code is internal_error.
headers:
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimitPolicy'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
tags:
- Projects
/api/v1/projects:
get:
operationId: listProjectsV1
summary: List public projects
description: Active projects by default. Pass archive=1 to include archived records. Maximum limit is 20 when set; the default page is 50. Page with cursor and nextCursor.
parameters:
- name: category
in: query
required: false
schema:
type: string
enum:
- tooling
- education
- client
- studio
- web
- personal
- data
- name: type
in: query
required: false
schema:
type: string
enum:
- product
- project
- client
- experiment
- open-source
- name: limit
in: query
required: false
schema:
type: integer
minimum: 1
maximum: 20
- name: archive
in: query
required: false
description: Pass 1 to include archived projects.
schema:
type: string
enum:
- '1'
- name: cursor
in: query
required: false
description: Opaque nextCursor from the previous page. Omit for the first page.
schema:
type: string
responses:
'200':
description: One page of projects
headers:
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimitPolicy'
content:
application/json:
schema:
$ref: '#/components/schemas/ProjectListResponse'
'400':
description: Invalid query, filter, slug, cursor, or compare list. error.code is one of invalid_query, invalid_slug, invalid_filter, invalid_compare, invalid_cursor.
headers:
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimitPolicy'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'405':
description: Unsupported HTTP method. error.code is method_not_allowed. REST accepts GET, HEAD, and OPTIONS.
headers:
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimitPolicy'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'429':
description: Rate limit exceeded. error.code is rate_limited.
headers:
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimitPolicy'
Retry-After:
$ref: '#/components/headers/RetryAfter'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Unexpected server fault, not a problem with the request. error.code is internal_error.
headers:
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimitPolicy'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
tags:
- Projects
/api/v1/projects/{slug}:
get:
operationId: getProjectV1
summary: Fetch one public project
parameters:
- name: slug
in: path
required: true
schema:
type: string
pattern: ^[a-z0-9]+(?:-[a-z0-9]+)*$
- name: archive
in: query
required: false
description: Pass 1 to include archived projects.
schema:
type: string
enum:
- '1'
responses:
'200':
description: One project
headers:
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimitPolicy'
content:
application/json:
schema:
$ref: '#/components/schemas/ProjectResponse'
'400':
description: Invalid query, filter, slug, cursor, or compare list. error.code is one of invalid_query, invalid_slug, invalid_filter, invalid_compare, invalid_cursor.
headers:
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimitPolicy'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'404':
description: Unknown or archived slug. error.code is not_found.
headers:
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimitPolicy'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'405':
description: Unsupported HTTP method. error.code is method_not_allowed. REST accepts GET, HEAD, and OPTIONS.
headers:
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimitPolicy'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'429':
description: Rate limit exceeded. error.code is rate_limited.
headers:
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimitPolicy'
Retry-After:
$ref: '#/components/headers/RetryAfter'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Unexpected server fault, not a problem with the request. error.code is internal_error.
headers:
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimitPolicy'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
tags:
- Projects
components:
headers:
RetryAfter:
description: Seconds to wait before retrying.
schema:
type: integer
minimum: 1
RateLimit:
description: Remaining quota and seconds until reset, for example "default";r=59;t=60.
schema:
type: string
RateLimitPolicy:
description: 'Quota policy: "default";q=60;w=60.'
schema:
type: string
schemas:
NextCursor:
type:
- string
- 'null'
description: Pass as cursor to fetch the next page. null means this is the last page. Treat it as opaque.
CompareResponse:
type: object
required:
- projects
- missing
properties:
projects:
type: array
items:
$ref: '#/components/schemas/PublicProject'
missing:
type: array
items:
type: string
description: Requested slugs with no public project
ErrorResponse:
type: object
required:
- error
properties:
error:
type: object
required:
- code
- message
- hint
- docs
properties:
code:
type: string
enum:
- invalid_query
- invalid_slug
- invalid_filter
- invalid_compare
- invalid_cursor
- not_found
- route_not_found
- method_not_allowed
- rate_limited
- internal_error
message:
type: string
description: What was wrong with this request
hint:
type: string
description: How to fix the request
docs:
type: string
format: uri
ProjectResponse:
type: object
required:
- project
properties:
project:
$ref: '#/components/schemas/PublicProject'
ProjectListResponse:
type: object
required:
- projects
- count
- nextCursor
properties:
projects:
type: array
items:
$ref: '#/components/schemas/PublicProject'
count:
type: integer
description: Number of projects in this page
nextCursor:
$ref: '#/components/schemas/NextCursor'
PublicProject:
type: object
required:
- slug
- title
- summary
- type
- category
- status
- yearStart
- technologies
- archive
- pagePath
- htmlUrl
properties:
slug:
type: string
title:
type: string
summary:
type: string
type:
type: string
enum:
- product
- project
- client
- experiment
- open-source
category:
type: string
enum:
- tooling
- education
- client
- studio
- web
- personal
- data
status:
type: string
yearStart:
type: integer
yearEnd:
oneOf:
- type: integer
- type: string
const: present
technologies:
type: array
items:
type: string
links:
type: object
properties:
demo:
type: string
format: uri
github:
type: string
format: uri
archive:
type: boolean
workPath:
type: string
description: On-site case study, when one exists
pagePath:
type: string
htmlUrl:
type: string
format: uri
ProjectsAliasResponse:
oneOf:
- $ref: '#/components/schemas/ProjectListResponse'
- $ref: '#/components/schemas/ProjectResponse'
- $ref: '#/components/schemas/CompareResponse'
externalDocs:
description: Developer notes
url: https://www.ayushrai.site/developers/