ayushrai-site Projects API

The Projects API from ayushrai-site — 3 operation(s) for projects.

Operations 3

GET /api/projects List, fetch, or compare public projects #
GET /api/v1/projects List public projects #
GET /api/v1/projects/{slug} Fetch one public project #

Work with this as data

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 Specification

ayushrai-site-projects-api-openapi.yml Raw ↑
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/