{"kind":"domain_report","id":"j37hya8utoso8jig","url":"https://pipandbruno.com/","domain":"pipandbruno.com","generated_at":"2026-10-20T22:06:37.019Z","summary":{"site_grade":"D","site_score":63,"aeo_grade":"C","aeo_score":77,"fixes_total":16,"by_priority":{"critical":0,"high":0,"medium":8,"low":8},"partial_sections":[]},"fixes":[{"source":"site","area":"email","priority":"medium","title":"No SPF record.","how":"This domain does not seem to send mail: publish TXT \"v=spf1 -all\".","verify_cmd":"dig +short TXT pipandbruno.com | grep -i spf1"},{"source":"site","area":"web","priority":"medium","title":"No HSTS header.","how":"Send Strict-Transport-Security: max-age=31536000; includeSubDomains once every subdomain serves HTTPS.","verify_cmd":"curl -sI 'https://pipandbruno.com/' | grep -iE '^(strict-transport-security|content-security-policy|x-content-type-options|referrer-policy|permissions-policy|x-frame-options|location|HTTP)'"},{"source":"site","area":"web","priority":"medium","title":"No Content-Security-Policy.","how":"Start with Content-Security-Policy-Report-Only listing your script/style sources, then enforce it.","verify_cmd":"curl -sI 'https://pipandbruno.com/' | grep -iE '^(strict-transport-security|content-security-policy|x-content-type-options|referrer-policy|permissions-policy|x-frame-options|location|HTTP)'"},{"source":"site","area":"web","priority":"medium","title":"The site can be framed by other sites (clickjacking).","how":"Send X-Frame-Options: DENY (or SAMEORIGIN), or CSP frame-ancestors 'self'.","verify_cmd":"curl -sI 'https://pipandbruno.com/' | grep -iE '^(strict-transport-security|content-security-policy|x-content-type-options|referrer-policy|permissions-policy|x-frame-options|location|HTTP)'"},{"source":"aeo","area":"aeo","priority":"medium","title":"Add an Organization (or LocalBusiness) JSON-LD item","how":"Engines and Google validate these types. The Organization JSON-LD in \"Ready-to-paste fixes\" is complete.","verify_cmd":"curl -s 'https://pipandbruno.com/' | grep -c 'application/ld+json'   # >= 1; then paste the URL into https://validator.schema.org/"},{"source":"aeo","area":"aeo","priority":"medium","title":"Add dateModified and sitemap lastmod","how":"Add dateModified to Article/WebPage JSON-LD, send a real Last-Modified header, and keep <lastmod> in your sitemap accurate when pages change.","verify_cmd":"curl -sI 'https://pipandbruno.com/' | grep -i last-modified; curl -s 'https://pipandbruno.com/' | grep -o '\"dateModified\"[^,}]*'"},{"source":"aeo","area":"aeo","priority":"medium","title":"Add sameAs links to your Organization JSON-LD","how":"List your official profiles (LinkedIn, X, GitHub, Crunchbase, Wikipedia/Wikidata, YouTube) in Organization.sameAs so engines can tie the site to one entity.","verify_cmd":"curl -s 'https://pipandbruno.com/' | grep -c 'application/ld+json'   # >= 1; then paste the URL into https://validator.schema.org/"},{"source":"aeo","area":"aeo","priority":"medium","title":"Get a Wikidata item that points to your site","how":"If your organization meets Wikidata's notability policy, create an item with 'official website' (P856) set to your domain, then add it to Organization.sameAs. Don't create one if you're not notable; it will be deleted.","verify_cmd":"curl -s 'https://www.wikidata.org/w/api.php?action=wbsearchentities&format=json&language=en&search=pipandbruno.com' | jq '.search[] | {id,label}'"},{"source":"site","area":"dns","priority":"low","title":"Add CAA records so only your certificate authorities can issue for this domain","how":"With no CAA record any public CA may issue a certificate for your domain (RFC 8659).","paste":{"type":"dns","host":"pipandbruno.com","record_type":"CAA","value":["0 issue \"letsencrypt.org\"","0 issuewild \"letsencrypt.org\"","0 issue \"pki.goog; cansignhttpexchanges=yes\"","0 issuewild \"pki.goog; cansignhttpexchanges=yes\"","0 issue \"ssl.com\"","0 issuewild \"ssl.com\"","0 issue \"sectigo.com\"","0 issuewild \"sectigo.com\"","0 iodef \"mailto:security@pipandbruno.com\""],"note":"DNS is on Cloudflare: Cloudflare adds these CAA records for Universal SSL automatically once you add any CAA record; listing them keeps edge certificates working. Add your own CA too if you use one at the origin."},"steps":["Add each line as a CAA record on the root (@): flags 0, tag issue/issuewild/iodef, value as shown.","If a hostname is a CNAME, the target's CAA also applies; check it too."],"verify_cmd":"dig +short CAA pipandbruno.com","ref":"https://www.rfc-editor.org/rfc/rfc8659#section-4"},{"source":"site","area":"dns","priority":"low","title":"DNSSEC is not on (not signed (no DS record)).","how":"Turn on DNSSEC at your DNS host and add the DS record at the registrar.","verify_cmd":"dig +dnssec +short DS pipandbruno.com"},{"source":"site","area":"disclosure","priority":"low","title":"No /.well-known/security.txt, so researchers have no listed way to report a vulnerability.","how":"Publish /.well-known/security.txt with Contact: mailto:security@<domain> and an Expires: date within a year (RFC 9116).","verify_cmd":"curl -s https://pipandbruno.com/.well-known/security.txt | grep -iE '^(contact|expires):'"},{"source":"aeo","area":"aeo","priority":"low","title":"Put your main content in the HTML","how":"AI crawlers mostly don't run JavaScript. Server-render or pre-render the page (SSR/SSG) so the raw HTML carries at least ~300 words that explain what you do, for whom, and why.","verify_cmd":"curl -s -A 'Mozilla/5.0 (compatible; GPTBot/1.3; +https://openai.com/gptbot)' 'https://pipandbruno.com/' | sed -e 's/<script.*<\\/script>//g' -e 's/<[^>]*>/ /g' | wc -w   # raw HTML word count; aim for 300+"},{"source":"aeo","area":"aeo","priority":"low","title":"Add /llms.txt","how":"Use the llms.txt draft in \"Ready-to-paste fixes\" below (llmstxt.org format).","verify_cmd":"curl -s -o /dev/null -w '%{http_code}\\n' 'https://pipandbruno.com/llms.txt'   # expect 200; then: curl -s 'https://pipandbruno.com/llms.txt' | head -1   # starts with '# '"},{"source":"aeo","area":"aeo","priority":"low","title":"Add question headings that match what people ask","how":"Add H2/H3 headings phrased as questions (\"How much does X cost?\", \"What is X?\") on your key pages, each followed by a direct answer.","verify_cmd":"curl -s 'https://pipandbruno.com/' | grep -ioE '<h[23][^>]*>[^<]*\\?</h[23]>'   # question headings in raw HTML"},{"source":"aeo","area":"aeo","priority":"low","title":"Answer each question in the first sentence or two","how":"Right under each question heading, put a 1-3 sentence answer (8-70 words) before details, tables or CTAs. Engines quote that first paragraph.","verify_cmd":"curl -s 'https://pipandbruno.com/' | grep -ioE '<h[23][^>]*>[^<]*\\?</h[23]>'   # question headings in raw HTML"},{"source":"aeo","area":"aeo","priority":"low","title":"Add Open Graph tags","how":"og:title, og:description and og:image control how links to you look in chats and AI answers that render previews.","verify_cmd":"curl -s 'https://pipandbruno.com/' | grep -io '<meta[^>]*property=\"og:[^\"]*\"[^>]*>'   # og:title, og:description, og:image"}],"site_audit":{"report":"full_site_audit","domain":"pipandbruno.com","generated_at":"2026-10-20T22:06:37.017Z","summary":{"grade":"D","score":63,"points":"63/100","headline":"No critical or high issues; 7 smaller improvements.","actions_by_priority":{"critical":0,"high":0,"medium":4,"low":3},"partial":false},"action_plan":[{"priority":"medium","area":"email","issue":"No SPF record.","fix":"This domain does not seem to send mail: publish TXT \"v=spf1 -all\".","effort":"minutes"},{"priority":"medium","area":"web","issue":"No HSTS header.","fix":"Send Strict-Transport-Security: max-age=31536000; includeSubDomains once every subdomain serves HTTPS.","effort":"minutes"},{"priority":"medium","area":"web","issue":"No Content-Security-Policy.","fix":"Start with Content-Security-Policy-Report-Only listing your script/style sources, then enforce it.","effort":"project"},{"priority":"medium","area":"web","issue":"The site can be framed by other sites (clickjacking).","fix":"Send X-Frame-Options: DENY (or SAMEORIGIN), or CSP frame-ancestors 'self'.","effort":"minutes"},{"priority":"low","area":"dns","issue":"No CAA record, so any certificate authority may issue certificates for this domain.","fix":"Publish CAA records for the CAs you use, e.g. pipandbruno.com CAA 0 issue \"letsencrypt.org\".","effort":"minutes"},{"priority":"low","area":"dns","issue":"DNSSEC is not on (not signed (no DS record)).","fix":"Turn on DNSSEC at your DNS host and add the DS record at the registrar.","effort":"minutes"},{"priority":"low","area":"disclosure","issue":"No /.well-known/security.txt, so researchers have no listed way to report a vulnerability.","fix":"Publish /.well-known/security.txt with Contact: mailto:security@<domain> and an Expires: date within a year (RFC 9116).","effort":"minutes"}],"categories":{"tls":{"score":25,"max":25,"status":"ok","notes":[]},"email_auth":{"score":8,"max":25,"status":"ok","notes":["No SPF record. If this domain never sends mail, publish 'v=spf1 -all' so nobody can use it."]},"http_headers":{"score":10,"max":20,"status":"ok","notes":["No Strict-Transport-Security header: browsers may still try plain HTTP first.","No Content-Security-Policy header.","No X-Frame-Options or CSP frame-ancestors: the page can be framed (clickjacking)."]},"dns":{"score":5,"max":15,"status":"ok","notes":["DNSSEC: not signed (no DS record).","No CAA record, so any certificate authority may issue for this domain."]},"registration":{"score":15,"max":15,"status":"ok","notes":[]}},"sections":{"tls":{"host":"pipandbruno.com","checked_at":"2026-10-20T22:06:36.911Z","data_source":"Certificate Transparency logs via Cert Spotter (api.certspotter.com). Certificate details are from CT logs, NOT from the live served certificate.","found":true,"newest_cert":{"issuer":"Google Trust Services","not_before":"2026-09-30T09:34:53Z","not_after":"2026-12-28T19:35:28Z","lifetime_days":89,"days_left":68,"pct_lifetime_used":23,"dns_names":["*.pipandbruno.com","pipandbruno.com"],"sha256":"5c570fe3629677132f3bc466dd520e20166bdf77e611b1f4e530d42b5ebbb27b"},"currently_valid_certs_in_ct":4,"soonest_expiring_valid_cert":{"issuer":"Let's Encrypt","not_after":"2026-12-27T13:27:13Z","days_left":67},"renewal_cadence_days":2,"renewal_stall":{"suspected":false,"rule":"Newest CT-logged certificate is past two-thirds of its lifetime with no newer certificate in CT logs.","detail":"Newest logged certificate is 23% through its life; no stall signal."},"caveat":"Several valid certificates exist in CT (e.g. multiple CDNs/servers). CT cannot tell which one is being served right now.","is_lets_encrypt":false,"live_https_probe":{"handshake_ok":true,"http_status":200,"meaning":"An HTTPS request from Cloudflare's edge completed, so the served certificate was trusted, unexpired and matched the hostname at probe time. Certificate details are NOT read from this live connection."}},"dns":{"domain":"pipandbruno.com","checked_at":"2026-10-20T22:06:36.912Z","data_source":"Cloudflare DNS-over-HTTPS (1.1.1.1), live at check time","records":{"NS":["aisha.ns.cloudflare.com.","ajay.ns.cloudflare.com."],"A":["172.67.170.166","104.21.47.72"],"AAAA":["2606:4700:3035::6815:2f48","2606:4700:3032::ac43:aaa6"],"CNAME":[],"MX":[],"SPF":[],"DMARC":["v=DMARC1; p=quarantine; rua=mailto:940f0c149d7a65a4c6b0f32e5246f6fa@inbound.postmarkapp.com; aspf=r; pct=100"],"CAA":null},"dnssec":"not signed (no DS record)","findings":[],"fixes":[{"id":"caa-add","title":"Add CAA records so only your certificate authorities can issue for this domain","why":"With no CAA record any public CA may issue a certificate for your domain (RFC 8659).","paste":{"type":"dns","host":"pipandbruno.com","record_type":"CAA","value":["0 issue \"letsencrypt.org\"","0 issuewild \"letsencrypt.org\"","0 issue \"pki.goog; cansignhttpexchanges=yes\"","0 issuewild \"pki.goog; cansignhttpexchanges=yes\"","0 issue \"ssl.com\"","0 issuewild \"ssl.com\"","0 issue \"sectigo.com\"","0 issuewild \"sectigo.com\"","0 iodef \"mailto:security@pipandbruno.com\""],"note":"DNS is on Cloudflare: Cloudflare adds these CAA records for Universal SSL automatically once you add any CAA record; listing them keeps edge certificates working. Add your own CA too if you use one at the origin."},"steps":["Add each line as a CAA record on the root (@): flags 0, tag issue/issuewild/iodef, value as shown.","If a hostname is a CNAME, the target's CAA also applies; check it too."],"verify_cmd":"dig +short CAA pipandbruno.com","source":"https://www.rfc-editor.org/rfc/rfc8659#section-4"}]},"registration":{"domain":"pipandbruno.com","checked_at":"2026-10-20T22:06:37.017Z","found":true,"data_source":"RDAP (rdap.verisign.com), live at check time","registrar":"Cloudflare, Inc.","registered":"2026-09-28T14:23:11Z","expires":"2027-09-28T14:23:11Z","days_left":342,"status":["client transfer prohibited"],"nameservers":["aisha.ns.cloudflare.com","ajay.ns.cloudflare.com"],"findings":[],"fixes":[]},"email_auth":{"domain":"pipandbruno.com","checked_at":"2026-10-20T22:06:36.944Z","data_source":"Cloudflare DNS-over-HTTPS (1.1.1.1), live at check time; MTA-STS policy fetched over HTTPS","receives_mail":false,"spf":{"present":false,"record":null},"dmarc":{"present":true,"record":"v=DMARC1; p=quarantine; rua=mailto:940f0c149d7a65a4c6b0f32e5246f6fa@inbound.postmarkapp.com; aspf=r; pct=100","policy":"quarantine","subdomain_policy":"quarantine","pct":100,"rua":"mailto:940f0c149d7a65a4c6b0f32e5246f6fa@inbound.postmarkapp.com","ruf":null,"adkim":"r","aspf":"r"},"dkim":{"selectors_checked":["google","selector1","selector2","default","k1","s1","s2","dkim","mail"],"selectors_found":[],"note":"Only common selector names are checked. A missing result does not prove DKIM is absent; the real selector is in the DKIM-Signature header (s=) of a sent message."},"mta_sts":{"txt_record":null,"policy_mode":null},"tls_rpt":{"record":null},"bimi":{"record":null},"score":30,"score_note":"Rough 0-100 posture score: SPF 30, DMARC up to 40, DKIM found 15, MTA-STS up to 10, TLS-RPT 5. It is a heuristic, not a deliverability guarantee.","findings":["No SPF record. If this domain never sends mail, publish 'v=spf1 -all' so nobody can use it."]},"http_headers":{"host":"pipandbruno.com","checked_at":"2026-10-20T22:06:36.913Z","data_source":"One HTTPS GET from Cloudflare's edge at check time (redirects followed manually, max 5). Body not read or stored.","final_url":"https://pipandbruno.com/","final_status":200,"redirect_chain":[{"url":"https://pipandbruno.com/","status":200}],"elapsed_ms":112,"headers":{"strict-transport-security":null,"content-security-policy":null,"x-content-type-options":"nosniff","x-frame-options":null,"referrer-policy":"strict-origin-when-cross-origin","permissions-policy":null,"cross-origin-opener-policy":null},"server":"cloudflare","x_powered_by":null,"grade":"C","grade_note":"Simple grade from how many of 7 common security headers are present. Not a penetration test.","findings":["No Strict-Transport-Security header: browsers may still try plain HTTP first.","No Content-Security-Policy header.","No X-Frame-Options or CSP frame-ancestors: the page can be framed (clickjacking)."]},"http_to_https":{"checked":true,"status":301,"location":"https://pipandbruno.com/","redirects_to_https":true,"permanent":true},"www_consistency":{"other_host":"www.pipandbruno.com","reachable":true,"status":200,"redirects_to":null,"consistent":true},"security_txt":{"present":false,"http_status":404},"crawlability":{"robots_txt":{"present":true,"http_status":200,"sitemap_lines":["https://pipandbruno.com/sitemap.xml"],"blocks_all_crawlers":false},"sitemap_xml":{"present":true,"at_default_path":true,"url_count":5}}},"grade_scale":"A >= 90, B >= 80, C >= 70, D >= 60, F < 60 (percent of points from categories that could be checked)","method":"Same scoring as /v1/domain-grade (TLS 25, email auth 25, HTTP headers 20, DNS 15, registration 15), plus HTTP->HTTPS redirect, www/apex consistency, RFC 9116 security.txt, robots.txt and sitemap checks that feed the action plan but not the score. Every check runs live at request time.","data_source":"CT logs (Cert Spotter / crt.sh) + live HTTPS probe, Cloudflare DoH, RDAP, and a few HTTP(S) requests from Cloudflare's edge (/, http://, www, /.well-known/security.txt, /robots.txt, /sitemap.xml). Certificate details are from CT logs, NOT the live served certificate.","lets_encrypt_note":"Let's Encrypt issues 64-day certificates by default for every issuance/renewal on or after 2027-02-10 (45 days from 2028-02-16; 64-day certs in staging from 2026-10-14). Renew at about two-thirds of lifetime (ACME ARI or a ~2/3 rule); hard-coded renewal targets like day 60/80/83 of a 90-day cert will break. Source: https://letsencrypt.org/2026/10/07/64-day-certs","note":"Heuristic posture audit from public signals, not a penetration test or a guarantee."},"aeo_audit":{"version":3,"url":"https://pipandbruno.com/","limited":null,"finalUrl":"https://pipandbruno.com/","host":"pipandbruno.com","domain":"pipandbruno.com","brand":"Pip and Bruno","topic":"Original kids music videos for ages 4 to 8. Pip is a girl with ginger pigtails and a yellow raincoat. Bruno is a brown moose with a green scarf. This site is for parents.","checkedAt":"2026-10-20T22:06:37.019Z","score":77,"grade":"C","sections":[{"id":"crawlers","label":"AI crawler access in robots.txt","points":20,"max":20,"why":"16 points for AI search and user-fetch bots (they decide whether you can be cited), 4 for training bots (blocking them is a business choice, so it costs little)."},{"id":"firewall","label":"Firewall lets AI crawlers through","points":12,"max":12,"why":"We fetch your homepage as a browser and as GPTBot, ClaudeBot and PerplexityBot. A 403, a challenge page or a cf-mitigated header for a bot means robots.txt doesn't matter: the bot never sees the page."},{"id":"content","label":"Text visible without JavaScript","points":9.5,"max":12,"why":"Most AI crawlers don't run JavaScript. 8 points for words in the homepage's raw HTML, 4 for the share of crawled pages with at least 150 words."},{"id":"meta","label":"Title, description, H1, canonical, Open Graph","points":9.8,"max":10,"why":"Answer engines use these to label and summarize pages. 7 points for the homepage, 3 for coverage across the other crawled pages."},{"id":"indexable","label":"Indexable page","points":8,"max":8,"why":"A 200 status, no noindex, and HTTPS."},{"id":"schema","label":"Structured data (JSON-LD), validated","points":6,"max":10,"why":"Schema.org JSON-LD tells engines who you are and what each page is. 6 points for presence and types, 4 for having the required properties (Organization, LocalBusiness, Product, FAQPage, Article, SoftwareApplication)."},{"id":"entity","label":"Entity signals (sameAs, Wikidata)","points":0,"max":7,"why":"Engines connect your site to a known entity through Organization sameAs links and a Wikidata item whose official website is your domain."},{"id":"answers","label":"Answer-first structure","points":3,"max":6,"why":"Question-style H2/H3 headings followed by a short direct answer (8-70 words) are easy for engines to quote."},{"id":"freshness","label":"Freshness signals","points":0,"max":4,"why":"dateModified in JSON-LD, Last-Modified headers or sitemap lastmod within 90 days. Engines favor content that shows it is current."},{"id":"speed","label":"Speed and page weight","points":4,"max":4,"why":"AI fetchers have short timeouts. Time to first byte under 600 ms and HTML under 300 KB."},{"id":"intl","label":"Language tags","points":2,"max":2,"why":"An html lang attribute, and valid hreflang if you have language versions."},{"id":"llms","label":"/llms.txt","points":0,"max":2,"why":"A short Markdown guide for LLMs. Optional and still new, so it carries few points."},{"id":"sitemap","label":"XML sitemap","points":3,"max":3,"why":"Helps crawlers find your other pages; listing it in robots.txt is best."}],"checks":[{"id":"robots-retrieval","section":"crawlers","label":"AI search and user-fetch bots allowed","points":16,"max":16,"status":"pass","detail":"All 12 allowed."},{"id":"robots-training","section":"crawlers","label":"AI training bots allowed","points":4,"max":4,"status":"pass","detail":"All 9 allowed."},{"id":"firewall","section":"firewall","label":"AI crawler user agents get the page","points":12,"max":12,"status":"pass","detail":"GPTBot, ClaudeBot and PerplexityBot all got the page (HTTP 200/200/200)."},{"id":"status","section":"indexable","label":"Page returns HTTP 200","points":3,"max":3,"status":"pass","detail":"HTTP 200."},{"id":"noindex","section":"indexable","label":"No noindex","points":3,"max":3,"status":"pass","detail":"Robots directives: index,follow."},{"id":"https","section":"indexable","label":"Served over HTTPS","points":2,"max":2,"status":"pass","detail":"Yes."},{"id":"words","section":"content","label":"Words in the homepage's raw HTML (no JavaScript)","points":5.5,"max":8,"status":"warn","detail":"199 words of visible text."},{"id":"site-words","section":"content","label":"Crawled pages with 150+ words without JavaScript","points":4,"max":4,"status":"pass","detail":"5 of 5 page(s)."},{"id":"title","section":"meta","label":"Title tag","points":2,"max":2,"status":"pass","detail":"\"Pip and Bruno — songs for parents\" (33 characters; aim for 15-65)."},{"id":"description","section":"meta","label":"Meta description","points":2,"max":2,"status":"pass","detail":"170 characters (aim for 50-170)."},{"id":"h1","section":"meta","label":"One H1 heading","points":1.5,"max":1.5,"status":"pass","detail":"1 H1: \"Pip and Bruno\"."},{"id":"canonical","section":"meta","label":"Canonical link","points":1,"max":1,"status":"pass","detail":"https://pipandbruno.com/"},{"id":"og","section":"meta","label":"Open Graph tags","points":0.3,"max":0.5,"status":"warn","detail":"og:title, og:description, og:type, og:url"},{"id":"site-meta","section":"meta","label":"Title, description and H1 on the other crawled pages","points":3,"max":3,"status":"pass","detail":"4 of 4 crawled page(s) have all three."},{"id":"jsonld","section":"schema","label":"JSON-LD present, with entity and content types","points":6,"max":6,"status":"pass","detail":"Homepage: 1 block(s). Types across 5 page(s): MusicGroup, Person, Organization, WebPage, BreadcrumbList, ListItem, MusicRecording."},{"id":"schema-valid","section":"schema","label":"Required schema properties present","points":0,"max":4,"status":"fail","detail":"No Organization, LocalBusiness, Product, FAQPage, Article or SoftwareApplication items to validate."},{"id":"sameas","section":"entity","label":"Organization sameAs links","points":0,"max":3.5,"status":"fail","detail":"No sameAs on an Organization/LocalBusiness item."},{"id":"wikidata","section":"entity","label":"Wikidata item linked to this domain","points":0,"max":3.5,"status":"fail","detail":"No Wikidata item found for \"Pip and Bruno\" with this domain as its official website."},{"id":"questions","section":"answers","label":"Question-style H2/H3 headings","points":1.5,"max":3,"status":"warn","detail":"2 across 5 page(s), e.g. \"What this site does not do\", \"Who runs this\"."},{"id":"direct","section":"answers","label":"Short direct answers under question headings","points":1.5,"max":3,"status":"warn","detail":"1 of 2 question heading(s) are followed by a paragraph of 8-70 words."},{"id":"freshness","section":"freshness","label":"Recently updated (dateModified, Last-Modified, sitemap lastmod)","points":0,"max":4,"status":"fail","detail":"No dateModified, Last-Modified or sitemap lastmod found."},{"id":"ttfb","section":"speed","label":"Time to first byte (homepage)","points":2,"max":2,"status":"pass","detail":"157 ms from Cloudflare's network (aim for under 600 ms)."},{"id":"weight","section":"speed","label":"HTML size","points":2,"max":2,"status":"pass","detail":"5 KB (aim for under 300 KB)."},{"id":"lang","section":"intl","label":"html lang attribute","points":1.5,"max":1.5,"status":"pass","detail":"lang=\"en\"."},{"id":"hreflang","section":"intl","label":"hreflang (if you have language versions)","points":0.5,"max":0.5,"status":"pass","detail":"No hreflang; fine for a single-language site."},{"id":"llms","section":"llms","label":"/llms.txt","points":0,"max":2,"status":"fail","detail":"Returns an HTML page, not a text file."},{"id":"sitemap","section":"sitemap","label":"XML sitemap","points":3,"max":3,"status":"pass","detail":"https://pipandbruno.com/sitemap.xml (5 URLs, found via robots.txt)."}],"fixes":[{"priority":"medium","points":4,"title":"Add an Organization (or LocalBusiness) JSON-LD item","how":"Engines and Google validate these types. The Organization JSON-LD in \"Ready-to-paste fixes\" is complete.","verify":"curl -s 'https://pipandbruno.com/' | grep -c 'application/ld+json'   # >= 1; then paste the URL into https://validator.schema.org/"},{"priority":"medium","points":4,"title":"Add dateModified and sitemap lastmod","how":"Add dateModified to Article/WebPage JSON-LD, send a real Last-Modified header, and keep <lastmod> in your sitemap accurate when pages change.","verify":"curl -sI 'https://pipandbruno.com/' | grep -i last-modified; curl -s 'https://pipandbruno.com/' | grep -o '\"dateModified\"[^,}]*'"},{"priority":"medium","points":3.5,"title":"Add sameAs links to your Organization JSON-LD","how":"List your official profiles (LinkedIn, X, GitHub, Crunchbase, Wikipedia/Wikidata, YouTube) in Organization.sameAs so engines can tie the site to one entity.","verify":"curl -s 'https://pipandbruno.com/' | grep -c 'application/ld+json'   # >= 1; then paste the URL into https://validator.schema.org/"},{"priority":"medium","points":3.5,"title":"Get a Wikidata item that points to your site","how":"If your organization meets Wikidata's notability policy, create an item with 'official website' (P856) set to your domain, then add it to Organization.sameAs. Don't create one if you're not notable; it will be deleted.","verify":"curl -s 'https://www.wikidata.org/w/api.php?action=wbsearchentities&format=json&language=en&search=pipandbruno.com' | jq '.search[] | {id,label}'"},{"priority":"low","points":2.5,"title":"Put your main content in the HTML","how":"AI crawlers mostly don't run JavaScript. Server-render or pre-render the page (SSR/SSG) so the raw HTML carries at least ~300 words that explain what you do, for whom, and why.","verify":"curl -s -A 'Mozilla/5.0 (compatible; GPTBot/1.3; +https://openai.com/gptbot)' 'https://pipandbruno.com/' | sed -e 's/<script.*<\\/script>//g' -e 's/<[^>]*>/ /g' | wc -w   # raw HTML word count; aim for 300+"},{"priority":"low","points":2,"title":"Add /llms.txt","how":"Use the llms.txt draft in \"Ready-to-paste fixes\" below (llmstxt.org format).","verify":"curl -s -o /dev/null -w '%{http_code}\\n' 'https://pipandbruno.com/llms.txt'   # expect 200; then: curl -s 'https://pipandbruno.com/llms.txt' | head -1   # starts with '# '"},{"priority":"low","points":1.5,"title":"Add question headings that match what people ask","how":"Add H2/H3 headings phrased as questions (\"How much does X cost?\", \"What is X?\") on your key pages, each followed by a direct answer.","verify":"curl -s 'https://pipandbruno.com/' | grep -ioE '<h[23][^>]*>[^<]*\\?</h[23]>'   # question headings in raw HTML"},{"priority":"low","points":1.5,"title":"Answer each question in the first sentence or two","how":"Right under each question heading, put a 1-3 sentence answer (8-70 words) before details, tables or CTAs. Engines quote that first paragraph.","verify":"curl -s 'https://pipandbruno.com/' | grep -ioE '<h[23][^>]*>[^<]*\\?</h[23]>'   # question headings in raw HTML"},{"priority":"low","points":0.3,"title":"Add Open Graph tags","how":"og:title, og:description and og:image control how links to you look in chats and AI answers that render previews.","verify":"curl -s 'https://pipandbruno.com/' | grep -io '<meta[^>]*property=\"og:[^\"]*\"[^>]*>'   # og:title, og:description, og:image"}],"robots":{"status":"found","bots":[{"name":"OAI-SearchBot","owner":"OpenAI","use":"ChatGPT search index","kind":"retrieval","allowed":true,"rule":"User-agent: * → Allow: /"},{"name":"ChatGPT-User","owner":"OpenAI","use":"ChatGPT fetching a page for a user","kind":"retrieval","allowed":true,"rule":"User-agent: * → Allow: /"},{"name":"Claude-SearchBot","owner":"Anthropic","use":"Claude search index","kind":"retrieval","allowed":true,"rule":"User-agent: * → Allow: /"},{"name":"Claude-User","owner":"Anthropic","use":"Claude fetching a page for a user","kind":"retrieval","allowed":true,"rule":"User-agent: * → Allow: /"},{"name":"PerplexityBot","owner":"Perplexity","use":"Perplexity search index","kind":"retrieval","allowed":true,"rule":"User-agent: * → Allow: /"},{"name":"Perplexity-User","owner":"Perplexity","use":"Perplexity fetching a page for a user","kind":"retrieval","allowed":true,"rule":"User-agent: * → Allow: /"},{"name":"Googlebot","owner":"Google","use":"Google Search and AI Overviews","kind":"retrieval","allowed":true,"rule":"User-agent: * → Allow: /"},{"name":"Bingbot","owner":"Microsoft","use":"Bing, Copilot and ChatGPT search results","kind":"retrieval","allowed":true,"rule":"User-agent: * → Allow: /"},{"name":"Applebot","owner":"Apple","use":"Siri and Spotlight answers","kind":"retrieval","allowed":true,"rule":"User-agent: * → Allow: /"},{"name":"DuckAssistBot","owner":"DuckDuckGo","use":"DuckDuckGo AI answers","kind":"retrieval","allowed":true,"rule":"User-agent: * → Allow: /"},{"name":"Meta-ExternalFetcher","owner":"Meta","use":"Meta AI fetching a page for a user","kind":"retrieval","allowed":true,"rule":"User-agent: * → Allow: /"},{"name":"MistralAI-User","owner":"Mistral","use":"Le Chat fetching a page for a user","kind":"retrieval","allowed":true,"rule":"User-agent: * → Allow: /"},{"name":"GPTBot","owner":"OpenAI","use":"model training","kind":"training","allowed":true,"rule":"User-agent: * → Allow: /"},{"name":"ClaudeBot","owner":"Anthropic","use":"model training","kind":"training","allowed":true,"rule":"User-agent: * → Allow: /"},{"name":"Google-Extended","owner":"Google","use":"Gemini training and grounding","kind":"training","allowed":true,"rule":"User-agent: * → Allow: /"},{"name":"Applebot-Extended","owner":"Apple","use":"Apple AI training","kind":"training","allowed":true,"rule":"User-agent: * → Allow: /"},{"name":"CCBot","owner":"Common Crawl","use":"open dataset used by many models","kind":"training","allowed":true,"rule":"User-agent: * → Allow: /"},{"name":"Bytespider","owner":"ByteDance","use":"model training","kind":"training","allowed":true,"rule":"User-agent: * → Allow: /"},{"name":"meta-externalagent","owner":"Meta","use":"Meta AI training and indexing","kind":"training","allowed":true,"rule":"User-agent: * → Allow: /"},{"name":"Amazonbot","owner":"Amazon","use":"Alexa and Amazon AI","kind":"training","allowed":true,"rule":"User-agent: * → Allow: /"},{"name":"cohere-ai","owner":"Cohere","use":"model training","kind":"training","allowed":true,"rule":"User-agent: * → Allow: /"}]},"access":[{"ua":"Browser (Chrome)","status":200,"blocked":false,"reason":null,"bytes":4763},{"ua":"GPTBot","status":200,"blocked":false,"reason":null,"bytes":4763},{"ua":"ClaudeBot","status":200,"blocked":false,"reason":null,"bytes":4763},{"ua":"PerplexityBot","status":200,"blocked":false,"reason":null,"bytes":4763}],"page":{"status":200,"title":"Pip and Bruno — songs for parents","description":"Original kids music videos for ages 4 to 8. Pip is a girl with ginger pigtails and a yellow raincoat. Bruno is a brown moose with a green scarf. This site is for parents.","h1":["Pip and Bruno"],"canonical":"https://pipandbruno.com/","og":{"og:title":"Pip and Bruno — songs for parents","og:description":"Original kids music videos for ages 4 to 8. Pip is a girl with ginger pigtails and a yellow raincoat. Bruno is a brown moose with a green scarf. This site is for parents.","og:type":"website","og:url":"https://pipandbruno.com/"},"words":199,"jsonLdTypes":["MusicGroup","Person","Organization"],"jsonLdErrors":0,"lang":"en","noindex":false},"llmsTxt":{"found":false,"status":404,"detail":"Returns an HTML page, not a text file."},"sitemap":{"found":true,"url":"https://pipandbruno.com/sitemap.xml","source":"robots.txt","detail":"https://pipandbruno.com/sitemap.xml (5 URLs, found via robots.txt).","urls":5,"newest":null},"pages":[{"url":"https://pipandbruno.com/","status":200,"title":"Pip and Bruno — songs for parents","description":true,"h1":1,"words":199,"ldTypes":["MusicGroup","Person","Organization"],"schemaIssues":[],"questions":0,"noindex":false},{"url":"https://pipandbruno.com/privacy/","status":200,"title":"Privacy — Pip and Bruno","description":true,"h1":1,"words":241,"ldTypes":[],"schemaIssues":[],"questions":2,"noindex":false},{"url":"https://pipandbruno.com/songs/blast-off/","status":200,"title":"Pip and Bruno — Blast Off","description":true,"h1":1,"words":360,"ldTypes":["WebPage","BreadcrumbList","ListItem","MusicRecording","MusicGroup"],"schemaIssues":[],"questions":0,"noindex":false},{"url":"https://pipandbruno.com/songs/stack-it-up/","status":200,"title":"Pip and Bruno — Stack It Up","description":true,"h1":1,"words":354,"ldTypes":["WebPage","BreadcrumbList","ListItem","MusicRecording","MusicGroup"],"schemaIssues":[],"questions":0,"noindex":false},{"url":"https://pipandbruno.com/songs/snow-day-wiggle/","status":200,"title":"Pip and Bruno — Snow Day Wiggle","description":true,"h1":1,"words":357,"ldTypes":["WebPage","BreadcrumbList","ListItem","MusicRecording","MusicGroup"],"schemaIssues":[],"questions":0,"noindex":false}],"crawl":{"attempted":4,"fetched":4,"ms":304,"source":"sitemap","budgetHit":false},"schemaChecks":[],"entity":{"wikidata":null,"wikipedia":null,"checked":true,"sameAs":[]},"freshness":{"newest":null,"source":null,"pageDate":null,"header":null,"sitemap":null},"answers":{"questionHeadings":2,"direct":1,"examples":[{"question":"What this site does not do","answer":"No shop, no payments, and no merch checkout. No analytics cookies and no advertising trackers. No accounts for kids, and no intentional collection of information from children.","answerWords":27,"direct":true}]},"speed":{"ttfbMs":157,"htmlBytes":4775,"truncated":false},"intl":{"lang":"en","hreflang":[]},"robotsRaw":"# Pip and Bruno parent hub — https://pipandbruno.com\nUser-agent: *\nAllow: /\nAllow: /songs/blast-off\nAllow: /songs/snow-day-wiggle\nAllow: /songs/stack-it-up\nAllow: /privacy\n\nSitemap: https://pipandbruno.com/sitemap.xml\n","logo":"https://pipandbruno.com/favicon.svg","orgName":null,"botdiff":{"pages":[{"url":"https://pipandbruno.com/","label":"Homepage","variants":[{"ua":"Browser (Chrome)","kind":"browser","status":200,"finalUrl":"https://pipandbruno.com/","bytes":4775,"words":199,"title":"Pip and Bruno — songs for parents","h1":"Pip and Bruno","jsonLd":1,"lastModified":null,"dateStamp":null,"copyrightYear":2026,"shell":false,"spa":false,"blocked":null},{"ua":"Googlebot","kind":"search","status":200,"finalUrl":"https://pipandbruno.com/","bytes":4775,"words":199,"title":"Pip and Bruno — songs for parents","h1":"Pip and Bruno","jsonLd":1,"lastModified":null,"dateStamp":null,"copyrightYear":2026,"shell":false,"spa":false,"blocked":null},{"ua":"OAI-SearchBot","kind":"ai","status":200,"finalUrl":"https://pipandbruno.com/","bytes":4775,"words":199,"title":"Pip and Bruno — songs for parents","h1":"Pip and Bruno","jsonLd":1,"lastModified":null,"dateStamp":null,"copyrightYear":2026,"shell":false,"spa":false,"blocked":null},{"ua":"GPTBot","kind":"ai","status":200,"finalUrl":"https://pipandbruno.com/","bytes":4775,"words":199,"title":"Pip and Bruno — songs for parents","h1":"Pip and Bruno","jsonLd":1,"lastModified":null,"dateStamp":null,"copyrightYear":2026,"shell":false,"spa":false,"blocked":null},{"ua":"ClaudeBot","kind":"ai","status":200,"finalUrl":"https://pipandbruno.com/","bytes":4775,"words":199,"title":"Pip and Bruno — songs for parents","h1":"Pip and Bruno","jsonLd":1,"lastModified":null,"dateStamp":null,"copyrightYear":2026,"shell":false,"spa":false,"blocked":null},{"ua":"PerplexityBot","kind":"ai","status":200,"finalUrl":"https://pipandbruno.com/","bytes":4775,"words":199,"title":"Pip and Bruno — songs for parents","h1":"Pip and Bruno","jsonLd":1,"lastModified":null,"dateStamp":null,"copyrightYear":2026,"shell":false,"spa":false,"blocked":null}],"flags":[]},{"url":"https://pipandbruno.com/privacy","label":"Key page","variants":[{"ua":"Browser (Chrome)","kind":"browser","status":200,"finalUrl":"https://pipandbruno.com/privacy/","bytes":3409,"words":241,"title":"Privacy — Pip and Bruno","h1":"Privacy","jsonLd":0,"lastModified":null,"dateStamp":null,"copyrightYear":2026,"shell":false,"spa":false,"blocked":null},{"ua":"Googlebot","kind":"search","status":200,"finalUrl":"https://pipandbruno.com/privacy/","bytes":3409,"words":241,"title":"Privacy — Pip and Bruno","h1":"Privacy","jsonLd":0,"lastModified":null,"dateStamp":null,"copyrightYear":2026,"shell":false,"spa":false,"blocked":null},{"ua":"GPTBot","kind":"ai","status":200,"finalUrl":"https://pipandbruno.com/privacy/","bytes":3409,"words":241,"title":"Privacy — Pip and Bruno","h1":"Privacy","jsonLd":0,"lastModified":null,"dateStamp":null,"copyrightYear":2026,"shell":false,"spa":false,"blocked":null}],"flags":[]}],"platform":null,"platformFixes":[],"fetches":10,"note":"We send each crawler's published user agent from our own servers, not the crawler's IP addresses. Sites that verify crawlers by IP (Cloudflare verified bots, Lovable, Base44) may treat the real crawler differently, in either direction. Google-Extended has no user agent of its own (Google crawls with its normal user agents), so it is checked in robots.txt only."},"cloudflare":{"proxied":true,"evidence":["pipandbruno.com resolves to Cloudflare IP 104.21.47.72"],"dns":{"host":"pipandbruno.com","ips":["104.21.47.72","172.67.170.166","2606:4700:3032::ac43:aaa6","2606:4700:3035::6815:2f48"],"cloudflare":["104.21.47.72","172.67.170.166","2606:4700:3032::ac43:aaa6","2606:4700:3035::6815:2f48"]},"perUa":[{"ua":"Browser","status":200,"signal":null},{"ua":"Googlebot","status":200,"signal":null},{"ua":"OAI-SearchBot","status":200,"signal":null},{"ua":"GPTBot","status":200,"signal":null},{"ua":"ClaudeBot","status":200,"signal":null},{"ua":"PerplexityBot","status":200,"signal":null}],"managedRobots":{"found":false,"disallowed":[],"contentSignal":null},"verdict":"ok","summary":"This site is behind Cloudflare and every user agent we tried got the page.","caveat":null,"settings":[],"wafRule":{"name":"Allow verified AI and search crawlers","expression":"(cf.verified_bot_category in {\"AI Search\" \"AI Assistant\" \"Search Engine Crawler\"})","expressionWithTraining":"(cf.verified_bot_category in {\"AI Search\" \"AI Assistant\" \"Search Engine Crawler\" \"AI Crawler\"})","action":"Skip","skip":["All remaining custom rules","All Super Bot Fight Mode rules","All managed rules","All rate limiting rules","User Agent Blocking","Browser Integrity Check","Security Level"],"placement":"First in your custom rules list. The AI Crawl Control rule is added at the end, so a Skip rule above it lets verified crawlers past it.","phase":"http_request_firewall_custom (WAF custom rules), which runs before Super Bot Fight Mode, managed rules and rate limiting.","cannotBypass":["Bot Fight Mode (Free plan feature; it doesn't run on the Ruleset Engine, so turn it off instead)","Products outside the Ruleset Engine that aren't in the Skip products list"],"notes":["cf.verified_bot_category only matches bots Cloudflare has verified (by IP and signature), so a spoofed user agent doesn't match.","\"AI Crawler\" is the training category (GPTBot, Google-Extended). Use the second expression only if you also want training crawlers through.","\"AI Search\" is kept for older rules; Cloudflare files new search crawlers under Search, which this legacy field reports as \"Search Engine Crawler\" (inference from Cloudflare's category notes).","Turn on logging for the rule and check Security Events after a day to confirm crawler requests match it."],"steps":["Security rules page > Create rule > Custom rules","Rule name: Allow verified AI and search crawlers","Edit expression: paste the expression","Choose action: Skip, then tick the skip options listed","Place it first in the list, then save"],"source":"https://developers.cloudflare.com/waf/custom-rules/skip/options/"}},"agentReady":{"score":0,"grade":"F","checks":[{"id":"llms","label":"/llms.txt","question":"read","status":"fail","detail":"Returns an HTML page, not a text file.","evidence":null,"fix":{"title":"Publish /llms.txt","how":"A Markdown file at your site root that tells agents what you are and links your key pages, docs, API and pricing (llmstxt.org). The full draft is in Paste-ready drafts.","paste":"# Pip and Bruno\n> One sentence on what Pip and Bruno does and for whom.\n\n## Key pages\n- [Pricing](https://pipandbruno.com/pricing): plans and prices\n- [Docs](https://pipandbruno.com/docs): how it works\n\n## For agents\n- [OpenAPI](https://pipandbruno.com/openapi.json)\n- [MCP server card](https://pipandbruno.com/.well-known/mcp/server-card.json)\n"},"points":0,"max":15},{"id":"mcp","label":"MCP server card or endpoint","question":"find","status":"fail","detail":"No server card at /.well-known/mcp/server-card.json, /.well-known/mcp.json, /mcp/server-card and no MCP endpoint at /mcp (HTTP 405).","evidence":null,"fix":{"title":"Offer an MCP server (if agents should act on your service)","how":"If you have an API agents could use, run an MCP server (streamable HTTP) and publish a server card at /.well-known/mcp/server-card.json so clients and registries can discover it without connecting first (MCP server card proposal, SEP-1649). Skip this if you have nothing for agents to call.","paste":"{\n  \"$schema\": \"https://static.modelcontextprotocol.io/schemas/v1/server-card.schema.json\",\n  \"name\": \"com.pipandbruno/pip-and-bruno\",\n  \"version\": \"1.0.0\",\n  \"title\": \"Pip and Bruno\",\n  \"description\": \"What agents can do with Pip and Bruno.\",\n  \"websiteUrl\": \"https://pipandbruno.com/\",\n  \"remotes\": [\n    {\n      \"type\": \"streamable-http\",\n      \"url\": \"https://pipandbruno.com/mcp\"\n    }\n  ]\n}"},"points":0,"max":20},{"id":"openapi","label":"OpenAPI description","question":"read","status":"fail","detail":"No OpenAPI or Swagger document at /openapi.json, /.well-known/openapi.json, /openapi.yaml, /swagger.json, and no <link rel=\"service-desc\">.","evidence":null,"fix":{"title":"Publish an OpenAPI document (if you have an API)","how":"Serve your API description at /openapi.json and point to it from the homepage with a service-desc link (RFC 8631), so agents can learn your endpoints without reading docs. Skip if you have no public API.","paste":"<link rel=\"service-desc\" href=\"/openapi.json\" type=\"application/openapi+json\">\n\n{\n  \"openapi\": \"3.1.0\",\n  \"info\": {\n    \"title\": \"Pip and Bruno API\",\n    \"version\": \"1.0.0\"\n  },\n  \"servers\": [\n    {\n      \"url\": \"https://pipandbruno.com\"\n    }\n  ],\n  \"paths\": {\n    \"/api/v1/example\": {\n      \"get\": {\n        \"summary\": \"Describe one endpoint\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\"\n          }\n        }\n      }\n    }\n  }\n}"},"points":0,"max":20},{"id":"x402","label":"x402 payments","question":"pay","status":"fail","detail":"No /.well-known/x402 (HTTP 404).","evidence":null,"fix":{"title":"Let agents pay per request with x402 (if you sell API access)","how":"Answer unpaid calls to a paid endpoint with HTTP 402 and a PAYMENT-REQUIRED header (x402 v2), and list the paid URLs at /.well-known/x402 so agents can find them. Skip if you don't sell anything agents can buy per call.","paste":"{\n  \"version\": 1,\n  \"resources\": [\n    \"https://pipandbruno.com/api/v1/example\"\n  ],\n  \"instructions\": \"Call a resource without payment to receive an x402 v2 challenge (HTTP 402, PAYMENT-REQUIRED header), then retry with PAYMENT-SIGNATURE.\"\n}"},"points":0,"max":15},{"id":"pricing","label":"Machine-readable pricing","question":"pay","status":"fail","detail":"No JSON-LD Offer, OpenAPI pricing or x402 price found on the pages we crawled.","evidence":null,"fix":{"title":"State your prices in JSON-LD","how":"Add an Offer with price and priceCurrency to your pricing or product page, so agents comparing options can read your price without parsing the page. Use your real plan names and prices.","paste":"<script type=\"application/ld+json\">\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"Product\",\n  \"name\": \"Pip and Bruno Pro\",\n  \"offers\": {\n    \"@type\": \"Offer\",\n    \"price\": \"29.00\",\n    \"priceCurrency\": \"USD\",\n    \"url\": \"https://pipandbruno.com/pricing\",\n    \"availability\": \"https://schema.org/InStock\"\n  }\n}\n</script>"},"points":0,"max":20},{"id":"webbotauth","label":"Web Bot Auth key directory","question":"identify","status":"fail","detail":"Nothing at /.well-known/http-message-signatures-directory (HTTP 404). Only matters if you run a bot or agent that fetches other sites.","evidence":null,"fix":{"title":"Publish a Web Bot Auth key directory (only if you run a bot or agent)","how":"If your service sends its own crawler or agent to other sites, sign its requests (HTTP Message Signatures, RFC 9421) and publish the public keys at /.well-known/http-message-signatures-directory with content type application/http-message-signatures-directory+json, per draft-ietf-webbotauth-httpsig-protocol. Sites and CDNs can then verify it's really you. If you don't run a bot, ignore this.","paste":"# Response headers\nContent-Type: application/http-message-signatures-directory+json\nCache-Control: max-age=86400\n\n# Body (your Ed25519 public key as a JWK)\n{\n  \"keys\": [\n    {\n      \"kty\": \"OKP\",\n      \"crv\": \"Ed25519\",\n      \"x\": \"<base64url public key>\"\n    }\n  ]\n}"},"points":0,"max":10}],"fetches":11,"summary":"0 of 6 agent checks pass; missing: /llms.txt, MCP server card or endpoint, OpenAPI description, x402 payments, Machine-readable pricing, Web Bot Auth key directory.","note":"Fetch checks only (no AI calls), against well-known paths on your origin. MCP, OpenAPI, x402 and Web Bot Auth matter only if you offer an API, sell to agents, or run a bot; a content site can ignore them."},"crawlerAccess":{"score":100,"grade":"A","counts":{"allowed":21,"blocked_robots":0,"blocked_firewall":0,"empty_shell":0,"unknown":0},"bots":[{"name":"OAI-SearchBot","owner":"OpenAI","use":"ChatGPT search index","kind":"retrieval","outcome":"allowed","evidence":"fetched","detail":"Got HTTP 200 with 199 words."},{"name":"ChatGPT-User","owner":"OpenAI","use":"ChatGPT fetching a page for a user","kind":"retrieval","outcome":"allowed","evidence":"robots","detail":"User-agent: * → Allow: /"},{"name":"Claude-SearchBot","owner":"Anthropic","use":"Claude search index","kind":"retrieval","outcome":"allowed","evidence":"robots","detail":"User-agent: * → Allow: /"},{"name":"Claude-User","owner":"Anthropic","use":"Claude fetching a page for a user","kind":"retrieval","outcome":"allowed","evidence":"robots","detail":"User-agent: * → Allow: /"},{"name":"PerplexityBot","owner":"Perplexity","use":"Perplexity search index","kind":"retrieval","outcome":"allowed","evidence":"fetched","detail":"Got HTTP 200 with 199 words."},{"name":"Perplexity-User","owner":"Perplexity","use":"Perplexity fetching a page for a user","kind":"retrieval","outcome":"allowed","evidence":"robots","detail":"User-agent: * → Allow: /"},{"name":"Googlebot","owner":"Google","use":"Google Search and AI Overviews","kind":"retrieval","outcome":"allowed","evidence":"fetched","detail":"Got HTTP 200 with 199 words."},{"name":"Bingbot","owner":"Microsoft","use":"Bing, Copilot and ChatGPT search results","kind":"retrieval","outcome":"allowed","evidence":"robots","detail":"User-agent: * → Allow: /"},{"name":"Applebot","owner":"Apple","use":"Siri and Spotlight answers","kind":"retrieval","outcome":"allowed","evidence":"robots","detail":"User-agent: * → Allow: /"},{"name":"DuckAssistBot","owner":"DuckDuckGo","use":"DuckDuckGo AI answers","kind":"retrieval","outcome":"allowed","evidence":"robots","detail":"User-agent: * → Allow: /"},{"name":"Meta-ExternalFetcher","owner":"Meta","use":"Meta AI fetching a page for a user","kind":"retrieval","outcome":"allowed","evidence":"robots","detail":"User-agent: * → Allow: /"},{"name":"MistralAI-User","owner":"Mistral","use":"Le Chat fetching a page for a user","kind":"retrieval","outcome":"allowed","evidence":"robots","detail":"User-agent: * → Allow: /"},{"name":"GPTBot","owner":"OpenAI","use":"model training","kind":"training","outcome":"allowed","evidence":"fetched","detail":"Got HTTP 200 with 199 words."},{"name":"ClaudeBot","owner":"Anthropic","use":"model training","kind":"training","outcome":"allowed","evidence":"fetched","detail":"Got HTTP 200 with 199 words."},{"name":"Google-Extended","owner":"Google","use":"Gemini training and grounding","kind":"training","outcome":"allowed","evidence":"robots","detail":"User-agent: * → Allow: /"},{"name":"Applebot-Extended","owner":"Apple","use":"Apple AI training","kind":"training","outcome":"allowed","evidence":"robots","detail":"User-agent: * → Allow: /"},{"name":"CCBot","owner":"Common Crawl","use":"open dataset used by many models","kind":"training","outcome":"allowed","evidence":"robots","detail":"User-agent: * → Allow: /"},{"name":"Bytespider","owner":"ByteDance","use":"model training","kind":"training","outcome":"allowed","evidence":"robots","detail":"User-agent: * → Allow: /"},{"name":"meta-externalagent","owner":"Meta","use":"Meta AI training and indexing","kind":"training","outcome":"allowed","evidence":"robots","detail":"User-agent: * → Allow: /"},{"name":"Amazonbot","owner":"Amazon","use":"Alexa and Amazon AI","kind":"training","outcome":"allowed","evidence":"robots","detail":"User-agent: * → Allow: /"},{"name":"cohere-ai","owner":"Cohere","use":"model training","kind":"training","outcome":"allowed","evidence":"robots","detail":"User-agent: * → Allow: /"}],"summary":"21 of 21 AI crawlers can read the page.","method":"robots.txt rules for 21 crawlers plus our fetches of the page as Googlebot, OAI-SearchBot, GPTBot, ClaudeBot, PerplexityBot. Search and user-fetch bots weigh 3x training bots. An empty app shell earns 20% credit. We fetch from Cloudflare's network, not the crawlers' own IPs."}},"report_url":"https://aeoinspector.com/d/j37hya8utoso8jig","json_url":"https://aeoinspector.com/d/j37hya8utoso8jig/report.json","fixes_url":"https://aeoinspector.com/d/j37hya8utoso8jig/fixes.txt"}