[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"api-page:email-and-seo-metadata-extraction-api":3,"api-discussions:email-and-seo-metadata-extraction-api":220},{"status":4,"api":5,"seo":215},"success",{"blocked":6,"description":7,"about":8,"stats":9,"name":11,"title":12,"slug":13,"logo":14,"created_at":15,"agent":16,"user":28,"endpoint_groups":31,"faqs":165,"features":175,"periodic_plans":176,"payasyougo_plans":213,"createdAtText":214},false,"Fast API to validate email syntax, detect disposable domains, and extract SEO Open Graph tags.","# Email and SEO Metadata Extraction\n\nA lightweight JSON API for email syntax checks, known disposable-domain detection, and metadata extraction from public HTML pages. Useful for signup forms, content previews, and SEO workflows.\n\n## Authentication and billing\n\nConnect to this API in the marketplace, choose a plan, and send your own consumer key in the `X-JoJAPI-Key` request header. Use the gateway URL and code snippets shown on each endpoint. Never share your account key or send provider proxy secrets from client code. Each endpoint call consumes one request from your selected plan; see Pricing for current allowances and billing rules.\n\n## Endpoints\n\n- `GET /validate-email?email=hello%40example.com` checks syntax and the domain against a built-in disposable-domain list. It returns `email`, `domain`, `validSyntax`, and `isDisposable`. An invalid address is a normal HTTP 200 assessment with `validSyntax: false`; a missing or empty parameter returns HTTP 400.\n- `GET /extract-seo?url=https%3A%2F%2Fexample.com` fetches a public HTML page and returns its final `url`, `title`, `description`, and `openGraph` object containing `title` and `image`. Missing tags are `null`; relative image URLs are resolved against the final page URL.\n- `GET /health` returns `status: ok` and a UTC ISO 8601 `timestamp`. This endpoint checks service availability, not the availability of every external target website.\n\n## Responses\n\nThe validation and extraction endpoints use `{ \"success\": true, \"data\": { ... }, \"error\": null }` for successful results. Origin errors use `{ \"success\": false, \"data\": null, \"error\": { \"code\": \"...\", \"message\": \"...\" } }`. Health uses its simpler response described above. Concrete JSON examples and HTTP statuses are documented on each endpoint.\n\nGateway authentication, subscription and quota errors can use a different format with a `message` field. See [gateway-generated responses](https://docs.jojapi.com/gateway/gateway-generated-responses). A successful health response does not confirm that a subscriber has remaining quota for every request.\n\n## Limits and interpretation\n\nEmail checks do not verify mailbox existence, check MX records, contact SMTP servers, send messages, or guarantee deliverability. Disposable-domain detection is list-based and cannot identify every temporary email service.\n\nSEO extraction reads server-returned HTML only: it does not execute JavaScript, bypass logins, solve challenges, or guarantee access to websites that block automated requests. It allows an 8-second request timeout, at most 3 redirects, and scans at most 256 KiB of HTML. Metadata beyond this scan limit may be absent. URLs must use HTTP or HTTPS without embedded credentials or custom ports. IP-literal URLs, local hostnames, and this service itself are rejected.\n\nURL-encode query values. Do not treat a missing metadata field as a server error. For target timeouts or upstream failures, retry conservatively with backoff; correct invalid parameters instead of repeatedly retrying them. Only retrieve pages you are authorized to access.",{"score":10},"2.75","Email and SEO Metadata Extraction","Email and SEO Metadata Extraction API","email-and-seo-metadata-extraction-api","https://cdn.jojapi.com/api/c2d44106-bf8a-457a-b481-404305b6c72b","2026-09-02 20:29:00",{"enabled":17,"closed":18,"request_enabled":6,"catalog_url":19,"discovery_url":20,"directory_url":21,"rails":22,"networks":25,"docs":27},true,null,"https://zlwwz.jojapi.net/_jojapi/agent/plans","https://zlwwz.jojapi.net/.well-known/x402","https://agents.jojapi.net/apis/email-and-seo-metadata-extraction-api",[23,24],"x402","mpp",[26],"eip155:8453","https://docs.jojapi.com/consumers/agents",{"nick":29,"name":30,"verified":6,"website":18},"diego-spoleto","Diego Spoleto",[32],{"endpoints":33,"name":164,"description":40,"ungrouped":17},[34,83,136],{"blocked":6,"hidden":6,"agent_price":18,"credits":18,"flexible_credits_description":18,"consumptions":35,"description":42,"method":43,"name":44,"url_path":45,"root_url":46,"parameters":47,"responses":62,"result_stats":79},[36],{"name":37,"slug":38,"cost":39,"label":40,"avg":41},"Requests","requests","1","",1,"Checks email syntax and flags known disposable-email domains. It does not verify mailbox existence.","GET","Validate Email","/validate-email","https://zlwwz.jojapi.net",{"url":48,"header":53,"post":59,"body":60,"path":61},[49],{"key":50,"example":51,"schema":18,"example_disabled":6,"example_type":52,"value_type":52,"enum_values":18,"default_value":51,"required":17,"name":40,"description":40},"email","hello@example.com","string",[54],{"key":55,"is_auth":17,"example":56,"example_disabled":17,"example_type":52,"name":57,"description":56,"required":17,"always_error":58},"X-JoJAPI-Key","You must log in to get API key","JoJ API Key","Please log in to get API key",[],[],[],[63,72],{"status":64,"status_code":65,"description":66,"schema":18,"examples":67,"example":71},"200",200,"Email syntax and disposable-domain assessment. This is not mailbox verification.",[68],{"name":69,"summary":70,"description":40,"example":71},"default","Syntactically valid non-disposable address","{\"success\":true,\"data\":{\"email\":\"hello@example.com\",\"domain\":\"example.com\",\"validSyntax\":true,\"isDisposable\":false},\"error\":null}",{"status":73,"status_code":74,"description":75,"schema":18,"examples":76,"example":78},"400",400,"Missing or empty email query parameter.",[77],{"name":69,"summary":40,"description":40,"example":78},"{\"success\":false,\"data\":null,\"error\":{\"code\":\"MISSING_PARAMETER\",\"message\":\"Query parameter \\\"email\\\" is required.\"}}",{"x2":80,"x3":81,"x4":81,"x5":81,"uptime":80,"avg_latency":82,"avg_credits":81},"100.00","0.00","125",{"blocked":6,"hidden":6,"agent_price":18,"credits":18,"flexible_credits_description":18,"consumptions":84,"description":86,"method":43,"name":87,"url_path":88,"root_url":46,"parameters":89,"responses":103,"result_stats":134},[85],{"name":37,"slug":38,"cost":39,"label":40,"avg":41},"Fetches a public HTML page and extracts its title, meta description, og:title, and og:image. Eligible successful results may be cached internally for up to 5 minutes (shorter when required by the target cache policy). Set optional fresh=true to bypass cache reads and writes; false or omission allows caching. Only exact true/false are accepted; invalid or duplicate fresh parameters return HTTP 400. Response headers X-SEO-Cache (HIT, MISS, BYPASS) and X-SEO-Cache-Age (whole seconds; 0 for MISS/BYPASS) report cache use. Reading can stop once all four non-empty fields are complete. Missing fields remain null; JavaScript is not executed. Authentication and marketplace request quotas still apply to cache hits.","Extract SEO Metadata","/extract-seo",{"url":90,"header":98,"post":100,"body":101,"path":102},[91,94],{"key":92,"example":93,"schema":18,"example_disabled":6,"example_type":52,"value_type":52,"enum_values":18,"default_value":93,"required":17,"name":40,"description":40},"url","https://example.com/",{"key":95,"example":96,"schema":18,"example_disabled":6,"example_type":52,"value_type":97,"enum_values":18,"default_value":40,"required":6,"name":40,"description":40},"fresh","false","boolean",[99],{"key":55,"is_auth":17,"example":56,"example_disabled":17,"example_type":52,"name":57,"description":56,"required":17,"always_error":58},[],[],[],[104,109,114,119,124,129],{"status":64,"status_code":65,"description":105,"schema":18,"examples":106,"example":108},"HTML metadata extracted successfully. Missing tags return null; JavaScript is not executed. X-SEO-Cache reports HIT, MISS or BYPASS; X-SEO-Cache-Age reports whole seconds (0 for MISS/BYPASS). Client Cache-Control remains no-store.",[107],{"name":69,"summary":40,"description":40,"example":108},"{\"success\":true,\"data\":{\"url\":\"https:\\/\\/example.com\\/\",\"title\":\"Example Domain\",\"description\":null,\"openGraph\":{\"title\":null,\"image\":null}},\"error\":null}",{"status":73,"status_code":74,"description":110,"schema":18,"examples":111,"example":113},"The url parameter is missing, empty or invalid (MISSING_PARAMETER / INVALID_URL), or fresh is not exactly true or false or is repeated (INVALID_PARAMETER).",[112],{"name":69,"summary":40,"description":40,"example":113},"{\"success\":false,\"data\":null,\"error\":{\"code\":\"MISSING_PARAMETER\",\"message\":\"Query parameter \\\"url\\\" is required.\"}}",{"status":115,"status_code":116,"description":117,"schema":18,"examples":118,"example":40},"403",403,"Target URL is not allowed: credentials, custom ports, IP literals, local hostnames or this service are rejected.",[],{"status":120,"status_code":121,"description":122,"schema":18,"examples":123,"example":40},"422",422,"The target returned a non-HTML content type.",[],{"status":125,"status_code":126,"description":127,"schema":18,"examples":128,"example":40},"502",502,"Unable to retrieve the target page, unsuccessful upstream HTTP status, invalid redirect, too many redirects, or empty upstream body.",[],{"status":130,"status_code":131,"description":132,"schema":18,"examples":133,"example":40},"504",504,"The target request exceeded the 8-second timeout.",[],{"x2":80,"x3":81,"x4":81,"x5":81,"uptime":80,"avg_latency":135,"avg_credits":81},"122",{"blocked":6,"hidden":6,"agent_price":18,"credits":18,"flexible_credits_description":18,"consumptions":137,"description":139,"method":43,"name":140,"url_path":141,"root_url":46,"parameters":142,"responses":149,"result_stats":162},[138],{"name":37,"slug":38,"cost":39,"label":40,"avg":41},"Returns the current API status and server timestamp.","Health Check","/health",{"url":143,"header":144,"post":146,"body":147,"path":148},[],[145],{"key":55,"is_auth":17,"example":56,"example_disabled":17,"example_type":52,"name":57,"description":56,"required":17,"always_error":58},[],[],[],[150,155],{"status":64,"status_code":65,"description":151,"schema":18,"examples":152,"example":154},"Service is responding. timestamp is the current UTC time in ISO 8601 format.",[153],{"name":69,"summary":40,"description":40,"example":154},"{\"status\":\"ok\",\"timestamp\":\"2026-09-05T18:00:00.000Z\"}",{"status":156,"status_code":157,"description":158,"schema":18,"examples":159,"example":161},"401",401,"Generated by the JoJ API gateway when the consumer API key is missing or invalid, or the required subscription is absent. Include your own X-JoJAPI-Key header. Gateway errors use a message field, not the origin JSON envelope.",[160],{"name":69,"summary":40,"description":40,"example":161},"{\"message\":\"Unauthorized\"}",{"x2":80,"x3":81,"x4":81,"x5":81,"uptime":80,"avg_latency":163,"avg_credits":81},"72","Ungrouped Endpoints",[166,169,172],{"question":167,"answer":168},"Does email validation verify that a mailbox exists?","No. GET /validate-email?email=hello@example.com checks address syntax and matches the domain against a built-in list of known disposable email services. It does not send email, contact an SMTP server, check MX records, or guarantee deliverability. A syntactically invalid address is returned as a successful HTTP 200 result with validSyntax=false. An omitted or empty email parameter returns HTTP 400.",{"question":170,"answer":171},"Which SEO fields are extracted and what are the limits?","GET /extract-seo?url=https%3A%2F%2Fexample.com reads the HTML returned by a public HTTP or HTTPS page and returns its title, meta description, og:title and og:image. Missing fields are null; relative image URLs are resolved against the final page URL. JavaScript is not executed. The request has an 8-second timeout, follows at most 3 redirects and scans at most 256 KiB of HTML, so tags beyond that limit may be absent. URLs containing credentials, custom ports, IP literals, local hostnames or the service itself are rejected.",{"question":173,"answer":174},"Are SEO results cached, and how do I request fresh metadata?","Eligible successful SEO results may be reused for up to 5 minutes; target cache policies, response age, redirects and cache availability can shorten or prevent reuse. Set fresh=true to bypass both cache reads and writes. It does not invalidate or refresh an existing cache entry. Omit fresh or use fresh=false to allow caching. Only exact true and false are accepted; invalid values or duplicate fresh parameters return HTTP 400 (INVALID_PARAMETER). X-SEO-Cache reports HIT, MISS or BYPASS; X-SEO-Cache-Age is the whole-second age for HIT and 0 otherwise. Errors, no-store/private/no-cache responses, responses setting cookies or declaring Vary: *, and recognized sensitive URL parameters are not cached. Do not submit secrets or private URLs. Client responses remain Cache-Control: no-store. Authentication and marketplace request quotas still apply to cache hits. Reading stops early when the complete non-empty title and all three supported meta values are available; otherwise the normal 256 KiB and 8-second limits apply. Performance depends on the target site, network and cache availability; no fixed speed-up is guaranteed.",[],[177,193,203],{"type":178,"slug":179,"blocked":6,"period":180,"currency":181,"pricing":182,"rate_limit":186,"objects":187,"name":191,"display_name":191,"features":192},"periodic","rk4ur0mzcj8ij1fm3q5cxgzl","1 MONTH","usd",{"price":183,"credits":183,"past_due_timeout_num":184,"past_due_timeout_type":185},0,3,"DAY",{"max_requests":18,"time_window":18},[188],{"id":189,"name":37,"slug":38,"quota":190,"tiers":18},"n6f88106a",100,"BASIC",[],{"type":178,"slug":194,"blocked":6,"period":180,"currency":181,"pricing":195,"rate_limit":197,"objects":198,"name":201,"display_name":201,"features":202},"rz8r7l76wrp6dobd52lwvg1h",{"price":196,"credits":183,"past_due_timeout_num":184,"past_due_timeout_type":185},15,{"max_requests":18,"time_window":18},[199],{"id":189,"name":37,"slug":38,"quota":200,"tiers":18},10000,"PRO",[],{"type":178,"slug":204,"blocked":6,"period":180,"currency":181,"pricing":205,"rate_limit":207,"objects":208,"name":211,"display_name":211,"features":212},"23b1di5za5pfq1y7crrw4a3t",{"price":206,"credits":183,"past_due_timeout_num":184,"past_due_timeout_type":185},75,{"max_requests":18,"time_window":18},[209],{"id":189,"name":37,"slug":38,"quota":210,"tiers":18},100000,"ULTRA",[],[],"2026-09-02",{"canonical":216,"page_title":217,"meta":218},"https://jojapi.com/hub/api/email-and-seo-metadata-extraction-api","Email and SEO Metadata Extraction API Documentation & Playground - JoJ API",{"description":7,"keywords":219},"API,API Documentation,API Playground,Plans & Pricing,Email and SEO Metadata Extraction,diego-spoleto",{"status":4,"discussions":221},[]]