Every change Wellknown observed on this MCP server, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Changed the definition of "check_discoverability", "get_report" and "verify_fix"
⟨407 unchanged words⟩ the component re-checked","type":"string"},"website_at":{"description":"When the domain asked about serves no website but its registrable domain does, that domain's discoverability result. The score belongs to `domain` here, not to the domain in the request.","properties":{"cache_age_seconds":{"type":"integer"},"components":{"description":"Component headlines only; scan this domain for the checks behind them","items":{"properties":{"key":{"type":"string"},"max":{"type":"integer"},"name":{"type":"string"},"points":{"type":"integer"}},"type":"object"},"type":"array"},"domain":{"type":"string"},"grade":{"type":"string"},"open_fixes":{"type":"integer"},"report_url":{"type":"string"},"score":{"type":"integer"},"verdict":{"type":"string"}},"type":["object","null"]}},"required":["domain","score"," ⟨3 unchanged words⟩
⟨409 unchanged words⟩ the component re-checked","type":"string"},"website_at":{"description":"When the domain asked about serves no website but its registrable domain does, that domain's discoverability result. The score belongs to `domain` here, not to the domain in the request.","properties":{"cache_age_seconds":{"type":"integer"},"components":{"description":"Component headlines only; scan this domain for the checks behind them","items":{"properties":{"key":{"type":"string"},"max":{"type":"integer"},"name":{"type":"string"},"points":{"type":"integer"}},"type":"object"},"type":"array"},"domain":{"type":"string"},"grade":{"type":"string"},"open_fixes":{"type":"integer"},"report_url":{"type":"string"},"score":{"type":"integer"},"verdict":{"type":"string"}},"type":["object","null"]}},"type":["object","null"]},"discoverability_cache_age_seconds":{"type":["integer","null" ⟨432 unchanged words⟩ problem with the result.","type":"string"},"website_at":{"description":"When the domain asked about serves no website but its registrable domain does, that domain's discoverability result. The score belongs to `domain` here, not to the domain in the request.","properties":{"cache_age_seconds":{"type":"integer"},"components":{"description":"Component headlines only; scan this domain for the checks behind them","items":{"properties":{"key":{"type":"string"},"max":{"type":"integer"},"name":{"type":"string"},"points":{"type":"integer"}},"type":"object"},"type":"array"},"domain":{"type":"string"},"grade":{"type":"string"},"open_fixes":{"type":"integer"},"report_url":{"type":"string"},"score":{"type":"integer"},"verdict":{"type":"string"}},"type":["object","null"]}},"required":["domain","email_security"] ⟨2 unchanged words⟩
⟨407 unchanged words⟩ the component re-checked","type":"string"},"website_at":{"description":"When the domain asked about serves no website but its registrable domain does, that domain's discoverability result. The score belongs to `domain` here, not to the domain in the request.","properties":{"cache_age_seconds":{"type":"integer"},"components":{"description":"Component headlines only; scan this domain for the checks behind them","items":{"properties":{"key":{"type":"string"},"max":{"type":"integer"},"name":{"type":"string"},"points":{"type":"integer"}},"type":"object"},"type":"array"},"domain":{"type":"string"},"grade":{"type":"string"},"open_fixes":{"type":"integer"},"report_url":{"type":"string"},"score":{"type":"integer"},"verdict":{"type":"string"}},"type":["object","null"]}},"required":["domain","score"," ⟨3 unchanged words⟩
Changed the definition of "check_discoverability", "check_email_security", "fetch_as_crawler" and 2 more
DiscoverabilityCheckscorewhetherforsearch engines and AI assistants can crawl, read and quote this site. Use when the person asks about SEO basics, robots.txt, sitemaps, llms.txt, or whether Google, ChatGPT, Claude or Perplexity can see their site. Input: a bare domain:like example.com. Returns a Discoverability score 0-100 broken into crawl access (25: robots.txt, plus what the edge actually serves to Googlebot, Bingbot, OAI-SearchBot, PerplexityBot, ClaudeBot and GPTBot), site plumbing (20: HTTPS, one canonical host, sitemap, real 404s),
Changed the definition of "get_report"
⟨29 unchanged words⟩ "is my domain set up right?" questions. Saves a snapshot of the findings to a new, unlisted page at astraverify.com and returns its address, so the link keeps working after the scan has aged out.
{"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":truefalse,"title":"Domain Trust report (both scores)"}
Changed the definition of "check_discoverability", "check_email_security", "fetch_as_crawler" and 2 more
⟨347 unchanged words⟩ on astraverify.com","type":"string"},"request_id":{"description":"req_... for this call. Quote it when reporting a problem with the result.","type":"string"},"score":{"description":"Out of 100, ⟨45 unchanged words⟩
⟨289 unchanged words⟩ on astraverify.com","type":"string"},"request_id":{"description":"req_... for this call. Quote it when reporting a problem with the result.","type":"string"},"score":{"description":"Out of 100, ⟨13 unchanged words⟩
Changed the definition of "check_discoverability", "check_email_security", "get_report" and 1 more
⟨78 unchanged words⟩ "type":["string","null"]},"held_back":{"description":"Points the cap holds back while a fix is open (89 cap) or a critical one is (69). Not taken from any component: sum(components.points) - held_back = score","type":"integer"},"inconclusive":{"description":"The site could not ⟨78 unchanged words⟩ :"integer"},"raw":{"description":"Before the cap rules that holdWhat theheadlinecomponentsbackaddwhileupato,fixbeforeis
Changed the definition of "check_discoverability", "check_email_security", "fetch_as_crawler" and 2 more
⟨15 unchanged words⟩ ":"integer"},"canonical_host":{"type":["string","null"]},"capped":{"type":"boolean"},"cdn":{"type":["string","null"]},"components":{"items":{"description": ⟨37 unchanged words⟩ ,"grade":{"description":"A+ to F, or null alongside a null score","type":["string","null"]},"inconclusive":{"description":"The site could not be fetched, so the scan could not be completed. A failure to measure, not a finding about the site.","type":"boolean"},"not_applicable":{"description":"The domain publishes no web address, so there is no website to assess. Not a low score: score and grade are null and there are no recommendations. verdict names the domain to scan instead.","type":"boolean"},"not_checked":{"description":"Parts skipped in this ⟨28 unchanged words⟩ is open","type":"integer"},"reason":{"description":"Why score is null, when it is","type":["string","null"]},"
Certificate recorded, valid to 2026-12-16
Authorization not required
Changed the definition of "check_discoverability", "check_email_security", "fetch_as_crawler" and 2 more
before
—after
{"properties":{"cache_age_seconds":{"description":"Age of the result; 0 means it was scanned just now","type":"integer"},"canonical_host":{"type":"string"},"capped":{"type":"boolean"},"cdn":{"type":"string"},"components":{"items":{"description":"One scored area of the domain","properties":{"enabled":{"type":"boolean"},"key":{"type":"string"},"max":{"type":"integer"},"name":{"type":"string"},"points":{"type":"integer"},"summary":{"type":"string"}},"required":["key","name","points","max"],"type":"object"},"type":"array"},"domain":{"type":"string"},"grade":{"description":"A+ to F","type":"string"},"not_checked":{"description":"Parts skipped in this scan","items":{"type":"string"},"type":"array"},"open_fixes":{"description":"Findings above info level","type":"integer"},"raw":{"description":"Before the cap rules that hold the headline back while a fix is open","type":"integer"},"recommendations":{"items":{"properties":{"component":{"type":"string"},"fix":{"description":"The exact change to publish: a DNS record (name, type, value) or a file or tag (kind, label, value, where)","properties":{"kind":{"type":"string"},"label":{"type":"string"},"name":{"type":"string"},"note":{"type":"string"},"type":{"type":"string"},"value":{"type":"string"},"where":{"type":"string"}},"type":"object"},"id":{"type":"string"},"scan":{"enum":["email","discoverability"],"type":"string"},"severity":{"enum":["critical","important","info"],"type":"string"},"tags":{"items":{"type":"string"},"type":"array"},"title":{"type":"string"},"why":{"type":"string"}},"required":["id","severity","title"],"type":"object"},"type":"array"},"report_url":{"description":"The report page for this domain on astraverify.com","type":"string"},"score":{"description":"Out of 100, exactly as astraverify.com shows it","type":"integer"},"verdict":{"description":"One sentence on what engines can do with the site","type":"string"},"verified_component":{"description":"Set by verify_fix: the component re-checked","type":"string"}},"required":["domain","score","grade"],"type":"object"}Unknown → Live
First tool surface recorded: 5 tools (server version 1.0.0)
https://astraverify.com/mcp (mcp_streamable_http) — from mcp_registry, with the record
Showing the latest 12 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
Check whether anyone can send email as this domain, and whether its own mail reaches the inbox. Use when the person asks about email security, spoofing or phishing risk, SPF, DKIM or DMARC setup, or why their mail goes to spam. Input: a bare domain like example.com - no scheme, no path. Given a URL or an email address, extract the domain and say what you extracted. Subdomains score in their own right: mail from the apex is not evidence about mail.example.com. Returns an Email Security scorefor0-100abrokendomainintowithMX (25), SPF (25), DKIM (20) and DMARC (30), theDNSstatusrecordsoffoundeach published record, the mail provider identified from MX, and the exactrecordsDNS record to publish foreacheveryfix.finding. DNS-only, so it answers in about a second; cached 15 minutes, and refresh is for when DNS has just changed. One caveat to pass on rather than hide: DKIM selectors cannot be enumerated from DNS. They are found by probing the selectors known for the mail provider plus a list of a few hundred common names. A provider that issues random selectors - Amazon SES and Postmark among them - can only be confirmed from a live email, so report DKIM as not found by probing, never as proof the domain does not sign.
WhatShowGooglebotexactly what one named crawler receives from the domain's root page. Use when the person asks "what does Google see?" or "can ChatGPT read my site?",Bingbotand whenever check_discoverability reports a crawl-access problem - this is the tool that explains such a result instead of restating it. robots.txt can read perfectly while a CDN or firewall returns 403 to one crawler and 200 to another,OAI-SearchBotand only a real fetch shows that. Inputs: domain (bare,PerplexityBotlike example.com) and agent,ClaudeBotexactlyoroneGPTBotofreceivegooglebot,frombingbot, oai-searchbot, perplexitybot, claudebot, gptbot. Call it once per crawler to compare them. Returns thesite:HTTP status,redirectsthe full redirect chain, response headers, content type, the text that crawler would index, andextractedflagstext.forShowsanCDNoutright block orfirewallablocksbot-challengethatpagerobots.txt-cannot.which is how cloaking becomes visible. One live fetch of the root page, nothing else, and it changes nothing.
Both AstraVerify scores for a domain,theplusopenafixesshareablerankedreportbylink.severityReach for this first on any broad question - "is my domain set up right?", "check my domain", "what should I fix first?" - and use the single-subject tools only once the person has narrowed it to email or to the website. Input: asavedbarereportdomainlinklike(report_url)example.com.thatReturnsopensthe Email Security score, thesameDiscoverability score, every open fix ranked critical then important then informational, and report_url. Work down that order. Some findingswithoutare marked as needing no action - arescan;weaksharekeyittheas-is.providerUsegeneratesthisandfirstthe owner cannot replace, for"isinstancemy-domainsosetdoupnotright?"presentquestions.thoseSavesas work. Unlike the other tools here, this one creates something: report_url is a snapshot ofthethese findings saved to a new,unlisted page atastraverify.comastraverify.com/r/..., andreturnsthatitspageaddress,issowhat thelinkpersonkeepscanworkingsend to whoever administers the domain. It opens later without rescanning, after the scan itself has aged out. Running the tool again on an unchanged scan returns the same page rather than a second one. Nothing is written anywhere the person owns.
Re-runsRe-checkonlya single discoverability component after thecheckspersonbehindhasonefixed it. Use only once check_discoverability has reported that component failing and the person says the fix is done - never speculatively. Without a previous scan to compare against it returns NOT_READY. Inputs: domain (bare, like example.com) and component, one of crawl, plumbing, metadata, structured, answer)and-returnsthe identifier from the earlier scan's findings. Returns that component re-measured and the updatedscore.Discoverability score, so you can tell the person plainly whether the change worked. Always a live re-fetch, never served from cache, which is exactly why it beats a second check_discoverability straight after an edit. It draws on the discoverability fresh-scan budget for that domain (30 an hour, counted across all callers), so use a full check_discoverability instead when several areas changed. It only re-reads public pages; it changes nothing on the site.
⟨92 unchanged words⟩ ,"ms":{"type":"integer"},"request_id":{"description":"req_... for this call. Quote it when reporting a problem with the result.","type":"string"},"status":{"description":"HTTP status the crawler ⟨13 unchanged words⟩
⟨349 unchanged words⟩ on astraverify.com","type":"string"},"request_id":{"description":"req_... for this call. Quote it when reporting a problem with the result.","type":"string"},"score":{"description":"Out of 100, ⟨457 unchanged words⟩ that opens without a rescan; safe to share","type":"string"},"request_id":{"description":"req_... for this call. Quote it when reporting a problem with the result.","type":"string"}},"required": ⟨4 unchanged words⟩
⟨347 unchanged words⟩ on astraverify.com","type":"string"},"request_id":{"description":"req_... for this call. Quote it when reporting a problem with the result.","type":"string"},"score":{"description":"Out of 100, ⟨45 unchanged words⟩
⟨62 unchanged words⟩ to F","type":"string"},"held_back":{"description":"Points the cap holds back while a fix is open (89 cap) or a critical one is (69). Not taken from any component: sum(components.points) - held_back = score","type":"integer"},"null_mx":{"description":"The domain declares that ⟨17 unchanged words⟩ ":{"description":"Mail provider detected fromMXMX; null when not recognised","type":["string","null"]},"raw":{"description":"Before the cap rules that holdWhat theheadlinecomponentsbackaddwhileupato,fixbeforeistheopencap","type":"integer"},"recommendations":{ ⟨161 unchanged words⟩
⟨80 unchanged words⟩ "type":["string","null"]},"held_back":{"description":"Points the cap holds back while a fix is open (89 cap) or a critical one is (69). Not taken from any component: sum(components.points) - held_back = score","type":"integer"},"inconclusive":{"description":"The site could not ⟨78 unchanged words⟩ :"integer"},"raw":{"description":"Before the cap rules that holdWhat theheadlinecomponentsbackaddwhileupato,fixbeforeistheopencap","type":"integer"},"reason":{ ⟨261 unchanged words⟩ to F","type":"string"},"held_back":{"description":"Points the cap holds back while a fix is open (89 cap) or a critical one is (69). Not taken from any component: sum(components.points) - held_back = score","type":"integer"},"open_fixes":{"description":"Findings above info level","type":"integer"},"raw":{"description":"Before the cap rules that holdWhat theheadlinecomponentsbackaddwhileupato,fixbeforeistheopencap","type":"integer"},"recommendations":{ ⟨293 unchanged words⟩
⟨78 unchanged words⟩ "type":["string","null"]},"held_back":{"description":"Points the cap holds back while a fix is open (89 cap) or a critical one is (69). Not taken from any component: sum(components.points) - held_back = score","type":"integer"},"inconclusive":{"description":"The site could not ⟨78 unchanged words⟩ :"integer"},"raw":{"description":"Before the cap rules that holdWhat theheadlinecomponentsbackaddwhileupato,fixbeforeistheopencap","type":"integer"},"reason":{ ⟨187 unchanged words⟩
⟨137 unchanged words⟩ or tag (kind, label, value, where). Null when there is nothing to publish, for example \"turn on DKIM in your provider\".","properties":{"kind":{"type":["string","null"]},"label":{"type":["string","null"]},"name":{"type":["string","null"]},"note":{"type":["string","null"]},"type":{"type":["string","null"]},"value":{"type":["string","null"]},"where":{"type":["string","null"]}},"type":["object","null"]},"id":{"type":"string"}, ⟨81 unchanged words⟩
⟨43 unchanged words⟩ ":"boolean"},"content_type":{"type":["string","null"]},"domain":{"type":"string"}, ⟨5 unchanged words⟩ {"description":"The text this crawler wouldindexindex; null when the fetch failed","type":["string","null"]},"final_url":{"type":["string","null"]},"headers":{"additionalProperties":{"type": ⟨26 unchanged words⟩ ,"null"]},"title":{"type":["string","null"]}},"required":["domain","agent"] ⟨2 unchanged words⟩
⟨14 unchanged words⟩ just now","type":"integer"},"canonical_host":{"type":["string","null"]},"capped":{"type":"boolean"},"cdn":{"type":["string","null"]},"components":{"items":{"description":"One ⟨36 unchanged words⟩ ,"grade":{"description":"A+ to F, or null alongside a null score","type":["string","null"]},"inconclusive":{"description":"The site could not be fetched, so the scan could not be completed. A failure to measure, not a finding about the site.","type":"boolean"},"not_applicable":{"description":"The domain publishes no web address, so there is no website to assess. Not a low score: score and grade are null and there are no recommendations. verdict names the domain to scan instead.","type":"boolean"},"not_checked":{"description":"Parts skipped in this scan","items":{"type":"string"},"type":"array"},"open_fixes":{"description":"Findings above info level ⟨16 unchanged words⟩ is open","type":"integer"},"reason":{"description":"Why score is null, when it is","type":["string","null"]},"recommendations":{"items":{"properties":{"component ⟨18 unchanged words⟩ or tag (kind, label, value, where). Null when there is nothing to publish, for example \"turn on DKIM in your provider\".","properties":{"kind":{"type":["string","null"]},"label":{"type":["string","null"]},"name":{"type":["string","null"]},"note":{"type":["string","null"]},"type":{"type":["string","null"]},"value":{"type":["string","null"]},"where":{"type":["string","null"]}},"type":["object","null"]},"id":{"type":"string"}, ⟨47 unchanged words⟩ "Out of 100, exactly as astraverify.com showsitit. Null when not_applicable or inconclusive is set.","type":["integer","null"]},"verdict":{"description":"One sentence on what engines can do with the site","type":"string"},"verified_component":{"description":"Set by verify_fix: the component re-checked","type":"string"}},"type":["object","null"]}, ⟨129 unchanged words⟩ or tag (kind, label, value, where). Null when there is nothing to publish, for example \"turn on DKIM in your provider\".","properties":{"kind":{"type":["string","null"]},"label":{"type":["string","null"]},"name":{"type":["string","null"]},"note":{"type":["string","null"]},"type":{"type":["string","null"]},"value":{"type":["string","null"]},"where":{"type":["string","null"]}},"type":["object","null"]},"id":{"type":"string"}, ⟨101 unchanged words⟩ or tag (kind, label, value, where). Null when there is nothing to publish, for example \"turn on DKIM in your provider\".","properties":{"kind":{"type":["string","null"]},"label":{"type":["string","null"]},"name":{"type":["string","null"]},"note":{"type":["string","null"]},"type":{"type":["string","null"]},"value":{"type":["string","null"]},"where":{"type":["string","null"]}},"type":["object","null"]},"id":{"type":"string"}, ⟨53 unchanged words⟩
⟨15 unchanged words⟩ ":"integer"},"canonical_host":{"type":["string","null"]},"capped":{"type":"boolean"},"cdn":{"type":["string","null"]},"components":{"items":{"description": ⟨37 unchanged words⟩ ,"grade":{"description":"A+ to F, or null alongside a null score","type":["string","null"]},"inconclusive":{"description":"The site could not be fetched, so the scan could not be completed. A failure to measure, not a finding about the site.","type":"boolean"},"not_applicable":{"description":"The domain publishes no web address, so there is no website to assess. Not a low score: score and grade are null and there are no recommendations. verdict names the domain to scan instead.","type":"boolean"},"not_checked":{"description":"Parts skipped in this ⟨28 unchanged words⟩ is open","type":"integer"},"reason":{"description":"Why score is null, when it is","type":["string","null"]},"recommendations":{"items":{"properties":{"component ⟨18 unchanged words⟩ or tag (kind, label, value, where). Null when there is nothing to publish, for example \"turn on DKIM in your provider\".","properties":{"kind":{"type":["string","null"]},"label":{"type":["string","null"]},"name":{"type":["string","null"]},"note":{"type":["string","null"]},"type":{"type":["string","null"]},"value":{"type":["string","null"]},"where":{"type":["string","null"]}},"type":["object","null"]},"id":{"type":"string"}, ⟨47 unchanged words⟩ "Out of 100, exactly as astraverify.com showsitit. Null when not_applicable or inconclusive is set.","type":["integer","null"]},"verdict":{"description":"One sentence ⟨26 unchanged words⟩
before
—after
{"properties":{"cache_age_seconds":{"description":"Age of the result; 0 means it was scanned just now","type":"integer"},"capped":{"type":"boolean"},"components":{"items":{"description":"One scored area of the domain","properties":{"enabled":{"type":"boolean"},"key":{"type":"string"},"max":{"type":"integer"},"name":{"type":"string"},"points":{"type":"integer"},"summary":{"type":"string"}},"required":["key","name","points","max"],"type":"object"},"type":"array"},"domain":{"type":"string"},"grade":{"description":"A+ to F","type":"string"},"null_mx":{"description":"The domain declares that it sends and receives no mail","type":"boolean"},"open_fixes":{"description":"Findings above info level","type":"integer"},"provider":{"description":"Mail provider detected from MX","type":"string"},"raw":{"description":"Before the cap rules that hold the headline back while a fix is open","type":"integer"},"recommendations":{"items":{"properties":{"component":{"type":"string"},"fix":{"description":"The exact change to publish: a DNS record (name, type, value) or a file or tag (kind, label, value, where)","properties":{"kind":{"type":"string"},"label":{"type":"string"},"name":{"type":"string"},"note":{"type":"string"},"type":{"type":"string"},"value":{"type":"string"},"where":{"type":"string"}},"type":"object"},"id":{"type":"string"},"scan":{"enum":["email","discoverability"],"type":"string"},"severity":{"enum":["critical","important","info"],"type":"string"},"tags":{"items":{"type":"string"},"type":"array"},"title":{"type":"string"},"why":{"type":"string"}},"required":["id","severity","title"],"type":"object"},"type":"array"},"records":{"additionalProperties":{"items":{"type":"object"},"type":"array"},"description":"DNS records found, keyed mx, spf, dkim, dmarc","type":"object"},"report_url":{"description":"The report page for this domain on astraverify.com","type":"string"},"score":{"description":"Out of 100, exactly as astraverify.com shows it","type":"integer"}},"required":["domain","score","grade"],"type":"object"}before
—after
{"properties":{"agent":{"type":"string"},"blocked":{"description":"The response refused the crawler (403, 429 or similar)","type":"boolean"},"chain":{"description":"Redirect hops","items":{"properties":{"status":{"type":"integer"},"url":{"type":"string"}},"type":"object"},"type":"array"},"challenge":{"description":"A bot-challenge page rather than the site","type":"boolean"},"content_type":{"type":"string"},"domain":{"type":"string"},"error":{"type":["string","null"]},"extract":{"description":"The text this crawler would index","type":"string"},"final_url":{"type":"string"},"headers":{"additionalProperties":{"type":"string"},"type":"object"},"label":{"description":"The crawler as its operator names it","type":"string"},"ms":{"type":"integer"},"status":{"description":"HTTP status the crawler received","type":["integer","null"]},"title":{"type":"string"}},"required":["domain","agent"],"type":"object"}before
—after
{"properties":{"discoverability":{"properties":{"cache_age_seconds":{"description":"Age of the result; 0 means it was scanned just now","type":"integer"},"capped":{"type":"boolean"},"components":{"items":{"description":"One scored area of the domain","properties":{"enabled":{"type":"boolean"},"key":{"type":"string"},"max":{"type":"integer"},"name":{"type":"string"},"points":{"type":"integer"},"summary":{"type":"string"}},"required":["key","name","points","max"],"type":"object"},"type":"array"},"domain":{"type":"string"},"grade":{"description":"A+ to F","type":"string"},"open_fixes":{"description":"Findings above info level","type":"integer"},"raw":{"description":"Before the cap rules that hold the headline back while a fix is open","type":"integer"},"recommendations":{"items":{"properties":{"component":{"type":"string"},"fix":{"description":"The exact change to publish: a DNS record (name, type, value) or a file or tag (kind, label, value, where)","properties":{"kind":{"type":"string"},"label":{"type":"string"},"name":{"type":"string"},"note":{"type":"string"},"type":{"type":"string"},"value":{"type":"string"},"where":{"type":"string"}},"type":"object"},"id":{"type":"string"},"scan":{"enum":["email","discoverability"],"type":"string"},"severity":{"enum":["critical","important","info"],"type":"string"},"tags":{"items":{"type":"string"},"type":"array"},"title":{"type":"string"},"why":{"type":"string"}},"required":["id","severity","title"],"type":"object"},"type":"array"},"report_url":{"description":"The report page for this domain on astraverify.com","type":"string"},"score":{"description":"Out of 100, exactly as astraverify.com shows it","type":"integer"},"verdict":{"type":"string"}},"type":["object","null"]},"discoverability_cache_age_seconds":{"type":["integer","null"]},"discoverability_error":{"type":["string","null"]},"domain":{"type":"string"},"email_cache_age_seconds":{"type":"integer"},"email_security":{"properties":{"cache_age_seconds":{"description":"Age of the result; 0 means it was scanned just now","type":"integer"},"capped":{"type":"boolean"},"components":{"items":{"description":"One scored area of the domain","properties":{"enabled":{"type":"boolean"},"key":{"type":"string"},"max":{"type":"integer"},"name":{"type":"string"},"points":{"type":"integer"},"summary":{"type":"string"}},"required":["key","name","points","max"],"type":"object"},"type":"array"},"domain":{"type":"string"},"grade":{"description":"A+ to F","type":"string"},"open_fixes":{"description":"Findings above info level","type":"integer"},"raw":{"description":"Before the cap rules that hold the headline back while a fix is open","type":"integer"},"recommendations":{"items":{"properties":{"component":{"type":"string"},"fix":{"description":"The exact change to publish: a DNS record (name, type, value) or a file or tag (kind, label, value, where)","properties":{"kind":{"type":"string"},"label":{"type":"string"},"name":{"type":"string"},"note":{"type":"string"},"type":{"type":"string"},"value":{"type":"string"},"where":{"type":"string"}},"type":"object"},"id":{"type":"string"},"scan":{"enum":["email","discoverability"],"type":"string"},"severity":{"enum":["critical","important","info"],"type":"string"},"tags":{"items":{"type":"string"},"type":"array"},"title":{"type":"string"},"why":{"type":"string"}},"required":["id","severity","title"],"type":"object"},"type":"array"},"report_url":{"description":"The report page for this domain on astraverify.com","type":"string"},"score":{"description":"Out of 100, exactly as astraverify.com shows it","type":"integer"}},"type":"object"},"live_url":{"description":"The live page, which rescans when the result is stale","type":"string"},"recommendations":{"description":"Both scans, ranked by severity","items":{"properties":{"component":{"type":"string"},"fix":{"description":"The exact change to publish: a DNS record (name, type, value) or a file or tag (kind, label, value, where)","properties":{"kind":{"type":"string"},"label":{"type":"string"},"name":{"type":"string"},"note":{"type":"string"},"type":{"type":"string"},"value":{"type":"string"},"where":{"type":"string"}},"type":"object"},"id":{"type":"string"},"scan":{"enum":["email","discoverability"],"type":"string"},"severity":{"enum":["critical","important","info"],"type":"string"},"tags":{"items":{"type":"string"},"type":"array"},"title":{"type":"string"},"why":{"type":"string"}},"required":["id","severity","title"],"type":"object"},"type":"array"},"report_url":{"description":"Saved snapshot (/r/<id>) that opens without a rescan; safe to share","type":"string"}},"required":["domain","email_security"],"type":"object"}before
—after
{"properties":{"cache_age_seconds":{"description":"Age of the result; 0 means it was scanned just now","type":"integer"},"canonical_host":{"type":"string"},"capped":{"type":"boolean"},"cdn":{"type":"string"},"components":{"items":{"description":"One scored area of the domain","properties":{"enabled":{"type":"boolean"},"key":{"type":"string"},"max":{"type":"integer"},"name":{"type":"string"},"points":{"type":"integer"},"summary":{"type":"string"}},"required":["key","name","points","max"],"type":"object"},"type":"array"},"domain":{"type":"string"},"grade":{"description":"A+ to F","type":"string"},"not_checked":{"description":"Parts skipped in this scan","items":{"type":"string"},"type":"array"},"open_fixes":{"description":"Findings above info level","type":"integer"},"raw":{"description":"Before the cap rules that hold the headline back while a fix is open","type":"integer"},"recommendations":{"items":{"properties":{"component":{"type":"string"},"fix":{"description":"The exact change to publish: a DNS record (name, type, value) or a file or tag (kind, label, value, where)","properties":{"kind":{"type":"string"},"label":{"type":"string"},"name":{"type":"string"},"note":{"type":"string"},"type":{"type":"string"},"value":{"type":"string"},"where":{"type":"string"}},"type":"object"},"id":{"type":"string"},"scan":{"enum":["email","discoverability"],"type":"string"},"severity":{"enum":["critical","important","info"],"type":"string"},"tags":{"items":{"type":"string"},"type":"array"},"title":{"type":"string"},"why":{"type":"string"}},"required":["id","severity","title"],"type":"object"},"type":"array"},"report_url":{"description":"The report page for this domain on astraverify.com","type":"string"},"score":{"description":"Out of 100, exactly as astraverify.com shows it","type":"integer"},"verdict":{"description":"One sentence on what engines can do with the site","type":"string"},"verified_component":{"description":"Set by verify_fix: the component re-checked","type":"string"}},"required":["domain","score","grade"],"type":"object"}