| const openApiSpec = { |
| openapi: "3.0.3", |
| info: { |
| title: "CF Bypass Solver API", |
| description: "API for solving Cloudflare challenges including Turnstile captchas, WAF sessions, and proxy requests.", |
| version: "1.0.0" |
| }, |
| servers: [ |
| { |
| url: "/", |
| description: "Current server" |
| } |
| ], |
| paths: { |
| "/solver": { |
| get: { |
| summary: "Solver endpoint (GET)", |
| description: "Handle solver requests via GET method. The mode parameter determines which solver to use.", |
| parameters: [ |
| { $ref: "#/components/parameters/mode" }, |
| { $ref: "#/components/parameters/url" }, |
| { $ref: "#/components/parameters/authToken" }, |
| { $ref: "#/components/parameters/siteKey" } |
| ], |
| responses: { |
| 200: { $ref: "#/components/responses/SuccessResponse" }, |
| 400: { $ref: "#/components/responses/BadRequest" }, |
| 401: { $ref: "#/components/responses/Unauthorized" }, |
| 429: { $ref: "#/components/responses/TooManyRequests" }, |
| 500: { $ref: "#/components/responses/ServerError" } |
| } |
| }, |
| post: { |
| summary: "Solver endpoint (POST)", |
| description: "Handle solver requests via POST method. The mode parameter determines which solver to use.", |
| requestBody: { |
| required: true, |
| content: { |
| "application/json": { |
| schema: { $ref: "#/components/schemas/SolverRequest" } |
| } |
| } |
| }, |
| responses: { |
| 200: { $ref: "#/components/responses/SuccessResponse" }, |
| 400: { $ref: "#/components/responses/BadRequest" }, |
| 401: { $ref: "#/components/responses/Unauthorized" }, |
| 429: { $ref: "#/components/responses/TooManyRequests" }, |
| 500: { $ref: "#/components/responses/ServerError" } |
| } |
| } |
| }, |
| "/api-docs": { |
| get: { |
| summary: "OpenAPI Documentation UI", |
| description: "Interactive Swagger UI documentation for the API.", |
| responses: { |
| 200: { |
| description: "HTML page with Swagger UI" |
| } |
| } |
| } |
| }, |
| "/api-docs.json": { |
| get: { |
| summary: "OpenAPI JSON Specification", |
| description: "Returns the raw OpenAPI specification in JSON format.", |
| responses: { |
| 200: { |
| description: "OpenAPI specification", |
| content: { |
| "application/json": { |
| schema: { |
| type: "object" |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| }, |
| components: { |
| parameters: { |
| mode: { |
| name: "mode", |
| in: "query", |
| required: true, |
| description: "The solver mode to use", |
| schema: { |
| type: "string", |
| enum: ["source", "turnstile-min", "turnstile-max", "waf-session", "proxy-request"] |
| } |
| }, |
| url: { |
| name: "url", |
| in: "query", |
| required: true, |
| description: "Target URL to process", |
| schema: { |
| type: "string", |
| format: "uri" |
| } |
| }, |
| authToken: { |
| name: "authToken", |
| in: "query", |
| required: false, |
| description: "Authentication token (required if server has authToken configured)", |
| schema: { |
| type: "string" |
| } |
| }, |
| siteKey: { |
| name: "siteKey", |
| in: "query", |
| required: false, |
| description: "Turnstile site key (required for turnstile modes)", |
| schema: { |
| type: "string" |
| } |
| } |
| }, |
| schemas: { |
| SolverRequest: { |
| type: "object", |
| required: ["mode", "url"], |
| properties: { |
| mode: { |
| type: "string", |
| enum: ["source", "turnstile-min", "turnstile-max", "waf-session", "proxy-request"], |
| description: "The solver mode to use" |
| }, |
| url: { |
| type: "string", |
| format: "uri", |
| description: "Target URL to process" |
| }, |
| authToken: { |
| type: "string", |
| description: "Authentication token (required if server has authToken configured)" |
| }, |
| siteKey: { |
| type: "string", |
| description: "Turnstile site key (required for turnstile modes)" |
| }, |
| proxy: { |
| type: "object", |
| description: "Proxy configuration", |
| properties: { |
| host: { type: "string", description: "Proxy host" }, |
| port: { type: "integer", description: "Proxy port" }, |
| username: { type: "string", description: "Proxy username" }, |
| password: { type: "string", description: "Proxy password" } |
| } |
| }, |
| method: { |
| type: "string", |
| enum: ["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"], |
| description: "HTTP method for proxy-request mode" |
| }, |
| body: { |
| oneOf: [ |
| { type: "string" }, |
| { type: "object" } |
| ], |
| description: "Request body for proxy-request mode" |
| }, |
| headers: { |
| type: "object", |
| description: "Custom headers for the request" |
| }, |
| cookies: { |
| type: "array", |
| description: "Cookies to set for the request", |
| items: { |
| type: "object", |
| required: ["name", "value"], |
| properties: { |
| name: { type: "string" }, |
| value: { type: "string" }, |
| domain: { type: "string" }, |
| path: { type: "string" }, |
| secure: { type: "boolean" }, |
| httpOnly: { type: "boolean" }, |
| sameSite: { type: "string" } |
| } |
| } |
| }, |
| sessionHeaders: { |
| type: "object", |
| description: "Session headers for waf-session mode" |
| } |
| } |
| }, |
| SourceResponse: { |
| type: "object", |
| properties: { |
| code: { type: "integer", example: 200 }, |
| source: { type: "string", description: "Page source HTML" } |
| } |
| }, |
| TurnstileResponse: { |
| type: "object", |
| properties: { |
| code: { type: "integer", example: 200 }, |
| token: { type: "string", description: "Solved Turnstile token" } |
| } |
| }, |
| WafSessionResponse: { |
| type: "object", |
| properties: { |
| code: { type: "integer", example: 200 }, |
| cookies: { type: "array", items: { type: "object" } }, |
| headers: { type: "object" } |
| } |
| }, |
| ProxyRequestResponse: { |
| type: "object", |
| properties: { |
| code: { type: "integer", example: 200 }, |
| status: { type: "integer" }, |
| headers: { type: "object" }, |
| body: { type: "string" } |
| } |
| }, |
| ErrorResponse: { |
| type: "object", |
| properties: { |
| code: { type: "integer" }, |
| message: { type: "string" } |
| } |
| } |
| }, |
| responses: { |
| SuccessResponse: { |
| description: "Successful response. Content varies based on mode used.", |
| content: { |
| "application/json": { |
| schema: { |
| oneOf: [ |
| { $ref: "#/components/schemas/SourceResponse" }, |
| { $ref: "#/components/schemas/TurnstileResponse" }, |
| { $ref: "#/components/schemas/WafSessionResponse" }, |
| { $ref: "#/components/schemas/ProxyRequestResponse" } |
| ] |
| } |
| } |
| } |
| }, |
| BadRequest: { |
| description: "Invalid request parameters", |
| content: { |
| "application/json": { |
| schema: { |
| type: "object", |
| properties: { |
| code: { type: "integer", example: 400 }, |
| message: { type: "string", example: "Bad Request" }, |
| schema: { type: "array", items: { type: "object" } } |
| } |
| } |
| } |
| } |
| }, |
| Unauthorized: { |
| description: "Invalid or missing authentication token", |
| content: { |
| "application/json": { |
| schema: { $ref: "#/components/schemas/ErrorResponse" }, |
| example: { code: 401, message: "Unauthorized" } |
| } |
| } |
| }, |
| TooManyRequests: { |
| description: "Browser limit reached", |
| content: { |
| "application/json": { |
| schema: { $ref: "#/components/schemas/ErrorResponse" }, |
| example: { code: 429, message: "Too Many Requests" } |
| } |
| } |
| }, |
| ServerError: { |
| description: "Internal server error", |
| content: { |
| "application/json": { |
| schema: { $ref: "#/components/schemas/ErrorResponse" }, |
| example: { code: 500, message: "Error message" } |
| } |
| } |
| } |
| } |
| } |
| }; |
|
|
| module.exports = openApiSpec; |
|
|