{"openapi":"3.1.0","info":{"title":"Web Metadata & Contact Extractor API","description":"Ultra-fast, enterprise REST API: Extended Metadata, Anti-SSRF Shield, Async Redis Rate Limiter (auto-reconnect + health observability), Multi-Worker Gunicorn, Favicon HD Engine, NLP Summary, HTTP/2, ORJSON.","version":"4.1.0"},"paths":{"/health":{"get":{"tags":["Health"],"summary":"Health Check","description":"Public liveness probe — exposes only service name and version.\nUse /health/details (requires HEALTH_DETAILS_SECRET header) for full operational status.","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health/details":{"get":{"tags":["Health"],"summary":"Health Details","description":"Protected operational health endpoint.\nRequires X-Health-Secret header matching HEALTH_DETAILS_SECRET env var.\nReturns Redis mode, status, engine details and configuration flags for monitoring.","operationId":"health_details_health_details_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health/ready":{"get":{"tags":["Health"],"summary":"Health Ready","description":"Kubernetes/Render readiness probe.\nReturns 200 when the process is ready to serve traffic (HTTP client initialized).\nReturns 503 when still starting up. Does NOT expose internal details.","operationId":"health_ready_health_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/extract":{"get":{"tags":["Full Extractor"],"summary":"Extract Metadata","description":"Extract full metadata payload (<200ms with Rust ORJSON + IP-Pinned Anti-SSRF Shield + HTTP/2 streaming):\n- **SEO Metadata**: Title, description, OG image, favicon, canonical URL, language, author, theme color, H1 tags.\n- **Page Health Metrics**: Content length (bytes), image count, accessibility missing alt count, link count.\n- **Contacts**: Public email addresses and telephone numbers.\n- **Social Links**: Profiles on Twitter/X, LinkedIn, Instagram, Facebook, GitHub, YouTube, Telegram, TikTok.\n- **Technologies**: Precision context-aware CMS and framework signatures.\n- **SEO Audit**: Automated 14-point SEO diagnostic score & warnings.\n- **Link Extractor**: Categorized internal vs external hyperlinks.\n- **Structured Data**: Schema.org JSON-LD schemas.\n- **Feeds**: RSS/Atom feed discovery.\n- **Security**: HTTP security headers score & IP-Pinned Anti-SSRF Protection.\n- **AI Reader**: Clean Markdown article text, word count & reading time.\n\nWithout `fields`, runs the complete pipeline. With `fields`, only runs\nthe extractors needed for the requested keys — `fields=detected_technologies`\nis exactly as cheap as `GET /api/v1/tech-stack`.","operationId":"extract_metadata_api_v1_extract_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","description":"The target website URL to analyze (e.g. https://example.com)","title":"Url"},"description":"The target website URL to analyze (e.g. https://example.com)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional comma-separated list of keys to filter response (e.g. metadata,contacts) — only runs the extractors those fields actually need, same as calling the matching specialized endpoint","title":"Fields"},"description":"Optional comma-separated list of keys to filter response (e.g. metadata,contacts) — only runs the extractors those fields actually need, same as calling the matching specialized endpoint"},{"name":"user_agent","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional custom User-Agent header","title":"User Agent"},"description":"Optional custom User-Agent header"},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-zyla-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Zyla-Proxy-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Bad Request: Invalid URL format, missing domain hostname, or blocked by IP-Pinned Anti-SSRF Shield"},"403":{"description":"Forbidden: Invalid or missing X-RapidAPI-Proxy-Secret authentication header"},"429":{"description":"Too Many Requests: Rate limit exceeded (60 requests/min per IP)"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/link-preview":{"get":{"tags":["Link Preview"],"summary":"Extract Link Preview","description":"Lightweight endpoint optimized for link preview cards (Social Cards / Unfurl):\nReturns title, description, og_image, favicon, favicon_high_res, site_name, and language.","operationId":"extract_link_preview_api_v1_link_preview_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","description":"The target URL to generate link preview for","title":"Url"},"description":"The target URL to generate link preview for"},{"name":"user_agent","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional custom User-Agent header","title":"User Agent"},"description":"Optional custom User-Agent header"},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-zyla-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Zyla-Proxy-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkPreviewResponse"}}}},"400":{"description":"Bad Request: Invalid URL format, missing domain hostname, or blocked by IP-Pinned Anti-SSRF Shield"},"403":{"description":"Forbidden: Invalid or missing X-RapidAPI-Proxy-Secret authentication header"},"429":{"description":"Too Many Requests: Rate limit exceeded (60 requests/min per IP)"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/contacts":{"get":{"tags":["Contact Discovery"],"summary":"Extract Contacts","description":"Dedicated endpoint for public contact-signal discovery:\nReturns public emails, telephone numbers, and official social media profile URLs\nfound on the page. This surfaces raw public signals, not verified company/people\ndata — it does not identify who these belong to or confirm they're monitored.","operationId":"extract_contacts_api_v1_contacts_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","description":"The target URL to extract contact information and social handles from","title":"Url"},"description":"The target URL to extract contact information and social handles from"},{"name":"user_agent","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional custom User-Agent header","title":"User Agent"},"description":"Optional custom User-Agent header"},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-zyla-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Zyla-Proxy-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactsResponse"}}}},"400":{"description":"Bad Request: Invalid URL format, missing domain hostname, or blocked by IP-Pinned Anti-SSRF Shield"},"403":{"description":"Forbidden: Invalid or missing X-RapidAPI-Proxy-Secret authentication header"},"429":{"description":"Too Many Requests: Rate limit exceeded (60 requests/min per IP)"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tech-stack":{"get":{"tags":["Tech Stack"],"summary":"Extract Tech Stack","description":"Dedicated endpoint for technology intelligence & CMS auditing:\nDetects 40+ frameworks and CMS signatures with structural context-aware matching.","operationId":"extract_tech_stack_api_v1_tech_stack_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","description":"The target URL to inspect for CMS and technology stack signatures","title":"Url"},"description":"The target URL to inspect for CMS and technology stack signatures"},{"name":"user_agent","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional custom User-Agent header","title":"User Agent"},"description":"Optional custom User-Agent header"},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-zyla-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Zyla-Proxy-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TechStackResponse"}}}},"400":{"description":"Bad Request: Invalid URL format, missing domain hostname, or blocked by IP-Pinned Anti-SSRF Shield"},"403":{"description":"Forbidden: Invalid or missing X-RapidAPI-Proxy-Secret authentication header"},"429":{"description":"Too Many Requests: Rate limit exceeded (60 requests/min per IP)"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/schema":{"get":{"tags":["Structured Data"],"summary":"Extract Schema","description":"Dedicated endpoint for Schema.org & JSON-LD structured data extraction:\nReturns parsed product pricing, e-commerce reviews, article schemas, event details, and organization metadata.","operationId":"extract_schema_api_v1_schema_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","description":"The target URL to extract Schema.org JSON-LD structured data from","title":"Url"},"description":"The target URL to extract Schema.org JSON-LD structured data from"},{"name":"user_agent","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional custom User-Agent header","title":"User Agent"},"description":"Optional custom User-Agent header"},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-zyla-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Zyla-Proxy-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchemaResponse"}}}},"400":{"description":"Bad Request: Invalid URL format, missing domain hostname, or blocked by IP-Pinned Anti-SSRF Shield"},"403":{"description":"Forbidden: Invalid or missing X-RapidAPI-Proxy-Secret authentication header"},"429":{"description":"Too Many Requests: Rate limit exceeded (60 requests/min per IP)"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/security":{"get":{"tags":["Security Audit"],"summary":"Extract Security Headers Endpoint","description":"Dedicated endpoint for HTTP Security Headers audit:\nInspects HSTS, Content-Security-Policy, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, and calculates a percentage security score.\nA site running only `Content-Security-Policy-Report-Only` (rollout in progress, nothing blocked yet) is graded as its own distinct `\"report-only\"` state rather than being scored as missing or as an enforced policy — the raw value is returned additively as `content_security_policy_report_only`. Every graded header also comes with a one-line `security_header_explanations` entry describing why it matters.\nSet `include_tls_details=true` to additionally perform a live TLS handshake and return certificate details (issuer, subject, validity dates, negotiated TLS version) — off by default to keep the base audit headers-only and fast.","operationId":"extract_security_headers_endpoint_api_v1_security_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","description":"The target URL to audit HTTP security headers","title":"Url"},"description":"The target URL to audit HTTP security headers"},{"name":"user_agent","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional custom User-Agent header","title":"User Agent"},"description":"Optional custom User-Agent header"},{"name":"include_tls_details","in":"query","required":false,"schema":{"type":"boolean","description":"Opt-in: perform a live TLS handshake to the target host's port 443 and return certificate issuer/subject/validity dates and negotiated TLS version as `tls_details`. Off by default — this is an extra network round-trip beyond the normal headers-only audit (which never opens a TLS connection itself, only reads headers already present on the page fetch), so it's opt-in to keep the default /security response fast. Never fails the request: an unreachable host, non-TLS port, or invalid/self-signed certificate results in `tls_details: null`, not an error.","default":false,"title":"Include Tls Details"},"description":"Opt-in: perform a live TLS handshake to the target host's port 443 and return certificate issuer/subject/validity dates and negotiated TLS version as `tls_details`. Off by default — this is an extra network round-trip beyond the normal headers-only audit (which never opens a TLS connection itself, only reads headers already present on the page fetch), so it's opt-in to keep the default /security response fast. Never fails the request: an unreachable host, non-TLS port, or invalid/self-signed certificate results in `tls_details: null`, not an error."},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-zyla-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Zyla-Proxy-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecurityHeadersResponse"}}}},"400":{"description":"Bad Request: Invalid URL format, missing domain hostname, or blocked by IP-Pinned Anti-SSRF Shield"},"403":{"description":"Forbidden: Invalid or missing X-RapidAPI-Proxy-Secret authentication header"},"429":{"description":"Too Many Requests: Rate limit exceeded (60 requests/min per IP)"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/markdown":{"get":{"tags":["AI & LLM Reader"],"summary":"Extract Clean Markdown Article","description":"Dedicated endpoint for AI Agents, ChatGPT, Claude & RAG pipelines:\nStrips noise (ads, navs, footers, scripts) and converts webpage article text into clean, structured Markdown with NLP auto-summary and keywords.","operationId":"extract_clean_markdown_article_api_v1_markdown_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","description":"The target article/webpage URL to extract clean LLM-ready Markdown from","title":"Url"},"description":"The target article/webpage URL to extract clean LLM-ready Markdown from"},{"name":"user_agent","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional custom User-Agent header","title":"User Agent"},"description":"Optional custom User-Agent header"},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-zyla-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Zyla-Proxy-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkdownResponse"}}}},"400":{"description":"Bad Request: Invalid URL format, missing domain hostname, or blocked by IP-Pinned Anti-SSRF Shield"},"403":{"description":"Forbidden: Invalid or missing X-RapidAPI-Proxy-Secret authentication header"},"429":{"description":"Too Many Requests: Rate limit exceeded (60 requests/min per IP)"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/seo-audit":{"get":{"tags":["SEO Audit"],"summary":"Extract Seo Audit","description":"Dedicated endpoint for automated SEO diagnostic audit:\nEvaluates Title tag, Meta Description, Canonical URL, H1 heading, OpenGraph image, Favicon, Image ALT coverage,\nHTTPS security, lang attribute, viewport, indexability, multiple-H1, Twitter Card, and structured data.\nAlso returns `readability`: sentence/paragraph counts, average words per sentence, and full h1-h6 heading structure.","operationId":"extract_seo_audit_api_v1_seo_audit_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","description":"The target URL to perform automated 14-point SEO diagnostic audit","title":"Url"},"description":"The target URL to perform automated 14-point SEO diagnostic audit"},{"name":"user_agent","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional custom User-Agent header","title":"User Agent"},"description":"Optional custom User-Agent header"},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-zyla-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Zyla-Proxy-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeoAuditResponse"}}}},"400":{"description":"Bad Request: Invalid URL format, missing domain hostname, or blocked by IP-Pinned Anti-SSRF Shield"},"403":{"description":"Forbidden: Invalid or missing X-RapidAPI-Proxy-Secret authentication header"},"429":{"description":"Too Many Requests: Rate limit exceeded (60 requests/min per IP)"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/links":{"get":{"tags":["Link Extractor"],"summary":"Extract Links Endpoint","description":"Dedicated endpoint for hyperlink extraction and domain classification:\nCategorizes all page links into internal links (same domain) and external links (third-party websites).","operationId":"extract_links_endpoint_api_v1_links_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","description":"The target URL to extract and classify internal vs external hyperlinks","title":"Url"},"description":"The target URL to extract and classify internal vs external hyperlinks"},{"name":"user_agent","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional custom User-Agent header","title":"User Agent"},"description":"Optional custom User-Agent header"},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-zyla-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Zyla-Proxy-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinksResponse"}}}},"400":{"description":"Bad Request: Invalid URL format, missing domain hostname, or blocked by IP-Pinned Anti-SSRF Shield"},"403":{"description":"Forbidden: Invalid or missing X-RapidAPI-Proxy-Secret authentication header"},"429":{"description":"Too Many Requests: Rate limit exceeded (60 requests/min per IP)"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/batch":{"post":{"tags":["Batch Processing"],"summary":"Batch Extract","description":"Batch URL processing: run a lightweight link-preview extraction (title, description,\nOG image, favicon, site name, language) over up to 10 URLs in one request. Each URL is\nfetched independently — one failing URL returns `{\"success\": false, \"error\": ...}` for\nthat item without affecting the others. Counts as N requests (one per URL) against the\nper-IP rate limit, not one.","operationId":"batch_extract_api_v1_batch_post","parameters":[{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-zyla-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Zyla-Proxy-Secret"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchResponse"}}}},"400":{"description":"Bad Request: Invalid URL format, missing domain hostname, or blocked by IP-Pinned Anti-SSRF Shield"},"403":{"description":"Forbidden: Invalid or missing X-RapidAPI-Proxy-Secret authentication header"},"429":{"description":"Too Many Requests: Rate limit exceeded (60 requests/min per IP)"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/domain":{"get":{"tags":["Domain Intelligence"],"summary":"Extract Domain Intel","description":"Dedicated endpoint for DNS / WHOIS domain intelligence:\nResolves A, AAAA, MX, NS, and TXT DNS records, plus registrar/creation_date/expiration_date\nWHOIS registration data, for the target URL's hostname. Never fetches the page itself —\nno HTTP GET, no HTML parsing, DNS/WHOIS lookups only. WHOIS servers are flaky/rate-limited\nfor many TLDs; a WHOIS failure returns `whois_info: null` rather than failing the request\nwhen DNS already succeeded.","operationId":"extract_domain_intel_api_v1_domain_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","description":"The target URL to look up DNS records and WHOIS registration data for — only the hostname is used, the page itself is never fetched","title":"Url"},"description":"The target URL to look up DNS records and WHOIS registration data for — only the hostname is used, the page itself is never fetched"},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-zyla-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Zyla-Proxy-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainInfoResponse"}}}},"400":{"description":"Bad Request: Invalid URL format, missing domain hostname, or blocked by IP-Pinned Anti-SSRF Shield"},"403":{"description":"Forbidden: Invalid or missing X-RapidAPI-Proxy-Secret authentication header"},"429":{"description":"Too Many Requests: Rate limit exceeded (60 requests/min per IP)"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"BatchItemResult":{"properties":{"url":{"type":"string","title":"Url"},"success":{"type":"boolean","title":"Success"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"final_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Final Url"},"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status Code"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"og_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Og Image"},"favicon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Favicon"},"site_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Name"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"redirect_count":{"type":"integer","title":"Redirect Count","default":0},"is_shortened_url":{"type":"boolean","title":"Is Shortened Url","default":false}},"additionalProperties":true,"type":"object","required":["url","success"],"title":"BatchItemResult"},"BatchRequest":{"properties":{"urls":{"items":{"type":"string"},"type":"array","title":"Urls"}},"type":"object","required":["urls"],"title":"BatchRequest"},"BatchResponse":{"properties":{"total":{"type":"integer","title":"Total"},"succeeded":{"type":"integer","title":"Succeeded"},"failed":{"type":"integer","title":"Failed"},"results":{"items":{"$ref":"#/components/schemas/BatchItemResult"},"type":"array","title":"Results"}},"type":"object","required":["total","succeeded","failed","results"],"title":"BatchResponse"},"ContactsResponse":{"properties":{"url":{"type":"string","title":"Url"},"final_url":{"type":"string","title":"Final Url"},"status_code":{"type":"integer","title":"Status Code"},"execution_time_ms":{"type":"number","title":"Execution Time Ms"},"bot_protection_detected":{"type":"boolean","title":"Bot Protection Detected","default":false},"redirect_count":{"type":"integer","title":"Redirect Count","default":0},"is_shortened_url":{"type":"boolean","title":"Is Shortened Url","default":false},"emails":{"items":{"type":"string"},"type":"array","title":"Emails"},"phones":{"items":{"type":"string"},"type":"array","title":"Phones"},"phone_details":{"items":{"$ref":"#/components/schemas/PhoneDetail"},"type":"array","title":"Phone Details","default":[]},"social_links":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object","title":"Social Links"}},"type":"object","required":["url","final_url","status_code","execution_time_ms","emails","phones","social_links"],"title":"ContactsResponse"},"DnsRecords":{"properties":{"A":{"items":{"type":"string"},"type":"array","title":"A","default":[]},"AAAA":{"items":{"type":"string"},"type":"array","title":"Aaaa","default":[]},"MX":{"items":{"type":"string"},"type":"array","title":"Mx","default":[]},"NS":{"items":{"type":"string"},"type":"array","title":"Ns","default":[]},"TXT":{"items":{"type":"string"},"type":"array","title":"Txt","default":[]}},"additionalProperties":true,"type":"object","title":"DnsRecords"},"DomainInfoResponse":{"properties":{"url":{"type":"string","title":"Url"},"hostname":{"type":"string","title":"Hostname"},"execution_time_ms":{"type":"number","title":"Execution Time Ms"},"dns_records":{"$ref":"#/components/schemas/DnsRecords"},"whois_info":{"anyOf":[{"$ref":"#/components/schemas/WhoisInfo"},{"type":"null"}]}},"type":"object","required":["url","hostname","execution_time_ms","dns_records"],"title":"DomainInfoResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"LinkPreviewResponse":{"properties":{"url":{"type":"string","title":"Url"},"final_url":{"type":"string","title":"Final Url"},"status_code":{"type":"integer","title":"Status Code"},"execution_time_ms":{"type":"number","title":"Execution Time Ms"},"bot_protection_detected":{"type":"boolean","title":"Bot Protection Detected","default":false},"redirect_count":{"type":"integer","title":"Redirect Count","default":0},"is_shortened_url":{"type":"boolean","title":"Is Shortened Url","default":false},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"og_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Og Image"},"favicon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Favicon"},"favicon_high_res":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Favicon High Res"},"site_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Name"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"}},"type":"object","required":["url","final_url","status_code","execution_time_ms","title","description","og_image","favicon","site_name","language"],"title":"LinkPreviewResponse"},"LinksResponse":{"properties":{"url":{"type":"string","title":"Url"},"final_url":{"type":"string","title":"Final Url"},"status_code":{"type":"integer","title":"Status Code"},"execution_time_ms":{"type":"number","title":"Execution Time Ms"},"bot_protection_detected":{"type":"boolean","title":"Bot Protection Detected","default":false},"redirect_count":{"type":"integer","title":"Redirect Count","default":0},"is_shortened_url":{"type":"boolean","title":"Is Shortened Url","default":false},"total_links_count":{"type":"integer","title":"Total Links Count"},"internal_links_count":{"type":"integer","title":"Internal Links Count"},"external_links_count":{"type":"integer","title":"External Links Count"},"internal_links":{"items":{"type":"string"},"type":"array","title":"Internal Links"},"external_links":{"items":{"type":"string"},"type":"array","title":"External Links"}},"type":"object","required":["url","final_url","status_code","execution_time_ms","total_links_count","internal_links_count","external_links_count","internal_links","external_links"],"title":"LinksResponse"},"MarkdownResponse":{"properties":{"url":{"type":"string","title":"Url"},"final_url":{"type":"string","title":"Final Url"},"status_code":{"type":"integer","title":"Status Code"},"execution_time_ms":{"type":"number","title":"Execution Time Ms"},"bot_protection_detected":{"type":"boolean","title":"Bot Protection Detected","default":false},"redirect_count":{"type":"integer","title":"Redirect Count","default":0},"is_shortened_url":{"type":"boolean","title":"Is Shortened Url","default":false},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"word_count":{"type":"integer","title":"Word Count"},"reading_time_minutes":{"type":"number","title":"Reading Time Minutes"},"summary_snippet":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary Snippet"},"top_keywords":{"items":{"type":"string"},"type":"array","title":"Top Keywords","default":[]},"markdown_content":{"type":"string","title":"Markdown Content"}},"type":"object","required":["url","final_url","status_code","execution_time_ms","title","word_count","reading_time_minutes","markdown_content"],"title":"MarkdownResponse"},"PhoneDetail":{"properties":{"raw":{"type":"string","title":"Raw"},"normalized":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Normalized"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"possible":{"type":"boolean","title":"Possible","default":false},"valid":{"type":"boolean","title":"Valid","default":false}},"additionalProperties":true,"type":"object","required":["raw"],"title":"PhoneDetail"},"ReadabilityMetrics":{"properties":{"sentence_count":{"type":"integer","title":"Sentence Count"},"paragraph_count":{"type":"integer","title":"Paragraph Count"},"avg_words_per_sentence":{"type":"number","title":"Avg Words Per Sentence"},"heading_structure":{"additionalProperties":{"type":"integer"},"type":"object","title":"Heading Structure","default":{}}},"additionalProperties":true,"type":"object","required":["sentence_count","paragraph_count","avg_words_per_sentence"],"title":"ReadabilityMetrics"},"SchemaResponse":{"properties":{"url":{"type":"string","title":"Url"},"final_url":{"type":"string","title":"Final Url"},"status_code":{"type":"integer","title":"Status Code"},"execution_time_ms":{"type":"number","title":"Execution Time Ms"},"bot_protection_detected":{"type":"boolean","title":"Bot Protection Detected","default":false},"redirect_count":{"type":"integer","title":"Redirect Count","default":0},"is_shortened_url":{"type":"boolean","title":"Is Shortened Url","default":false},"json_ld_count":{"type":"integer","title":"Json Ld Count"},"json_ld_schemas":{"items":{},"type":"array","title":"Json Ld Schemas"}},"type":"object","required":["url","final_url","status_code","execution_time_ms","json_ld_count","json_ld_schemas"],"title":"SchemaResponse"},"SecurityHeadersResponse":{"properties":{"url":{"type":"string","title":"Url"},"final_url":{"type":"string","title":"Final Url"},"status_code":{"type":"integer","title":"Status Code"},"execution_time_ms":{"type":"number","title":"Execution Time Ms"},"bot_protection_detected":{"type":"boolean","title":"Bot Protection Detected","default":false},"redirect_count":{"type":"integer","title":"Redirect Count","default":0},"is_shortened_url":{"type":"boolean","title":"Is Shortened Url","default":false},"security_score_percentage":{"type":"number","title":"Security Score Percentage"},"security_headers":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object","title":"Security Headers"},"security_header_grades":{"additionalProperties":{"type":"string"},"type":"object","title":"Security Header Grades","default":{}},"security_header_explanations":{"additionalProperties":{"type":"string"},"type":"object","title":"Security Header Explanations","default":{}},"tls_details":{"anyOf":[{"$ref":"#/components/schemas/TlsCertificateDetails"},{"type":"null"}]}},"type":"object","required":["url","final_url","status_code","execution_time_ms","security_score_percentage","security_headers"],"title":"SecurityHeadersResponse"},"SeoAuditResponse":{"properties":{"url":{"type":"string","title":"Url"},"final_url":{"type":"string","title":"Final Url"},"status_code":{"type":"integer","title":"Status Code"},"execution_time_ms":{"type":"number","title":"Execution Time Ms"},"bot_protection_detected":{"type":"boolean","title":"Bot Protection Detected","default":false},"redirect_count":{"type":"integer","title":"Redirect Count","default":0},"is_shortened_url":{"type":"boolean","title":"Is Shortened Url","default":false},"seo_score_percentage":{"type":"number","title":"Seo Score Percentage"},"passed_checks":{"items":{"type":"string"},"type":"array","title":"Passed Checks"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"},"checks":{"items":{"$ref":"#/components/schemas/SeoCheck"},"type":"array","title":"Checks","default":[]},"readability":{"anyOf":[{"$ref":"#/components/schemas/ReadabilityMetrics"},{"type":"null"}]}},"type":"object","required":["url","final_url","status_code","execution_time_ms","seo_score_percentage","passed_checks","warnings"],"title":"SeoAuditResponse"},"SeoCheck":{"properties":{"check":{"type":"string","title":"Check"},"passed":{"type":"boolean","title":"Passed"},"severity":{"type":"string","title":"Severity"},"evidence":{"type":"string","title":"Evidence"}},"additionalProperties":true,"type":"object","required":["check","passed","severity","evidence"],"title":"SeoCheck"},"TechStackResponse":{"properties":{"url":{"type":"string","title":"Url"},"final_url":{"type":"string","title":"Final Url"},"status_code":{"type":"integer","title":"Status Code"},"execution_time_ms":{"type":"number","title":"Execution Time Ms"},"bot_protection_detected":{"type":"boolean","title":"Bot Protection Detected","default":false},"redirect_count":{"type":"integer","title":"Redirect Count","default":0},"is_shortened_url":{"type":"boolean","title":"Is Shortened Url","default":false},"detected_technologies":{"items":{"type":"string"},"type":"array","title":"Detected Technologies"},"technology_details":{"items":{"$ref":"#/components/schemas/TechnologyDetail"},"type":"array","title":"Technology Details","default":[]}},"type":"object","required":["url","final_url","status_code","execution_time_ms","detected_technologies"],"title":"TechStackResponse"},"TechnologyDetail":{"properties":{"name":{"type":"string","title":"Name"},"confidence":{"type":"number","title":"Confidence"},"evidence":{"items":{"type":"string"},"type":"array","title":"Evidence","default":[]},"category":{"type":"string","title":"Category"}},"additionalProperties":true,"type":"object","required":["name","confidence","category"],"title":"TechnologyDetail"},"TlsCertificateDetails":{"properties":{"issuer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Issuer"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"},"valid_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Valid From"},"valid_until":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Valid Until"},"tls_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tls Version"},"is_expired":{"type":"boolean","title":"Is Expired","default":false}},"additionalProperties":true,"type":"object","title":"TlsCertificateDetails"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WhoisInfo":{"properties":{"registrar":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registrar"},"creation_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creation Date"},"expiration_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expiration Date"},"name_servers":{"items":{"type":"string"},"type":"array","title":"Name Servers","default":[]}},"additionalProperties":true,"type":"object","title":"WhoisInfo"}}}}