{
  "openapi": "3.0.0",
  "info": {
    "title": "Context7 On-Premise API",
    "description": "REST API for the Context7 On-Premise server. Covers library parsing and documentation search.",
    "version": "1.0.0"
  },
  "servers": [
    {
      "url": "https://your-instance.example.com/api",
      "description": "Your on-premise deployment (replace with your actual host)"
    },
    {
      "url": "http://localhost:3000/api",
      "description": "Local development"
    }
  ],
  "paths": {
    "/v2/libs/search": {
      "get": {
        "summary": "Search for libraries",
        "description": "Search locally indexed libraries by name. Results may also include public libraries from Context7 Cloud depending on your policy settings.",
        "operationId": "searchLibraries",
        "tags": [
          "Search"
        ],
        "parameters": [
          {
            "name": "libraryName",
            "in": "query",
            "description": "Library name to search for (e.g., `react`, `nextjs`)",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 500
            },
            "example": "react"
          },
          {
            "name": "query",
            "in": "query",
            "description": "User's original question or task - used for relevance ranking",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 500
            },
            "example": "How to manage state with hooks"
          }
        ],
        "responses": {
          "200": {
            "description": "Search results ranked by relevance",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SearchResponse"
                },
                "example": {
                  "results": [
                    {
                      "id": "/your-org/your-repo",
                      "title": "Your Repo",
                      "description": "Internal tooling docs",
                      "totalSnippets": 150,
                      "source": "Local (Private)",
                      "trustScore": 10
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequestError"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "security": [
          {},
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/v2/context": {
      "get": {
        "summary": "Get documentation context",
        "description": "Retrieve documentation snippets for a library ranked by relevance to your query, formatted as plain text ready to inject into an LLM prompt. This is the endpoint MCP tools call internally.",
        "operationId": "getContext",
        "tags": [
          "Context"
        ],
        "parameters": [
          {
            "name": "libraryId",
            "in": "query",
            "description": "Library ID returned by `GET /v2/libs/search` (e.g., `/your-org/your-repo`)",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 500
            },
            "example": "/vercel/next.js"
          },
          {
            "name": "query",
            "in": "query",
            "description": "Natural language question or topic to retrieve context for",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 500
            },
            "example": "How do I use the app router?"
          }
        ],
        "responses": {
          "200": {
            "description": "Relevant documentation snippets as plain text",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                },
                "example": "### useRouter()\n\nSource: https://github.com/vercel/next.js/...\n\nThe `useRouter` hook allows you to programmatically change routes inside Client Components.\n\n--------------------------------\n\n### app/layout.tsx\n\n```tsx\nexport default function Layout({ children }) {\n  return <html><body>{children}</body></html>\n}\n```"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequestError"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "$ref": "#/components/responses/NotFoundError"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "security": [
          {},
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/parse": {
      "post": {
        "summary": "Parse a Git repository",
        "description": "Queue a GitHub or GitLab repository for parsing and indexing. Returns immediately with a queue position. Monitor progress with `GET /parse-status`.",
        "operationId": "parseRepo",
        "tags": [
          "Parse"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ParseRepoRequest"
              },
              "examples": {
                "minimal": {
                  "summary": "Minimal - index the whole repo",
                  "value": {
                    "repoUrl": "https://github.com/your-org/your-repo"
                  }
                },
                "withOptions": {
                  "summary": "With folder and branch filters",
                  "value": {
                    "repoUrl": "https://github.com/your-org/your-repo",
                    "branch": "main",
                    "folders": [
                      "docs"
                    ],
                    "excludeFolders": [
                      "node_modules"
                    ],
                    "force": false
                  }
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "$ref": "#/components/responses/ParseQueued"
          },
          "400": {
            "$ref": "#/components/responses/BadRequestError"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "security": [
          {},
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/parse-openapi": {
      "post": {
        "summary": "Parse an OpenAPI spec by URL",
        "description": "Queue a remote OpenAPI specification (JSON or YAML) for parsing and indexing.",
        "operationId": "parseOpenApi",
        "tags": [
          "Parse"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "openApiUrl"
                ],
                "properties": {
                  "openApiUrl": {
                    "type": "string",
                    "format": "uri",
                    "description": "URL of a JSON or YAML OpenAPI specification"
                  },
                  "projectTitle": {
                    "type": "string",
                    "description": "Display name for the project"
                  },
                  "description": {
                    "type": "string",
                    "description": "Short description shown in the library list"
                  },
                  "force": {
                    "type": "boolean",
                    "description": "Re-parse even if already indexed",
                    "default": false
                  }
                }
              },
              "example": {
                "openApiUrl": "https://example.com/openapi.json",
                "projectTitle": "My API"
              }
            }
          }
        },
        "responses": {
          "202": {
            "$ref": "#/components/responses/ParseQueued"
          },
          "400": {
            "$ref": "#/components/responses/BadRequestError"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "security": [
          {},
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/parse-openapi-upload": {
      "post": {
        "summary": "Upload an OpenAPI spec file",
        "description": "Upload an OpenAPI specification file directly for parsing and indexing.",
        "operationId": "parseOpenApiUpload",
        "tags": [
          "Parse"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "openapiFile"
                ],
                "properties": {
                  "openapiFile": {
                    "type": "string",
                    "format": "binary",
                    "description": "A `.json` or `.yaml` OpenAPI specification file"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "$ref": "#/components/responses/ParseQueued"
          },
          "400": {
            "$ref": "#/components/responses/BadRequestError"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "security": [
          {},
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/import-libraries": {
      "post": {
        "summary": "Import a library bundle",
        "description": "Import pre-parsed libraries into an airgapped on-premise install. Accepts either a Context7 Cloud export `.zip` (`multipart/form-data`) or a JSON body (`application/json`) for programmatic clients. Requires a personal API key (or an admin session). Each library is queued as its own job and its snippets are re-embedded locally with this install's configured provider. Available only on installs running an **offline (airgapped) license**.",
        "operationId": "importLibraries",
        "tags": [
          "Parse"
        ],
        "parameters": [
          {
            "name": "force",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false
            },
            "description": "Overwrite libraries that already exist. Handy when posting a piped export body, which carries no `force` field. Without it, existing libraries are skipped."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ImportLibrariesRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "bundleFile"
                ],
                "properties": {
                  "bundleFile": {
                    "type": "string",
                    "format": "binary",
                    "description": "A Context7 Cloud `context7-libraries.zip` export (up to 100 MB)"
                  },
                  "force": {
                    "type": "boolean",
                    "description": "Overwrite libraries that already exist on this install",
                    "default": false
                  }
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "$ref": "#/components/responses/LibrariesImported"
          },
          "400": {
            "$ref": "#/components/responses/BadRequestError"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "403": {
            "$ref": "#/components/responses/ForbiddenError"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/parse-website": {
      "post": {
        "summary": "Parse a website",
        "description": "Crawl and index a public website starting from the given URL.",
        "operationId": "parseWebsite",
        "tags": [
          "Parse"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "websiteUrl"
                ],
                "properties": {
                  "websiteUrl": {
                    "type": "string",
                    "format": "uri",
                    "description": "Root URL to start crawling from"
                  },
                  "projectTitle": {
                    "type": "string",
                    "description": "Display name for the project"
                  },
                  "description": {
                    "type": "string",
                    "description": "Short description shown in the library list"
                  },
                  "maxPages": {
                    "type": "integer",
                    "description": "Maximum number of pages to crawl",
                    "default": 100
                  },
                  "maxDepth": {
                    "type": "integer",
                    "description": "Maximum link depth from the root URL",
                    "default": 3
                  },
                  "excludePatterns": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "URL path patterns to skip (e.g., `/blog/*`)"
                  },
                  "force": {
                    "type": "boolean",
                    "description": "Re-crawl even if already indexed",
                    "default": false
                  }
                }
              },
              "example": {
                "websiteUrl": "https://docs.example.com",
                "maxPages": 50
              }
            }
          }
        },
        "responses": {
          "202": {
            "$ref": "#/components/responses/ParseQueued"
          },
          "400": {
            "$ref": "#/components/responses/BadRequestError"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "security": [
          {},
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/projects/{projectId}/refresh": {
      "post": {
        "summary": "Refresh a library",
        "description": "Re-parse an existing library using its stored settings. Returns immediately with a queue position.\n\nNot available for:\n- Libraries imported from Context7 Cloud (re-import an updated bundle instead)\n- Uploaded OpenAPI files (re-upload the file instead)",
        "operationId": "refreshProject",
        "tags": [
          "Parse"
        ],
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Project identifier without the leading slash. For repositories use `owner/repo` (e.g. `upstash/ratelimit-js`). For websites use `websites/hostname` (e.g. `websites/upstash`). For OpenAPI specs use `openapi/derived-name`.",
            "schema": {
              "type": "string"
            },
            "example": "upstash/ratelimit-js"
          }
        ],
        "responses": {
          "202": {
            "$ref": "#/components/responses/ParseQueued"
          },
          "400": {
            "description": "Bad Request - refresh not available for this project type",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "imported": {
                    "summary": "Imported library",
                    "value": {
                      "error": "Refresh isn't available for imported libraries. Re-import an updated export from Context7 Cloud to update it."
                    }
                  },
                  "uploadedFile": {
                    "summary": "Uploaded OpenAPI file",
                    "value": {
                      "error": "Refresh not available for uploaded OpenAPI files. Re-upload the same file to update."
                    }
                  },
                  "noToken": {
                    "summary": "No git token configured",
                    "value": {
                      "error": "No git token configured for GitHub. Configure a GitHub App or set a personal access token."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFoundError"
          },
          "409": {
            "description": "Conflict - a parse job is already active or queued for this project",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "This project is already queued",
                  "project": "/upstash/ratelimit-js",
                  "status": "queued"
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "security": [
          {},
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/parse-status": {
      "get": {
        "summary": "Get parse status",
        "description": "Returns the current status of all active and queued parse jobs.",
        "operationId": "getParseStatus",
        "tags": [
          "Parse"
        ],
        "responses": {
          "200": {
            "description": "Active parse jobs and their status",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ParseStatusResponse"
                },
                "example": {
                  "activeParses": {
                    "/your-org/your-repo": {
                      "status": "parsing",
                      "startedAt": "2025-01-01T12:00:00.000Z",
                      "duration": 8.6,
                      "statusMessage": "Scanning 16 files"
                    },
                    "/other-org/other-repo": {
                      "status": "queued",
                      "position": 1,
                      "createdAt": "2025-01-01T12:00:01.000Z"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "security": [
          {},
          {
            "bearerAuth": []
          }
        ]
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "description": "API key generated from Personal Settings. See [Authentication](/enterprise/api/authentication#creating-an-api-key)."
      }
    },
    "schemas": {
      "Library": {
        "type": "object",
        "description": "An indexed library",
        "properties": {
          "id": {
            "type": "string",
            "description": "Library ID to pass to `GET /v2/context`",
            "example": "/your-org/your-repo"
          },
          "title": {
            "type": "string",
            "description": "Display name",
            "example": "Your Repo"
          },
          "description": {
            "type": "string",
            "description": "Short description",
            "example": "Internal tooling docs"
          },
          "totalSnippets": {
            "type": "integer",
            "description": "Number of indexed snippets",
            "example": 150
          },
          "source": {
            "type": "string",
            "description": "Where the library was indexed from",
            "example": "Local (Private)"
          },
          "trustScore": {
            "type": "integer",
            "description": "Source reputation score (0–10)",
            "example": 10
          }
        }
      },
      "SearchResponse": {
        "type": "object",
        "properties": {
          "results": {
            "type": "array",
            "description": "Matching libraries ranked by relevance",
            "items": {
              "$ref": "#/components/schemas/Library"
            }
          }
        },
        "required": [
          "results"
        ]
      },
      "ParseQueuedResponse": {
        "type": "object",
        "properties": {
          "message": {
            "type": "string",
            "example": "Parse queued"
          },
          "project": {
            "type": "string",
            "description": "Project identifier assigned to this library (e.g. `/your-org/your-repo`)",
            "example": "/your-org/your-repo"
          },
          "queueId": {
            "type": "integer",
            "description": "Numeric ID for this parse job",
            "example": 5
          },
          "position": {
            "type": "integer",
            "nullable": true,
            "description": "Position in the queue. `null` if the job started immediately",
            "example": 1
          }
        },
        "required": [
          "message",
          "project",
          "queueId"
        ]
      },
      "ImportLibrariesRequest": {
        "type": "object",
        "required": [
          "libraries"
        ],
        "properties": {
          "libraries": {
            "type": "array",
            "description": "The libraries to import. Each carries its full snippet content; embeddings are recomputed on this install.",
            "items": {
              "$ref": "#/components/schemas/ImportLibrary"
            }
          },
          "force": {
            "type": "boolean",
            "description": "Overwrite libraries that already exist on this install",
            "default": false
          }
        }
      },
      "ImportLibrary": {
        "type": "object",
        "required": [
          "project",
          "codeSnippets",
          "infoSnippets"
        ],
        "properties": {
          "project": {
            "type": "string",
            "description": "Library identifier, e.g. `/your-org/your-repo`",
            "example": "/vercel/next.js"
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "description": "Source type of the library (e.g. `repo`, `website`, `openapi`)"
          },
          "language": {
            "type": "string",
            "example": "English"
          },
          "branch": {
            "type": "string"
          },
          "docsRepoUrl": {
            "type": "string"
          },
          "docsSiteUrl": {
            "type": "string"
          },
          "totalTokens": {
            "type": "integer"
          },
          "codeSnippets": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                },
                "language": {
                  "type": "string"
                },
                "codeList": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "language": {
                        "type": "string"
                      },
                      "code": {
                        "type": "string"
                      }
                    }
                  }
                },
                "tokens": {
                  "type": "integer"
                }
              }
            }
          },
          "infoSnippets": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "content": {
                  "type": "string"
                },
                "breadcrumb": {
                  "type": "string"
                },
                "tokens": {
                  "type": "integer"
                }
              }
            }
          }
        }
      },
      "LibrariesImportedResponse": {
        "type": "object",
        "properties": {
          "message": {
            "type": "string",
            "example": "Queued 2 libraries for import"
          },
          "queued": {
            "type": "array",
            "description": "Library identifiers queued for import",
            "items": {
              "type": "string"
            },
            "example": [
              "/vercel/next.js",
              "/facebook/react"
            ]
          },
          "skipped": {
            "type": "array",
            "description": "Libraries that were not imported, with a reason",
            "items": {
              "type": "object",
              "properties": {
                "project": {
                  "type": "string"
                },
                "reason": {
                  "type": "string",
                  "example": "already exists"
                }
              }
            }
          }
        },
        "required": [
          "message",
          "queued",
          "skipped"
        ]
      },
      "ParseRepoRequest": {
        "type": "object",
        "required": [
          "repoUrl"
        ],
        "properties": {
          "repoUrl": {
            "type": "string",
            "format": "uri",
            "description": "HTTPS URL of the GitHub or GitLab repository"
          },
          "branch": {
            "type": "string",
            "description": "Branch to parse. Defaults to the repository's default branch"
          },
          "folders": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Only index files under these paths. Empty means the entire repository"
          },
          "excludeFolders": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Paths to skip during indexing"
          },
          "excludeFiles": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Glob patterns for files to exclude"
          },
          "force": {
            "type": "boolean",
            "description": "Re-parse even if the current commit is already indexed",
            "default": false
          }
        }
      },
      "ParseJobStatus": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "queued",
              "parsing",
              "finalizing"
            ],
            "description": "Current job status"
          },
          "position": {
            "type": "integer",
            "description": "Queue position. Only present when `status` is `queued`"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO 8601 timestamp when the job was queued. Only present when `status` is `queued`"
          },
          "startedAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO 8601 timestamp when the job began running. Only present when `status` is `parsing` or `finalizing`"
          },
          "duration": {
            "type": "number",
            "description": "Elapsed seconds since the job started. Only present when `status` is `parsing` or `finalizing`"
          },
          "statusMessage": {
            "type": "string",
            "description": "Human-readable progress detail (e.g. `Scanning 16 files`). Only present when `status` is `parsing`"
          }
        },
        "required": [
          "status"
        ]
      },
      "ParseStatusResponse": {
        "type": "object",
        "properties": {
          "activeParses": {
            "type": "object",
            "description": "Map of project name to its current parse job status",
            "additionalProperties": {
              "$ref": "#/components/schemas/ParseJobStatus"
            }
          }
        },
        "required": [
          "activeParses"
        ]
      },
      "Error": {
        "type": "object",
        "properties": {
          "error": {
            "type": "string",
            "description": "Human-readable error description"
          }
        },
        "required": [
          "error"
        ]
      }
    },
    "responses": {
      "ParseQueued": {
        "description": "Parse job accepted and queued",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ParseQueuedResponse"
            }
          }
        }
      },
      "LibrariesImported": {
        "description": "Libraries accepted and queued for import",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/LibrariesImportedResponse"
            }
          }
        }
      },
      "ForbiddenError": {
        "description": "Forbidden - the action is not permitted for this install or user",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": "Library import is available only with an offline license."
            }
          }
        }
      },
      "BadRequestError": {
        "description": "Bad Request - invalid or missing parameters",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": "repoUrl is required"
            }
          }
        }
      },
      "UnauthorizedError": {
        "description": "Unauthorized - authentication required",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": "Authentication required"
            }
          }
        }
      },
      "NotFoundError": {
        "description": "Not Found - library does not exist",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": "Project not found"
            }
          }
        }
      },
      "InternalServerError": {
        "description": "Internal Server Error",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": "An unexpected error occurred"
            }
          }
        }
      }
    }
  },
  "tags": [
    {
      "name": "Search",
      "description": "Search indexed libraries"
    },
    {
      "name": "Context",
      "description": "Retrieve documentation context for queries"
    },
    {
      "name": "Parse",
      "description": "Parse and index new libraries"
    }
  ]
}