{
  "openapi": "3.0.3",
  "info": {
    "title": "Website Screenshot API",
    "version": "1.0.0",
    "description": "Capture full-page or viewport screenshots of any public URL using Playwright. Supports PNG, JPEG, and WebP formats; desktop/mobile/tablet viewport presets or custom dimensions; optional dark mode, ad blocking, and waitForSelector; configurable quality and timeout. GET returns binary image directly; POST accepts JSON body for full option control. Response can be raw binary (for direct use in responses) or base64 JSON.\n",
    "contact": {
      "name": "Screenshot API Support",
      "email": "api@hiroapp.cc"
    }
  },
  "servers": [
    {
      "url": "https://api.sprytools.com/v1/screenshot",
      "description": "Production (SpryTools API Gateway)"
    }
  ],
  "tags": [
    {
      "name": "Screenshot",
      "description": "Capture website screenshots"
    }
  ],
  "security": [
    {
      "ApiKeyHeader": []
    },
    {
      "RapidApiProxy": []
    }
  ],
  "paths": {
    "/api/v1/screenshot": {
      "get": {
        "operationId": "screenshotGet",
        "summary": "Capture a screenshot (GET)",
        "description": "Take a screenshot of the specified URL. Returns the image as binary by default (set `responseType=base64` for a JSON response with base64-encoded image).\n",
        "tags": [
          "Screenshot"
        ],
        "parameters": [
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "URL to screenshot (http or https only)",
            "schema": {
              "type": "string",
              "format": "uri"
            },
            "example": "https://example.com"
          },
          {
            "name": "viewport",
            "in": "query",
            "required": false,
            "description": "Viewport preset or custom dimensions",
            "schema": {
              "type": "string",
              "default": "desktop"
            },
            "example": "desktop"
          },
          {
            "name": "format",
            "in": "query",
            "required": false,
            "description": "Image format",
            "schema": {
              "type": "string",
              "enum": [
                "png",
                "jpeg",
                "webp"
              ],
              "default": "png"
            }
          },
          {
            "name": "fullPage",
            "in": "query",
            "required": false,
            "description": "Capture full scrollable page (default false = viewport only)",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "timeout",
            "in": "query",
            "required": false,
            "description": "Page load timeout in milliseconds (1000–30000)",
            "schema": {
              "type": "integer",
              "default": 10000,
              "minimum": 1000,
              "maximum": 30000
            }
          },
          {
            "name": "quality",
            "in": "query",
            "required": false,
            "description": "JPEG/WebP quality (1–100)",
            "schema": {
              "type": "integer",
              "default": 85,
              "minimum": 1,
              "maximum": 100
            }
          },
          {
            "name": "darkMode",
            "in": "query",
            "required": false,
            "description": "Enable dark mode emulation",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "blockAds",
            "in": "query",
            "required": false,
            "description": "Block ad network requests",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "waitForSelector",
            "in": "query",
            "required": false,
            "description": "CSS selector to wait for before capturing",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "responseType",
            "in": "query",
            "required": false,
            "description": "Response format — binary (image) or base64 (JSON with base64 data)",
            "schema": {
              "type": "string",
              "enum": [
                "binary",
                "base64"
              ],
              "default": "binary"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Screenshot image",
            "content": {
              "image/png": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "image/jpeg": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "image/webp": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ScreenshotBase64Result"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "408": {
            "$ref": "#/components/responses/Timeout"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "post": {
        "operationId": "screenshotPost",
        "summary": "Capture a screenshot (POST, full options)",
        "description": "Same as GET but accepts all parameters as a JSON body.",
        "tags": [
          "Screenshot"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ScreenshotRequest"
              },
              "example": {
                "url": "https://example.com",
                "viewport": "mobile",
                "format": "jpeg",
                "fullPage": true,
                "quality": 90,
                "darkMode": true,
                "blockAds": true,
                "responseType": "base64"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Screenshot image or base64 JSON",
            "content": {
              "image/png": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "image/jpeg": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "image/webp": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ScreenshotBase64Result"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "408": {
            "$ref": "#/components/responses/Timeout"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "ApiKeyHeader": {
        "type": "apiKey",
        "in": "header",
        "name": "x-api-key"
      },
      "RapidApiProxy": {
        "type": "apiKey",
        "in": "header",
        "name": "x-rapidapi-proxy-secret"
      }
    },
    "schemas": {
      "ScreenshotRequest": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri"
          },
          "viewport": {
            "type": "string",
            "default": "desktop",
            "description": "Preset: desktop (1280×720), mobile (375×812), tablet (768×1024), or object {width, height}"
          },
          "format": {
            "type": "string",
            "enum": [
              "png",
              "jpeg",
              "webp"
            ],
            "default": "png"
          },
          "fullPage": {
            "type": "boolean",
            "default": false
          },
          "timeout": {
            "type": "integer",
            "default": 10000,
            "minimum": 1000,
            "maximum": 30000
          },
          "quality": {
            "type": "integer",
            "default": 85,
            "minimum": 1,
            "maximum": 100
          },
          "darkMode": {
            "type": "boolean",
            "default": false
          },
          "blockAds": {
            "type": "boolean",
            "default": false
          },
          "waitForSelector": {
            "type": "string",
            "nullable": true
          },
          "responseType": {
            "type": "string",
            "enum": [
              "binary",
              "base64"
            ],
            "default": "binary"
          }
        }
      },
      "ScreenshotBase64Result": {
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "format": {
            "type": "string"
          },
          "width": {
            "type": "integer"
          },
          "height": {
            "type": "integer"
          },
          "fullPage": {
            "type": "boolean"
          },
          "image": {
            "type": "string",
            "description": "Base64-encoded image data"
          },
          "size": {
            "type": "integer",
            "description": "Image size in bytes"
          }
        }
      },
      "Error": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "string"
          }
        }
      }
    },
    "responses": {
      "BadRequest": {
        "description": "Bad request — missing or invalid parameters",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": "url is required"
            }
          }
        }
      },
      "Unauthorized": {
        "description": "API key missing",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": "API key required"
            }
          }
        }
      },
      "Timeout": {
        "description": "Page load timed out",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": "Page load timed out"
            }
          }
        }
      },
      "RateLimited": {
        "description": "Rate limit exceeded (100 requests per minute)",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": "Rate limit exceeded"
            }
          }
        }
      },
      "InternalError": {
        "description": "Screenshot capture failed",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": "Screenshot failed"
            }
          }
        }
      }
    }
  }
}