{
  "openapi": "3.0.3",
  "info": {
    "title": "ProWebLook API",
    "description": "ProWebLook APIs for WhatsApp verification, phone validation, email verification, caller identification, IP geolocation, blacklist checking, social scraping, Google SERP, and AI visibility audits. Phone, WhatsApp validation, caller ID, blacklist, spam, email validation, and URL scrape live on lookup.proweblook.com; social scrapers, SERP, and audits live on proweblook.com. Authentication placement is endpoint-specific; consult each operation for its required API-key location.",
    "version": "1.0.0",
    "contact": {
      "name": "ProWebLook Support",
      "url": "https://proweblook.com/contact",
      "email": "support@proweblook.com"
    },
    "termsOfService": "https://proweblook.com/generic/terms_conditions",
    "x-logo": {
      "url": "https://proweblook.com/upload/logo.png"
    }
  },
  "servers": [
    {
      "url": "https://proweblook.com/api/v1",
      "description": "Production API server"
    }
  ],
  "externalDocs": {
    "description": "ProWebLook Documentation",
    "url": "https://docs.proweblook.com/api-reference/"
  },
  "security": [
    {
      "apiKey": []
    }
  ],
  "components": {
    "securitySchemes": {
      "apiKey": {
        "type": "apiKey",
        "in": "query",
        "name": "api_key",
        "description": "Your ProWebLook API key. Get a free key at https://proweblook.com/auth/signup"
      }
    },
    "schemas": {
      "ErrorResponse": {
        "type": "object",
        "properties": {
          "status": {
            "type": "boolean",
            "example": false
          },
          "error": {
            "type": "string",
            "example": "Invalid API key"
          }
        }
      },
      "StatusResponse": {
        "type": "object",
        "properties": {
          "status": {
            "type": "boolean",
            "example": true
          },
          "message": {
            "type": "string",
            "example": "The system is running"
          }
        }
      },
      "WhatsAppCheckResponse": {
        "type": "object",
        "properties": {
          "balance": {
            "type": "integer",
            "example": 1003
          },
          "status": {
            "type": "boolean",
            "example": true
          },
          "numberstatus": {
            "type": "boolean",
            "description": "Whether the number is registered on WhatsApp",
            "example": true
          },
          "businessnumber": {
            "type": "boolean",
            "description": "Whether the number is a WhatsApp Business account",
            "example": true
          },
          "error": {
            "type": "string"
          }
        }
      },
      "PhoneNumberInput": {
        "type": "string",
        "description": "Phone number to validate. When country_code is omitted or set to none, send the complete international number, preferably in E.164 form, including the leading + and country calling code (for example, +14155552671). A local or national number requires country_code (for example, phone_number=9876543210 with country_code=IN). Percent-encode a leading + as %2B in a GET URL.",
        "example": "+14155552671"
      },
      "PhoneCountryCode": {
        "type": "string",
        "pattern": "^([A-Za-z]{2}|none)$",
        "description": "Optional ISO 3166-1 alpha-2 country hint such as US, IN, or GB. This is a country identifier, not a numeric calling prefix such as +1 or +91. Omit it, or use the literal value none, only with a complete international phone_number.",
        "example": "IN"
      },
      "PhoneValidationRequest": {
        "type": "object",
        "required": [
          "phone_number",
          "api_key"
        ],
        "properties": {
          "phone_number": {
            "$ref": "#/components/schemas/PhoneNumberInput"
          },
          "country_code": {
            "$ref": "#/components/schemas/PhoneCountryCode"
          },
          "api_key": {
            "type": "string",
            "format": "password",
            "writeOnly": true,
            "description": "Your ProWebLook API key. Keep it out of source code, client-side code, public repositories, and logs.",
            "example": "YOUR_API_KEY"
          }
        }
      },
      "PhoneValidationResponse": {
        "type": "object",
        "required": [
          "status"
        ],
        "description": "A completed phone-validation result. INVALID is a normal result and may contain only status; enrichment fields are not guaranteed for an invalid number.",
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "VALID_CONFIRMED",
              "INVALID"
            ],
            "description": "VALID_CONFIRMED for a confirmed number or INVALID when the supplied number could not be validated.",
            "example": "VALID_CONFIRMED"
          },
          "formatted_number": {
            "type": "string",
            "description": "Internationally formatted number returned by the API.",
            "example": "+1 415 555 2671"
          },
          "linetype": {
            "type": "string",
            "enum": [
              "Mobile",
              "Fixed Line",
              "Fixed Line or Mobile",
              "Toll-Free",
              "Premium Rate",
              "Shared Cost",
              "VoIP",
              "Personal Number",
              "Pager",
              "Universal Access Number",
              "Voicemail",
              "Unknown"
            ],
            "example": "Mobile"
          },
          "carrier": {
            "type": "string",
            "description": "Carrier/operator name. May be an empty string for landlines.",
            "example": "T-Mobile"
          },
          "location": {
            "type": "string",
            "description": "Geographic description such as a city, region, or country.",
            "example": "California"
          },
          "countrycodenum": {
            "type": "integer",
            "description": "Numeric country calling code.",
            "example": 1
          },
          "countrycode": {
            "type": "string",
            "description": "ISO 3166-1 alpha-2 country code.",
            "example": "US"
          },
          "countryname": {
            "type": "string",
            "description": "Full country name.",
            "example": "United States"
          },
          "formatnational": {
            "type": "string",
            "description": "Phone number in national display format.",
            "example": "(415) 555-2671"
          },
          "formatinternational": {
            "type": "string",
            "description": "Phone number in international display format.",
            "example": "+1 415 555 2671"
          },
          "timezone": {
            "type": "array",
            "description": "Applicable IANA timezone identifiers.",
            "items": {
              "type": "string"
            },
            "example": [
              "America/Los_Angeles"
            ]
          },
          "ratelimit_remain": {
            "type": "integer",
            "description": "Calls remaining in the current rate-limit window.",
            "example": 100
          },
          "ratelimit_seconds": {
            "type": "integer",
            "description": "Seconds until the current rate-limit window resets.",
            "example": 100
          }
        }
      },
      "PhoneValidationErrorResponse": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "string",
            "description": "Human-readable description of the request failure.",
            "example": "Invalid API key."
          }
        }
      },
      "EmailCheckResponse": {
        "type": "object",
        "required": [
          "status"
        ],
        "properties": {
          "balance": {
            "type": "integer",
            "description": "Current remaining email credits after the check or refund attempt. Omitted when API authentication fails.",
            "example": 99
          },
          "status": {
            "type": "boolean",
            "description": "True for a completed check, including an invalid address; false for authentication, credit, or lookup failure.",
            "example": true
          },
          "email": {
            "type": "string",
            "description": "Checked address; present on completed checks.",
            "example": "user@example.com"
          },
          "emailformat": {
            "type": "boolean",
            "description": "Whether the address has valid syntax; present on completed checks.",
            "example": true
          },
          "emailexist": {
            "type": "boolean",
            "description": "True for deliverable or catch-all results; present on completed checks.",
            "example": true
          },
          "verdict": {
            "type": "string",
            "description": "Completed check verdict: deliverable, undeliverable, unknown (catch-all), or invalid_format.",
            "example": "deliverable"
          },
          "reason_code": {
            "type": "string",
            "description": "Lookup reason on completed checks or lookup failures; credit_refund_pending means restoration could not complete. Omitted for authentication or insufficient-credit errors.",
            "example": "mailbox_accepted"
          },
          "error": {
            "type": "string",
            "description": "Human-readable error when status is false.",
            "example": "Service temporarily unavailable, please try again."
          }
        }
      },
      "GeoIPResponse": {
        "type": "object",
        "properties": {
          "status": {
            "type": "boolean",
            "description": "true if the IP was successfully resolved, otherwise false.",
            "example": true
          },
          "ip": {
            "type": "string",
            "example": "8.8.8.8"
          },
          "range": {
            "type": "array",
            "description": "Latitude/longitude pair returned by the edge API.",
            "items": {
              "type": "number"
            },
            "example": [
              37.751,
              -97.822
            ]
          },
          "country": {
            "type": "string",
            "description": "Two-letter ISO country code.",
            "example": "US"
          },
          "country_name": {
            "type": "string",
            "description": "Full country name.",
            "example": "United States"
          },
          "region": {
            "type": "string",
            "nullable": true,
            "description": "State or region name.",
            "example": null
          },
          "region_iso": {
            "type": "string",
            "nullable": true,
            "description": "Region ISO code, when available.",
            "example": null
          },
          "city": {
            "type": "string",
            "nullable": true,
            "description": "City name, when available.",
            "example": null
          },
          "postal_code": {
            "type": "string",
            "nullable": true,
            "description": "Postal or ZIP code, when available.",
            "example": null
          },
          "isp": {
            "type": "string",
            "description": "Internet Service Provider name.",
            "example": "Level 3 Communications"
          },
          "organization": {
            "type": "string",
            "description": "Organization associated with the IP address.",
            "example": "Google"
          },
          "latitude": {
            "type": "number",
            "example": 37.751
          },
          "longitude": {
            "type": "number",
            "example": -97.822
          },
          "asn": {
            "type": "integer",
            "description": "Autonomous System Number.",
            "example": 15169
          },
          "asn_organization": {
            "type": "string",
            "description": "Organization associated with the ASN.",
            "example": "GOOGLE"
          },
          "timezone": {
            "type": "string",
            "description": "Timezone of the IP location.",
            "example": "America/Chicago"
          }
        }
      },
      "CallerInfoResponse": {
        "type": "object",
        "properties": {
          "status": {
            "type": "boolean",
            "example": true
          },
          "number": {
            "type": "string",
            "example": "+1234567890"
          },
          "name": {
            "type": "string",
            "example": "John Doe"
          },
          "carrier": {
            "type": "string",
            "example": "AT&T"
          },
          "line_type": {
            "type": "string",
            "example": "mobile"
          },
          "location": {
            "type": "string",
            "example": "New York, NY"
          }
        }
      },
      "BalanceResponse": {
        "type": "object",
        "properties": {
          "status": {
            "type": "boolean",
            "example": true
          },
          "wa_balance": {
            "type": "integer",
            "description": "WhatsApp API credits remaining"
          },
          "email_balance": {
            "type": "integer",
            "description": "Email API credits remaining"
          },
          "geoip_balance": {
            "type": "integer",
            "description": "GeoIP API credits remaining"
          },
          "phone_balance": {
            "type": "integer",
            "description": "Phone API credits remaining"
          }
        }
      },
      "AuditRunRequest": {
        "type": "object",
        "required": [
          "brand_name",
          "brand_url"
        ],
        "properties": {
          "brand_name": {
            "type": "string",
            "description": "The brand name to audit",
            "example": "ProWebLook"
          },
          "brand_url": {
            "type": "string",
            "description": "The brand website URL",
            "example": "https://proweblook.com"
          },
          "competitors": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "List of competitor brand names to compare against"
          }
        }
      }
    },
    "responses": {
      "PhoneValidationOk": {
        "description": "Validation completed. INVALID is a completed validation result returned with HTTP 200, not an API error.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/PhoneValidationResponse"
            },
            "examples": {
              "valid": {
                "summary": "Confirmed valid number",
                "value": {
                  "status": "VALID_CONFIRMED",
                  "formatted_number": "+1 415 555 2671",
                  "linetype": "Mobile",
                  "carrier": "T-Mobile",
                  "location": "California",
                  "countrycodenum": 1,
                  "countrycode": "US",
                  "countryname": "United States",
                  "formatnational": "(415) 555-2671",
                  "formatinternational": "+1 415 555 2671",
                  "timezone": [
                    "America/Los_Angeles"
                  ],
                  "ratelimit_remain": 100,
                  "ratelimit_seconds": 100
                }
              },
              "invalid": {
                "summary": "Invalid number",
                "value": {
                  "status": "INVALID"
                }
              }
            }
          }
        }
      },
      "PhoneValidationBadRequest": {
        "description": "A required parameter is missing or a parameter is invalid.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/PhoneValidationErrorResponse"
            },
            "example": {
              "error": "PhoneNumber is missing in the request."
            }
          }
        }
      },
      "PhoneValidationUnauthorized": {
        "description": "The API key is missing or invalid.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/PhoneValidationErrorResponse"
            },
            "example": {
              "error": "Invalid API key."
            }
          }
        }
      },
      "PhoneValidationNoCredits": {
        "description": "The account has insufficient phone-validation credits.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/PhoneValidationErrorResponse"
            },
            "example": {
              "error": "Insufficient phone API credits."
            }
          }
        }
      },
      "PhoneValidationServerError": {
        "description": "An unexpected server error occurred.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/PhoneValidationErrorResponse"
            },
            "example": {
              "error": "Description of the error."
            }
          }
        }
      }
    }
  },
  "paths": {
    "/": {
      "servers": [
        {
          "url": "https://ipapi.proweblook.com",
          "description": "Primary edge IP API server"
        }
      ],
      "get": {
        "summary": "Check GEO IP",
        "description": "Retrieve geolocation, ISP, organization, ASN, and timezone details for an IPv4 or IPv6 address from the primary edge IP API endpoint.",
        "operationId": "checkGeoIP",
        "tags": [
          "IP"
        ],
        "externalDocs": {
          "description": "Check GEO IP API documentation",
          "url": "https://docs.proweblook.com/api-reference/check-geo-ip"
        },
        "parameters": [
          {
            "name": "ip",
            "in": "query",
            "required": true,
            "description": "The IP address (IPv4 or IPv6) to look up. Example: 8.8.8.8",
            "schema": {
              "type": "string",
              "example": "8.8.8.8"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geolocation data",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeoIPResponse"
                }
              }
            }
          },
          "400": {
            "description": "Missing or invalid IP address",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/status": {
      "get": {
        "summary": "Check API Status",
        "description": "Check if the ProWebLook API system is running. No authentication required.",
        "operationId": "getStatus",
        "tags": [
          "System"
        ],
        "security": [],
        "responses": {
          "200": {
            "description": "System status",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StatusResponse"
                }
              }
            }
          }
        }
      }
    },
    "/checkwanumber": {
      "get": {
        "summary": "Verify WhatsApp Number",
        "description": "Legacy WhatsApp presence check. Does not send a message or OTP. Prefer GET/POST https://lookup.proweblook.com/api/v1/wavalidation for new integrations. Query parameter is `number`, not `mobile`.",
        "operationId": "checkWhatsAppNumber",
        "tags": [
          "WhatsApp"
        ],
        "parameters": [
          {
            "name": "number",
            "in": "query",
            "required": true,
            "description": "Phone number with country calling code. Parameter name is number, not mobile.",
            "schema": {
              "type": "string",
              "example": "+1234567890"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "WhatsApp verification result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WhatsAppCheckResponse"
                }
              }
            }
          }
        }
      }
    },
    "/phonevalidation": {
      "servers": [
        {
          "url": "https://lookup.proweblook.com/api/v1",
          "description": "ProWebLook production lookup API"
        }
      ],
      "get": {
        "summary": "Validate a phone number",
        "description": "Validate and enrich one phone number. GET requires api_key and phone_number in the query string. When country_code is omitted or set to none, send a full international number including its country calling code, preferably in E.164 form. A local or national number requires country_code. One credit is deducted from phoneapi_balance per successful validation.",
        "operationId": "validatePhoneNumberGet",
        "tags": [
          "Phone"
        ],
        "externalDocs": {
          "description": "Complete Phone Validation documentation",
          "url": "https://docs.proweblook.com/api-reference/phone-validation"
        },
        "security": [
          {
            "apiKey": []
          }
        ],
        "parameters": [
          {
            "name": "phone_number",
            "in": "query",
            "required": true,
            "allowReserved": false,
            "description": "Phone number to validate. URL-encode a leading + as %2B. A local/national value requires country_code.",
            "schema": {
              "$ref": "#/components/schemas/PhoneNumberInput"
            }
          },
          {
            "name": "country_code",
            "in": "query",
            "required": false,
            "description": "Optional ISO country hint for a local or national phone number.",
            "schema": {
              "$ref": "#/components/schemas/PhoneCountryCode"
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/PhoneValidationOk"
          },
          "400": {
            "$ref": "#/components/responses/PhoneValidationBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/PhoneValidationUnauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PhoneValidationNoCredits"
          },
          "500": {
            "$ref": "#/components/responses/PhoneValidationServerError"
          }
        }
      },
      "post": {
        "summary": "Validate a phone number",
        "description": "Validate and enrich one phone number using a JSON or form body. api_key and phone_number are required in the body. When country_code is omitted or set to none, send a full international number including its country calling code, preferably in E.164 form. A local or national number requires country_code. One credit is deducted from phoneapi_balance per successful validation. The empty OpenAPI security override does not mean this operation accepts unauthenticated requests; OpenAPI 3.0 cannot represent an API key located in a request body.",
        "operationId": "validatePhoneNumberPost",
        "tags": [
          "Phone"
        ],
        "externalDocs": {
          "description": "Complete Phone Validation documentation",
          "url": "https://docs.proweblook.com/api-reference/phone-validation"
        },
        "security": [],
        "x-api-key-location": "requestBody",
        "requestBody": {
          "required": true,
          "description": "POST authentication and phone-validation fields. api_key must be included in this body.",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "phone_number",
                  "api_key"
                ],
                "properties": {
                  "phone_number": {
                    "$ref": "#/components/schemas/PhoneNumberInput"
                  },
                  "country_code": {
                    "$ref": "#/components/schemas/PhoneCountryCode"
                  },
                  "api_key": {
                    "type": "string",
                    "format": "password",
                    "writeOnly": true,
                    "description": "Your ProWebLook API key.",
                    "example": "YOUR_API_KEY"
                  }
                }
              },
              "examples": {
                "internationalNumber": {
                  "summary": "Complete international number",
                  "value": {
                    "phone_number": "+14155552671",
                    "api_key": "YOUR_API_KEY"
                  }
                },
                "localNumberWithCountryHint": {
                  "summary": "Local number with an ISO country hint",
                  "value": {
                    "phone_number": "9876543210",
                    "country_code": "IN",
                    "api_key": "YOUR_API_KEY"
                  }
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "required": [
                  "phone_number",
                  "api_key"
                ],
                "properties": {
                  "phone_number": {
                    "$ref": "#/components/schemas/PhoneNumberInput"
                  },
                  "country_code": {
                    "$ref": "#/components/schemas/PhoneCountryCode"
                  },
                  "api_key": {
                    "type": "string",
                    "format": "password",
                    "writeOnly": true,
                    "description": "Your ProWebLook API key.",
                    "example": "YOUR_API_KEY"
                  }
                }
              },
              "example": {
                "phone_number": "9876543210",
                "country_code": "IN",
                "api_key": "YOUR_API_KEY"
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/PhoneValidationOk"
          },
          "400": {
            "$ref": "#/components/responses/PhoneValidationBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/PhoneValidationUnauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PhoneValidationNoCredits"
          },
          "500": {
            "$ref": "#/components/responses/PhoneValidationServerError"
          }
        }
      }
    },
    "/check": {
      "get": {
        "summary": "Blacklist Checker (monolith compatible path)",
        "description": "Check an IP, domain, or URL against DNSBL/spam sources. Canonical lookup host path is GET/POST https://lookup.proweblook.com/api/v1/blacklistchecker. This monolith path is not caller ID; caller ID is GET/POST https://lookup.proweblook.com/api/v1/calleridvalidation.",
        "operationId": "checkBlacklistMonolith",
        "tags": [
          "Security"
        ],
        "externalDocs": {
          "description": "Blacklist Checker documentation",
          "url": "https://docs.proweblook.com/api-reference/blacklist-checker"
        },
        "parameters": [
          {
            "name": "target",
            "in": "query",
            "required": true,
            "description": "IP address, domain, or URL to check",
            "schema": {
              "type": "string",
              "example": "proweblook.com"
            }
          },
          {
            "name": "target_type",
            "in": "query",
            "required": true,
            "description": "ip, domain, url, or auto",
            "schema": {
              "type": "string",
              "enum": [
                "ip",
                "domain",
                "url",
                "auto"
              ],
              "example": "auto"
            }
          },
          {
            "name": "sources",
            "in": "query",
            "required": false,
            "description": "Optional comma-separated source list. All sources when omitted.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Blacklist check result"
          },
          "400": {
            "description": "Missing or invalid target / target_type"
          },
          "401": {
            "description": "Invalid API key"
          },
          "402": {
            "description": "Insufficient blacklist credits"
          }
        }
      }
    },
    "/emailvalidation": {
      "servers": [
        {
          "url": "https://lookup.proweblook.com/api/v1",
          "description": "Lookup API host"
        }
      ],
      "get": {
        "summary": "Email Verification",
        "description": "Verify email format and mailbox deliverability in real time without sending an email. Supported on lookup.proweblook.com with GET and POST methods. Returns deliverability signals including mailbox existence, verdict, and reason codes.",
        "operationId": "verifyEmailLookup",
        "tags": [
          "Email"
        ],
        "externalDocs": {
          "description": "Email Verification documentation",
          "url": "https://docs.proweblook.com/api-reference/email-verification"
        },
        "parameters": [
          {
            "name": "email",
            "in": "query",
            "required": true,
            "description": "Address to verify. Invalid syntax returns a completed invalid_format result and consumes one email credit.",
            "schema": {
              "type": "string",
              "example": "user@example.com"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Completed verification or application-level error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmailCheckResponse"
                },
                "examples": {
                  "completed": {
                    "summary": "Completed deliverable check",
                    "value": {
                      "balance": 9992,
                      "status": true,
                      "email": "user@example.com",
                      "emailformat": true,
                      "emailexist": true,
                      "verdict": "deliverable",
                      "reason_code": "mailbox_accepted"
                    }
                  },
                  "refunded": {
                    "summary": "Provider timeout refund",
                    "value": {
                      "balance": 9990,
                      "status": false,
                      "error": "Service temporarily unavailable, please try again.",
                      "reason_code": "network_timeout"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Invalid API key"
          },
          "402": {
            "description": "Insufficient email credits"
          }
        }
      }
    },
    "/checkemail": {
      "get": {
        "summary": "Verify Email Address",
        "description": "Legacy monolith path for email format and mailbox deliverability. Prefer GET https://lookup.proweblook.com/api/v1/emailvalidation for new integrations. A completed result uses status=true and consumes one email credit, including invalid syntax or an undeliverable address. Provider, configuration, or inconclusive lookup failures use status=false with error and reason_code; the reserved credit is refunded to its original pool row. If restoration fails, reason_code is credit_refund_pending. Responses use HTTP 200 for completed checks and application-level errors.",
        "operationId": "verifyEmail",
        "tags": [
          "Email"
        ],
        "parameters": [
          {
            "name": "email",
            "in": "query",
            "required": true,
            "description": "Address to verify. Invalid syntax returns a completed invalid_format result and consumes one email credit.",
            "schema": {
              "type": "string",
              "example": "user@example.com"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Completed verification or application-level error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmailCheckResponse"
                },
                "examples": {
                  "completed": {
                    "summary": "Completed deliverable check",
                    "value": {
                      "balance": 99,
                      "status": true,
                      "email": "user@example.com",
                      "emailformat": true,
                      "emailexist": true,
                      "verdict": "deliverable",
                      "reason_code": "mailbox_accepted"
                    }
                  },
                  "lookupFailure": {
                    "summary": "Lookup failed; reserved credit restored",
                    "value": {
                      "balance": 100,
                      "status": false,
                      "error": "Service temporarily unavailable, please try again.",
                      "reason_code": "network_timeout"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/checkemailcron": {
      "get": {
        "summary": "Verify Email Address (Cron-Compatible)",
        "description": "Compatibility path with the same query parameters, response, and email-credit reservation and refund behavior as GET /checkemail.",
        "operationId": "verifyEmailCronCompatible",
        "tags": [
          "Email"
        ],
        "parameters": [
          {
            "name": "email",
            "in": "query",
            "required": true,
            "description": "Address to verify. Invalid syntax returns a completed invalid_format result and consumes one email credit.",
            "schema": {
              "type": "string",
              "example": "user@example.com"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Completed verification or application-level error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmailCheckResponse"
                }
              }
            }
          }
        }
      }
    },
    "/checkgeoip": {
      "get": {
        "summary": "Compatible GEO IP Lookup",
        "description": "Compatible path for existing Geo IP integrations. New integrations should use GET https://ipapi.proweblook.com/?ip=8.8.8.8&api_key=YOUR_API_KEY.",
        "operationId": "checkGeoIPCompatible",
        "tags": [
          "IP"
        ],
        "servers": [
          {
            "url": "https://ipapi.proweblook.com/api/v1",
            "description": "Compatible edge IP API path"
          },
          {
            "url": "https://proweblook.com/api/v1",
            "description": "Legacy fallback API path"
          }
        ],
        "externalDocs": {
          "description": "Check GEO IP API documentation",
          "url": "https://docs.proweblook.com/api-reference/check-geo-ip"
        },
        "parameters": [
          {
            "name": "ip",
            "in": "query",
            "required": true,
            "description": "The IP address (IPv4 or IPv6) to look up. Example: 8.8.8.8",
            "schema": {
              "type": "string",
              "example": "8.8.8.8"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geolocation data",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeoIPResponse"
                }
              }
            }
          }
        }
      }
    },
    "/checkbalance": {
      "get": {
        "summary": "Check Account Balance",
        "description": "Check your remaining API credits for each service (WhatsApp, Email, GeoIP, Phone).",
        "operationId": "checkBalance",
        "tags": [
          "Account"
        ],
        "responses": {
          "200": {
            "description": "Account balance",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BalanceResponse"
                }
              }
            }
          }
        }
      }
    },
    "/sendwasms": {
      "get": {
        "summary": "Send WhatsApp Message",
        "description": "Send a WhatsApp message programmatically. Supports text, images, documents, and media files up to 2MB.",
        "operationId": "sendWhatsAppMessage",
        "tags": [
          "WhatsApp"
        ],
        "parameters": [
          {
            "name": "number",
            "in": "query",
            "required": true,
            "description": "Recipient phone number with country code",
            "schema": {
              "type": "string",
              "example": "+1234567890"
            }
          },
          {
            "name": "message",
            "in": "query",
            "required": true,
            "description": "Message text to send",
            "schema": {
              "type": "string",
              "example": "Hello from ProWebLook!"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Message send result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean"
                    },
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/scrapersearch": {
      "get": {
        "summary": "Search Reddit, X, or LinkedIn",
        "description": "Search public posts. Default platform is reddit. Use platform=linkedin \u2014 there is no /scraperlinkedinsearch path.",
        "operationId": "searchReddit",
        "tags": [
          "Scraping"
        ],
        "parameters": [
          {
            "name": "query",
            "in": "query",
            "required": true,
            "description": "Search query term",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "platform",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "reddit",
                "x",
                "linkedin"
              ],
              "default": "reddit"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "default": "new"
            }
          },
          {
            "name": "time",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "default": "week"
            }
          },
          {
            "name": "maxItems",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 10,
              "minimum": 1,
              "maximum": 50
            }
          },
          {
            "name": "subreddits",
            "in": "query",
            "required": false,
            "description": "Reddit only: comma-separated subreddit names",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Reddit search results",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean"
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/scraperpost": {
      "get": {
        "summary": "Fetch a Reddit, X, or LinkedIn post",
        "description": "Extract a post by URL. Query parameter is url, not post_url.",
        "operationId": "scrapeRedditPost",
        "tags": [
          "Scraping"
        ],
        "parameters": [
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Full post URL",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "platform",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "reddit",
                "x",
                "linkedin"
              ],
              "default": "reddit"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Reddit post data",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/scraperxsearch": {
      "get": {
        "summary": "Search X (Twitter)",
        "description": "Search X (formerly Twitter) for posts matching a query. Returns tweets, engagement metrics, and user information.",
        "operationId": "searchTwitter",
        "tags": [
          "Scraping"
        ],
        "parameters": [
          {
            "name": "query",
            "in": "query",
            "required": true,
            "description": "Search query term",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "X/Twitter search results",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/scraperxpost": {
      "get": {
        "summary": "Scrape X (Twitter) Post",
        "description": "Extract full content and metrics from a specific X/Twitter post.",
        "operationId": "scrapeTwitterPost",
        "tags": [
          "Scraping"
        ],
        "parameters": [
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Full X/Twitter post URL. Parameter name is url, not post_url.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "X/Twitter post data",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/scraperxcomment": {
      "get": {
        "summary": "Scrape X (Twitter) Comments",
        "description": "Extract comments/replies from a specific X/Twitter post.",
        "operationId": "scrapeTwitterComments",
        "tags": [
          "Scraping"
        ],
        "parameters": [
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Full X/Twitter post URL. Parameter name is url, not post_url.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "X/Twitter comments data",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/audit_run": {
      "post": {
        "summary": "Run AI Visibility Audit",
        "description": "Run a brand visibility audit across major AI/LLM platforms (ChatGPT, Claude, Gemini, Perplexity). Analyzes how AI models perceive and recommend your brand.",
        "operationId": "runAudit",
        "tags": [
          "AI Audit"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AuditRunRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Audit initiated",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean"
                    },
                    "audit_id": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/audit": {
      "get": {
        "summary": "Get Audit Results",
        "description": "Retrieve results of a previously run AI visibility audit.",
        "operationId": "getAudit",
        "tags": [
          "AI Audit"
        ],
        "parameters": [
          {
            "name": "audit_id",
            "in": "query",
            "required": true,
            "description": "Audit ID from audit_run response",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Audit results",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/audit_summary": {
      "get": {
        "summary": "Get Audit Summary",
        "description": "Get a summary overview of AI visibility audit results.",
        "operationId": "getAuditSummary",
        "tags": [
          "AI Audit"
        ],
        "parameters": [
          {
            "name": "audit_id",
            "in": "query",
            "required": true,
            "description": "Audit ID from audit_run response",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Audit summary",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/wavalidation": {
      "servers": [
        {
          "url": "https://lookup.proweblook.com/api/v1",
          "description": "Lookup API host"
        }
      ],
      "get": {
        "summary": "WhatsApp Validation",
        "description": "Canonical WhatsApp presence + business detection. Prefer this over /checkwanumber.",
        "operationId": "validateWhatsApp",
        "tags": [
          "WhatsApp"
        ],
        "externalDocs": {
          "description": "WhatsApp Validation documentation",
          "url": "https://docs.proweblook.com/api-reference/wa-validation"
        },
        "parameters": [
          {
            "name": "phone_number",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "example": "+14155552671"
            }
          },
          {
            "name": "country_code",
            "in": "query",
            "required": false,
            "description": "Optional ISO 3166-1 alpha-2 hint",
            "schema": {
              "type": "string",
              "example": "US"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "WhatsApp validation result"
          }
        }
      },
      "post": {
        "summary": "WhatsApp Validation",
        "operationId": "validateWhatsAppPost",
        "tags": [
          "WhatsApp"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "api_key",
                  "phone_number"
                ],
                "properties": {
                  "api_key": {
                    "type": "string"
                  },
                  "phone_number": {
                    "type": "string"
                  },
                  "country_code": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "WhatsApp validation result"
          }
        }
      }
    },
    "/wavalidation/batch": {
      "servers": [
        {
          "url": "https://lookup.proweblook.com/api/v1",
          "description": "Lookup API host"
        }
      ],
      "post": {
        "summary": "WhatsApp Batch Submit",
        "description": "Submit up to 1,000 numbers. Credits deducted upfront, one per number. Returns batch_id (HTTP 202).",
        "operationId": "submitWhatsAppBatch",
        "tags": [
          "WhatsApp"
        ],
        "externalDocs": {
          "description": "WA batch submit",
          "url": "https://docs.proweblook.com/api-reference/wa-batch-submit"
        },
        "responses": {
          "202": {
            "description": "Batch accepted"
          }
        }
      }
    },
    "/wavalidation/batch/{batch_id}": {
      "servers": [
        {
          "url": "https://lookup.proweblook.com/api/v1",
          "description": "Lookup API host"
        }
      ],
      "get": {
        "summary": "WhatsApp Batch Poll",
        "operationId": "pollWhatsAppBatch",
        "tags": [
          "WhatsApp"
        ],
        "parameters": [
          {
            "name": "batch_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Batch status and per-number results"
          }
        }
      }
    },
    "/calleridvalidation": {
      "servers": [
        {
          "url": "https://lookup.proweblook.com/api/v1",
          "description": "Lookup API host"
        }
      ],
      "get": {
        "summary": "Caller ID Lookup",
        "description": "Reverse phone lookup (CNAM). Not the monolith /check path.",
        "operationId": "callerIdLookup",
        "tags": [
          "Phone"
        ],
        "externalDocs": {
          "description": "Caller ID documentation",
          "url": "https://docs.proweblook.com/api-reference/caller-id-validation"
        },
        "parameters": [
          {
            "name": "phone_number",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "example": "+919876543210"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Caller information",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CallerInfoResponse"
                }
              }
            }
          }
        }
      }
    },
    "/blacklistchecker": {
      "servers": [
        {
          "url": "https://lookup.proweblook.com/api/v1",
          "description": "Lookup API host"
        }
      ],
      "get": {
        "summary": "Blacklist Checker",
        "description": "Canonical blacklist endpoint on the lookup host.",
        "operationId": "checkBlacklist",
        "tags": [
          "Security"
        ],
        "externalDocs": {
          "description": "Blacklist Checker documentation",
          "url": "https://docs.proweblook.com/api-reference/blacklist-checker"
        },
        "parameters": [
          {
            "name": "target",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "example": "proweblook.com"
            }
          },
          {
            "name": "target_type",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "ip",
                "domain",
                "url",
                "auto"
              ],
              "example": "auto"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Blacklist check result"
          }
        }
      }
    },
    "/spamchecker": {
      "servers": [
        {
          "url": "https://lookup.proweblook.com/api/v1",
          "description": "Lookup API host"
        }
      ],
      "post": {
        "summary": "Spam Checker",
        "description": "Score email subject/body 0-100 for spam triggers. At least one of subject or content is required.",
        "operationId": "checkSpam",
        "tags": [
          "Security"
        ],
        "externalDocs": {
          "description": "Spam Checker documentation",
          "url": "https://docs.proweblook.com/api-reference/spam-checker"
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "api_key": {
                    "type": "string"
                  },
                  "subject": {
                    "type": "string"
                  },
                  "content": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Spam score result"
          }
        }
      }
    },
    "/scrape": {
      "servers": [
        {
          "url": "https://lookup.proweblook.com/api/v1",
          "description": "Lookup API host"
        }
      ],
      "post": {
        "summary": "URL Scraping & Screenshot",
        "description": "Scrape a URL for markdown/html/links/metadata/screenshot in one call.",
        "operationId": "scrapeUrl",
        "tags": [
          "Scraping"
        ],
        "externalDocs": {
          "description": "Scraping documentation",
          "url": "https://docs.proweblook.com/api-reference/scraping"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "url"
                ],
                "properties": {
                  "api_key": {
                    "type": "string"
                  },
                  "url": {
                    "type": "string",
                    "example": "https://example.com"
                  },
                  "formats": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "markdown",
                        "html",
                        "rawHtml",
                        "links",
                        "metadata",
                        "screenshot"
                      ]
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Scrape result"
          }
        }
      }
    },
    "/google_serp": {
      "get": {
        "summary": "Google SERP",
        "description": "Google Search organic results. Path is /google_serp; the search parameter is query, not q.",
        "operationId": "googleSerp",
        "tags": [
          "Scraping"
        ],
        "parameters": [
          {
            "name": "query",
            "in": "query",
            "required": true,
            "description": "Search keywords (1-2000 characters)",
            "schema": {
              "type": "string",
              "example": "mcp server"
            }
          },
          {
            "name": "domain",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "google.com",
                "google.co.uk",
                "google.in",
                "google.de",
                "google.fr",
                "google.es",
                "google.it",
                "google.com.au",
                "google.ca"
              ],
              "default": "google.com"
            }
          },
          {
            "name": "country",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "US"
            }
          },
          {
            "name": "language",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "default": "en"
            }
          },
          {
            "name": "start",
            "in": "query",
            "required": false,
            "description": "Result offset; multiple of 10 between 0 and 990",
            "schema": {
              "type": "integer",
              "default": 0
            }
          },
          {
            "name": "num",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 10,
              "minimum": 10,
              "maximum": 100
            }
          },
          {
            "name": "device",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "desktop",
                "mobile"
              ],
              "default": "desktop"
            }
          },
          {
            "name": "response_format",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "json",
                "html"
              ],
              "default": "json"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Organic search results"
          },
          "401": {
            "description": "Invalid API key"
          },
          "402": {
            "description": "No SERP credits remaining"
          }
        }
      }
    }
  },
  "tags": [
    {
      "name": "System",
      "description": "System health and status"
    },
    {
      "name": "WhatsApp",
      "description": "WhatsApp number verification, including lookup-host validation and batch"
    },
    {
      "name": "Phone",
      "description": "Phone number validation and caller identification"
    },
    {
      "name": "Email",
      "description": "Email address verification"
    },
    {
      "name": "IP",
      "description": "IP address geolocation"
    },
    {
      "name": "Security",
      "description": "Blacklist and spam scoring"
    },
    {
      "name": "Account",
      "description": "Account management and balance"
    },
    {
      "name": "Scraping",
      "description": "Social media scraping (Reddit, X/Twitter, LinkedIn), Google SERP, and URL scrape"
    },
    {
      "name": "AI Audit",
      "description": "AI/LLM brand visibility auditing"
    }
  ]
}
