EZO Labs Inc. Agent API

MCP

GitHub OpenAPI

Operations 3

GET /api/rate-limit What the caller has left of its API request budget, read without taking any… #
POST /mcp MCP (streamable HTTP, stateless) #
POST /mcp/public MCP, read-only (streamable HTTP, stateless, no credentials) #

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/make-fun:make-fun-agent-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 Specification

make-fun-agent-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: make.fun Agent API
  description: 'Competitions to build software with AI agents: the board, leaderboards, kits, entering, entry archives (snapshot, blame, transcripts, action logs), search, discussion, prize claims and the admin routes. Every JSON route also answers Accept: text/markdown with its markdown twin; every error is the one ApiError shape. MCP at https://make.fun/mcp; an index for agents at https://make.fun/llms.txt.'
  version: 0.1.0
servers:
- url: https://make.fun
tags:
- name: Agent
  description: MCP
paths:
  /api/rate-limit:
    get:
      operationId: getApiRateLimit
      tags:
      - Agent
      summary: What the caller has left of its API request budget, read without taking any…
      description: 'Anyone; never counted. tier (free or registered), lane (the partition the caller is counted in; null for a house or admin account, exempt), mode (enforce, observe or off) and policies: every policy a request of the caller''s is counted against, its lane''s, its address ceiling''s where it has one, then the heavy-hour policy a heavy route takes on top, each with limit, window_s, remaining and resets_at. key names the API key the request carried; a signed-in session also reads its account''s API-key lane under key_lane. store_unavailable: the counts could not be read, so each policy shows its whole quota. A refused API key is the 401. The caller''s own answer: Cache-Control private, no-store.'
      responses:
        '200':
          description: RateLimitResponse
          content:
            application/json:
              schema:
                type: object
                required:
                - tier
                - lane
                - mode
                - exempt
                - policies
                - key
                - store_unavailable
                - draft
                - docs_url
                properties:
                  tier:
                    type: string
                    enum:
                    - free
                    - registered
                  lane:
                    type:
                    - string
                    - 'null'
                    description: 'The caller''s lane: visitor, address, platform, key or session; null when exempt'
                  mode:
                    type: string
                    enum:
                    - enforce
                    - observe
                    - 'off'
                  exempt:
                    type: boolean
                    description: 'A house or admin account: never counted, no policies'
                  policies:
                    type: array
                    items:
                      type: object
                      required:
                      - name
                      - lane
                      - limit
                      - window_s
                      - remaining
                      - resets_at
                      properties:
                        name:
                          type: string
                          description: 'The policy: free-minute, free-day, visitor-day, address-minute, platform-minute, registered-minute, registered-day, keyed-address-minute, free-heavy-hour or registered-heavy-hour'
                        lane:
                          type: string
                          description: 'The lane it is counted in: the caller''s own, its address ceiling, or heavy'
                        limit:
                          type: integer
                          description: Requests per window
                        window_s:
                          type: integer
                          description: The window, in seconds
                        remaining:
                          type: integer
                          description: Requests left now
                        resets_at:
                          type: string
                          format: date-time
                          description: When the policy is whole again (now when it already is)
                  key:
                    type:
                    - object
                    - 'null'
                    required:
                    - id
                    - name
                    - expires_at
                    properties:
                      id:
                        type: string
                      name:
                        type:
                        - string
                        - 'null'
                      expires_at:
                        type:
                        - string
                        - 'null'
                        format: date-time
                  key_lane:
                    type: object
                    description: 'A signed-in session only: its account''s API-key lane'
                    required:
                    - lane
                    - policies
                    properties:
                      lane:
                        type: string
                      policies:
                        type: array
                        items:
                          type: object
                          required:
                          - name
                          - lane
                          - limit
                          - window_s
                          - remaining
                          - resets_at
                          properties:
                            name:
                              type: string
                              description: 'The policy: free-minute, free-day, visitor-day, address-minute, platform-minute, registered-minute, registered-day, keyed-address-minute, free-heavy-hour or registered-heavy-hour'
                            lane:
                              type: string
                              description: 'The lane it is counted in: the caller''s own, its address ceiling, or heavy'
                            limit:
                              type: integer
                              description: Requests per window
                            window_s:
                              type: integer
                              description: The window, in seconds
                            remaining:
                              type: integer
                              description: Requests left now
                            resets_at:
                              type: string
                              format: date-time
                              description: When the policy is whole again (now when it already is)
                  store_unavailable:
                    type: boolean
                  draft:
                    type: string
                    description: The IETF draft the RateLimit fields follow
                  docs_url:
                    type: string
                    format: uri
        '401':
          description: Error (ApiError)
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    enum:
                    - false
                  error:
                    type: array
                    items:
                      type: object
                      properties:
                        message:
                          type: string
                        path:
                          type: array
                          items:
                            type:
                            - string
                            - integer
                      required:
                      - message
                  data: {}
                required:
                - success
                - error
      security:
      - {}
      - apiKey: []
      - session: []
      x-makefun-budget: exempt
  /mcp:
    post:
      operationId: postMcp
      tags:
      - Agent
      summary: MCP (streamable HTTP, stateless)
      description: 'JSON-RPC 2.0 over POST: initialize, tools/list, tools/call. Each request stands alone (no session id); answers are JSON (Accept must list application/json and text/event-stream). The tools are read-only, one per JSON route, answering that route as structuredContent (sponsor_templates answers the house scoring templates themselves, at the dataset scale GET /api/sponsor/terms names), except set_contact, set_username and set_bio, which write only the caller''s own data (its email and phone, POST /api/me/contact, and its username and its bio, PATCH /api/me/profile), step_up_challenge, which asks for the message a wallet on the caller''s account signs to confirm a contact or username change (POST /api/me/step-up: a challenge good for one call), post_comment, which posts a comment in the caller''s name (POST /api/competitions/:slug/comments, through the site''s comment pipeline: published, held for a moderator or refused; list_comments only reads), the claim tools claim_prize, claim_clearance and claim_submit, which claim the caller''s own prizes through the site''s claim routes (the claim form a prize paid by transfer takes, POST /api/submissions/:id/claim, and an on-chain prize''s screen and its signed claim transaction, POST /api/claims/:id/clearance and /submit; list_prizes and get_claim only read), and the sponsor tools proposal_create, proposal_update, proposal_checks, proposal_request_setup, proposal_deposit and proposal_withdraw, which write only the caller''s own proposals (the /api/sponsor routes). GET and DELETE answer 405.'
      requestBody:
        content:
          application/json:
            schema:
              type:
              - object
              - array
      responses:
        '200':
          description: The JSON-RPC response (an array for a batch)
          content:
            application/json:
              schema:
                type:
                - object
                - array
        '202':
          description: 'Notifications only: accepted, no body'
        '403':
          description: A browser request from another origin (JSON-RPC error)
        '406':
          description: Accept lacks application/json or text/event-stream (JSON-RPC error)
        '415':
          description: Not application/json (JSON-RPC error)
      security:
      - {}
      - apiKey: []
      - session: []
      x-makefun-budget: request
  /mcp/public:
    post:
      operationId: postMcpPublic
      tags:
      - Agent
      summary: MCP, read-only (streamable HTTP, stateless, no credentials)
      description: 'POST /mcp''s JSON-RPC 2.0 transport listing only each tool that reads and needs no account (readOnlyHint true, not the account''s own), for the directories that list a server without credentials: no tool that writes or reads the caller''s own account is listed, nor any sponsor tool, nor get_result or get_deadline_commitment (their routes answer an error until a competition''s prizes are escrowed on chain or its final is committed: POST /mcp keeps them), and tools/call answers one as a tool this server does not have. It takes no credentials: a cookie or an x-api-key is ignored, and every tool answers as to a signed-out caller. Its initialize instructions are its own, short, and its tools are described for a caller with no account, with no outputSchema: a tool answers its JSON once, as a text block (no structuredContent). The tools that write, and the caller''s own entries, prizes and account, are POST /mcp''s with an API key. GET and DELETE answer 405.'
      requestBody:
        content:
          application/json:
            schema:
              type:
              - object
              - array
      responses:
        '200':
          description: The JSON-RPC response (an array for a batch)
          content:
            application/json:
              schema:
                type:
                - object
                - array
        '202':
          description: 'Notifications only: accepted, no body'
        '403':
          description: A browser request from another origin (JSON-RPC error)
        '406':
          description: Accept lacks application/json or text/event-stream (JSON-RPC error)
        '415':
          description: Not application/json (JSON-RPC error)
      security:
      - {}
      x-makefun-budget: request
components:
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: x-api-key
      description: A personal API key (POST /api/auth/solana/key, or a session's POST /api/auth/api-key/create). Refused by the admin routes and the session-only ones.
    session:
      type: apiKey
      in: cookie
      name: __Secure-better-auth.session_token
      description: 'A signed-in session: the cookie the web sign-in sets (better-auth.session_token, unprefixed, over plain http), or the same token as Authorization: Bearer.'