{
  "openapi": "3.0.3",
  "info": {
    "title": "Password Generator & Strength Checker API",
    "version": "1.0.0",
    "description": "Cryptographically secure password generation and strength analysis powered by Node.js built-in crypto — no external dependencies. Generate passwords with configurable character sets (uppercase, lowercase, digits, symbols, exclude-ambiguous), analyze existing passwords for entropy and crack time estimate, generate human-friendly Diceware passphrases, and bulk-generate up to 100 passwords in one call.\n",
    "contact": {
      "name": "Password Generator API Support",
      "email": "api@hiroapp.cc"
    }
  },
  "servers": [
    {
      "url": "https://api.sprytools.com/v1/password",
      "description": "Production (SpryTools API Gateway)"
    }
  ],
  "tags": [
    {
      "name": "Generate",
      "description": "Generate secure passwords and passphrases"
    },
    {
      "name": "Check",
      "description": "Analyze password strength"
    }
  ],
  "security": [
    {
      "ApiKeyHeader": []
    },
    {
      "RapidApiProxy": []
    }
  ],
  "paths": {
    "/api/v1/generate": {
      "get": {
        "operationId": "generatePassword",
        "summary": "Generate a secure password",
        "description": "Generate a cryptographically secure random password with configurable length and character set options.\n",
        "tags": [
          "Generate"
        ],
        "parameters": [
          {
            "name": "length",
            "in": "query",
            "required": false,
            "description": "Password length (default 16)",
            "schema": {
              "type": "integer",
              "default": 16,
              "minimum": 4,
              "maximum": 256
            }
          },
          {
            "name": "uppercase",
            "in": "query",
            "required": false,
            "description": "Include uppercase letters (default true)",
            "schema": {
              "type": "boolean",
              "default": true
            }
          },
          {
            "name": "lowercase",
            "in": "query",
            "required": false,
            "description": "Include lowercase letters (default true)",
            "schema": {
              "type": "boolean",
              "default": true
            }
          },
          {
            "name": "numbers",
            "in": "query",
            "required": false,
            "description": "Include digits (default true)",
            "schema": {
              "type": "boolean",
              "default": true
            }
          },
          {
            "name": "symbols",
            "in": "query",
            "required": false,
            "description": "Include symbols like !@#$% (default false)",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "excludeAmbiguous",
            "in": "query",
            "required": false,
            "description": "Exclude visually similar characters (l, 1, O, 0) (default false)",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Generated password",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PasswordResult"
                },
                "example": {
                  "password": "Kx9mR2vN8qLpT4wJ",
                  "length": 16,
                  "entropy": 95.2,
                  "charsets": {
                    "uppercase": true,
                    "lowercase": true,
                    "numbers": true,
                    "symbols": false
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/api/v1/check": {
      "post": {
        "operationId": "checkPassword",
        "summary": "Analyze password strength",
        "description": "Analyze a password for entropy, estimated crack time, and strength score (0–4). Does not store or log the submitted password.\n",
        "tags": [
          "Check"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "password"
                ],
                "properties": {
                  "password": {
                    "type": "string",
                    "description": "Password to analyze"
                  }
                }
              },
              "example": {
                "password": "MyS3cur3P@ssw0rd!"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Password strength analysis",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PasswordCheckResult"
                },
                "example": {
                  "password": "MyS3cur3P@ssw0rd!",
                  "score": 4,
                  "strength": "Very Strong",
                  "entropy": 112.4,
                  "crackTime": "centuries",
                  "charsets": {
                    "hasUppercase": true,
                    "hasLowercase": true,
                    "hasDigits": true,
                    "hasSymbols": true
                  },
                  "length": 17
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/api/v1/passphrase": {
      "get": {
        "operationId": "generatePassphrase",
        "summary": "Generate a Diceware passphrase",
        "description": "Generate a random passphrase from a Diceware word list. More memorable, equally secure.",
        "tags": [
          "Generate"
        ],
        "parameters": [
          {
            "name": "words",
            "in": "query",
            "required": false,
            "description": "Number of words (default 4, max 10)",
            "schema": {
              "type": "integer",
              "default": 4,
              "minimum": 2,
              "maximum": 10
            }
          },
          {
            "name": "separator",
            "in": "query",
            "required": false,
            "description": "Word separator character (default space)",
            "schema": {
              "type": "string",
              "default": " "
            },
            "example": "-"
          }
        ],
        "responses": {
          "200": {
            "description": "Generated passphrase",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PassphraseResult"
                },
                "example": {
                  "passphrase": "correct-horse-battery-staple",
                  "words": 4,
                  "separator": "-",
                  "entropy": 51.7
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/api/v1/bulk": {
      "post": {
        "operationId": "generateBulkPasswords",
        "summary": "Generate multiple passwords at once",
        "description": "Generate up to 100 passwords in a single request using shared options.",
        "tags": [
          "Generate"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkPasswordRequest"
              },
              "example": {
                "count": 5,
                "length": 20,
                "uppercase": true,
                "lowercase": true,
                "numbers": true,
                "symbols": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Bulk password results",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BulkPasswordResult"
                },
                "example": {
                  "count": 5,
                  "passwords": [
                    {
                      "password": "Kx9!mR2vN8qL@pT4wJ",
                      "length": 18,
                      "entropy": 118.4
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "ApiKeyHeader": {
        "type": "apiKey",
        "in": "header",
        "name": "x-api-key"
      },
      "RapidApiProxy": {
        "type": "apiKey",
        "in": "header",
        "name": "x-rapidapi-proxy-secret"
      }
    },
    "schemas": {
      "PasswordResult": {
        "type": "object",
        "properties": {
          "password": {
            "type": "string"
          },
          "length": {
            "type": "integer"
          },
          "entropy": {
            "type": "number",
            "format": "float"
          },
          "charsets": {
            "type": "object",
            "properties": {
              "uppercase": {
                "type": "boolean"
              },
              "lowercase": {
                "type": "boolean"
              },
              "numbers": {
                "type": "boolean"
              },
              "symbols": {
                "type": "boolean"
              }
            }
          }
        }
      },
      "PasswordCheckResult": {
        "type": "object",
        "properties": {
          "password": {
            "type": "string"
          },
          "score": {
            "type": "integer",
            "description": "Strength score 0 (very weak) to 4 (very strong)",
            "minimum": 0,
            "maximum": 4
          },
          "strength": {
            "type": "string",
            "enum": [
              "Very Weak",
              "Weak",
              "Fair",
              "Strong",
              "Very Strong"
            ]
          },
          "entropy": {
            "type": "number",
            "format": "float"
          },
          "crackTime": {
            "type": "string"
          },
          "charsets": {
            "type": "object",
            "properties": {
              "hasUppercase": {
                "type": "boolean"
              },
              "hasLowercase": {
                "type": "boolean"
              },
              "hasDigits": {
                "type": "boolean"
              },
              "hasSymbols": {
                "type": "boolean"
              }
            }
          },
          "length": {
            "type": "integer"
          }
        }
      },
      "PassphraseResult": {
        "type": "object",
        "properties": {
          "passphrase": {
            "type": "string"
          },
          "words": {
            "type": "integer"
          },
          "separator": {
            "type": "string"
          },
          "entropy": {
            "type": "number",
            "format": "float"
          }
        }
      },
      "BulkPasswordRequest": {
        "type": "object",
        "properties": {
          "count": {
            "type": "integer",
            "default": 10,
            "minimum": 1,
            "maximum": 100
          },
          "length": {
            "type": "integer",
            "default": 16,
            "minimum": 4,
            "maximum": 256
          },
          "uppercase": {
            "type": "boolean",
            "default": true
          },
          "lowercase": {
            "type": "boolean",
            "default": true
          },
          "numbers": {
            "type": "boolean",
            "default": true
          },
          "symbols": {
            "type": "boolean",
            "default": false
          },
          "excludeAmbiguous": {
            "type": "boolean",
            "default": false
          }
        }
      },
      "BulkPasswordResult": {
        "type": "object",
        "properties": {
          "count": {
            "type": "integer"
          },
          "passwords": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PasswordResult"
            }
          }
        }
      },
      "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": "'password' field is required"
            }
          }
        }
      },
      "Unauthorized": {
        "description": "API key missing",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": "API key required"
            }
          }
        }
      },
      "RateLimited": {
        "description": "Rate limit exceeded (100 requests per minute)",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": "Rate limit exceeded"
            }
          }
        }
      }
    }
  }
}