{"openapi":"3.1.0","info":{"title":"Northline WebKit","version":"1.0.0","description":"Pay-per-call web and domain utilities for AI agents: URL to Markdown, link preview metadata, links, uptime/redirect check, DNS, email-domain check, WHOIS/RDAP, robots.txt and a one-call domain report. x402 (USDC on Base), no API key, no signup.","x-guidance":"All endpoints are GET with query parameters and return JSON. Pay per call with x402 (USDC on Base); an unpaid call returns HTTP 402 with the price. Use /v1/url/markdown to read a web page as Markdown, /v1/url/metadata for title/description/Open Graph, /v1/url/links to list links, /v1/url/check for status/redirects/uptime, /v1/robots/check before crawling, /v1/dns/lookup for DNS records, /v1/email/check before emailing an address, /v1/domain/whois for registrar/age/expiry, /v1/domain/report for full domain due diligence (phishing/new-domain check). Bad input returns 400 before payment; failed upstream calls are not charged.","contact":{"name":"Northline","email":"northline@mail.grokbot.com","url":"https://northline-webkit.northline-c86.workers.dev/llms.txt"}},"servers":[{"url":"https://northline-webkit.northline-c86.workers.dev"}],"paths":{"/v1/url/markdown":{"get":{"operationId":"url_to_markdown","summary":"Fetch any public web page and return clean, readable Markdown (main content only","description":"Fetch any public web page and return clean, readable Markdown (main content only: no scripts, nav or footer) plus title, word count and final URL. Ideal for feeding pages to an LLM.","tags":["web","scrape","markdown","reader","rag"],"x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.003000"},"network":"eip155:8453","asset":"USDC"},"parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","description":"Public http(s) URL (scheme optional)","minLength":3},"example":"https://example.com"},{"name":"maxChars","in":"query","required":false,"schema":{"type":"string","description":"Max markdown characters (1000-50000, default 20000)"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"},"example":{"url":"https://example.com/","title":"Example Domain","words":30,"markdown":"# Example Domain\n\nThis domain is for use in documentation examples..."}}}},"400":{"description":"Bad input (rejected before payment; never charged)"},"402":{"description":"Payment Required (x402 v2 PAYMENT-REQUIRED header; same JSON in body)"},"502":{"description":"Target or upstream unreachable (payment not settled)"}}}},"/v1/url/metadata":{"get":{"operationId":"url_metadata","summary":"Link preview and SEO metadata for any URL","description":"Link preview and SEO metadata for any URL: title, description, canonical, language, Open Graph and Twitter card, favicon, RSS/Atom feeds and JSON-LD types, after following redirects.","tags":["web","metadata","opengraph","seo","link-preview"],"x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002000"},"network":"eip155:8453","asset":"USDC"},"parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","description":"Public http(s) URL (scheme optional)","minLength":3},"example":"https://github.com"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"},"example":{"finalUrl":"https://github.com/","title":"GitHub","openGraph":{"image":"https://github.githubassets.com/..."},"favicon":"https://github.com/favicon.ico"}}}},"400":{"description":"Bad input (rejected before payment; never charged)"},"402":{"description":"Payment Required (x402 v2 PAYMENT-REQUIRED header; same JSON in body)"},"502":{"description":"Target or upstream unreachable (payment not settled)"}}}},"/v1/url/links":{"get":{"operationId":"url_links","summary":"Every unique outgoing link on a web page (absolute URLs, anchor text, internal vs external), up to 5","description":"Every unique outgoing link on a web page (absolute URLs, anchor text, internal vs external), up to 500. Use it to crawl a site or find related pages.","tags":["web","links","crawl","seo"],"x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002000"},"network":"eip155:8453","asset":"USDC"},"parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","description":"Public http(s) URL (scheme optional)","minLength":3},"example":"https://news.ycombinator.com"},{"name":"external","in":"query","required":false,"schema":{"type":"string","enum":["only","exclude"],"description":"Filter to only or exclude external links"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"},"example":{"count":120,"internal":90,"external":30,"links":[{"url":"https://example.org/","text":"Example","internal":false}]}}}},"400":{"description":"Bad input (rejected before payment; never charged)"},"402":{"description":"Payment Required (x402 v2 PAYMENT-REQUIRED header; same JSON in body)"},"502":{"description":"Target or upstream unreachable (payment not settled)"}}}},"/v1/url/check":{"get":{"operationId":"url_check","summary":"Is this URL up","description":"Is this URL up? HTTP status, full redirect chain, final URL, response time, content type, server/CDN and a security-headers grade (HSTS, CSP, X-Frame-Options...).","tags":["web","uptime","status","redirects","security-headers"],"x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.001000"},"network":"eip155:8453","asset":"USDC"},"parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","description":"Public http(s) URL (scheme optional)","minLength":3},"example":"http://github.com"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"},"example":{"status":200,"ok":true,"redirects":1,"finalUrl":"https://github.com/","responseMs":180,"securityHeaders":{"grade":"A"}}}}},"400":{"description":"Bad input (rejected before payment; never charged)"},"402":{"description":"Payment Required (x402 v2 PAYMENT-REQUIRED header; same JSON in body)"},"502":{"description":"Target or upstream unreachable (payment not settled)"}}}},"/v1/dns/lookup":{"get":{"operationId":"dns_lookup","summary":"DNS records for a domain over DNS-over-HTTPS","description":"DNS records for a domain over DNS-over-HTTPS: A, AAAA, CNAME, MX, TXT, NS, SOA, CAA, SRV, PTR or HTTPS, with TTLs and DNSSEC validation flag.","tags":["dns","domain","network"],"x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.001000"},"network":"eip155:8453","asset":"USDC"},"parameters":[{"name":"domain","in":"query","required":true,"schema":{"type":"string","description":"Domain name, e.g. example.com","minLength":3},"example":"example.com"},{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["A","AAAA","CNAME","MX","TXT","NS","SOA","CAA","SRV","PTR","HTTPS"],"default":"A"},"example":"MX"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"},"example":{"name":"example.com","type":"MX","status":"NOERROR","answers":[{"type":"MX","ttl":86400,"data":"0 ."}]}}}},"400":{"description":"Bad input (rejected before payment; never charged)"},"402":{"description":"Payment Required (x402 v2 PAYMENT-REQUIRED header; same JSON in body)"},"502":{"description":"Target or upstream unreachable (payment not settled)"}}}},"/v1/email/check":{"get":{"operationId":"email_domain_check","summary":"Check an email address or domain before you send","description":"Check an email address or domain before you send: syntax, MX servers, accepts mail?, disposable or free provider, mail provider (Google, Microsoft...), SPF and DMARC policy, with risk flags.","tags":["email","validation","mx","spf","dmarc","lead"],"x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002000"},"network":"eip155:8453","asset":"USDC"},"parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","description":"Email address or bare domain"},"example":"someone@gmail.com"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"},"example":{"domain":"gmail.com","acceptsMail":true,"disposable":false,"freeProvider":true,"mailProvider":"Google Workspace","dmarc":{"policy":"none"},"flags":["free_email_provider"]}}}},"400":{"description":"Bad input (rejected before payment; never charged)"},"402":{"description":"Payment Required (x402 v2 PAYMENT-REQUIRED header; same JSON in body)"},"502":{"description":"Target or upstream unreachable (payment not settled)"}}}},"/v1/domain/whois":{"get":{"operationId":"domain_whois","summary":"WHOIS for a domain via official RDAP","description":"WHOIS for a domain via official RDAP: registered?, registrar, creation/expiry dates, domain age in days, status codes, nameservers, DNSSEC and abuse contact. Spot newly registered (phishing) domains.","tags":["whois","rdap","domain","registrar","security"],"x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.002000"},"network":"eip155:8453","asset":"USDC"},"parameters":[{"name":"domain","in":"query","required":true,"schema":{"type":"string","description":"Domain name, e.g. example.com","minLength":3},"example":"example.com"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"},"example":{"domain":"example.com","registered":true,"registrar":"RESERVED-Internet Assigned Numbers Authority","created":"1995-08-14T04:00:00Z","ageDays":11400}}}},"400":{"description":"Bad input (rejected before payment; never charged)"},"402":{"description":"Payment Required (x402 v2 PAYMENT-REQUIRED header; same JSON in body)"},"502":{"description":"Target or upstream unreachable (payment not settled)"}}}},"/v1/robots/check":{"get":{"operationId":"robots_check","summary":"May I crawl this URL","description":"May I crawl this URL? Parses robots.txt and answers allowed true/false for your user agent and path, the matching rule, sitemaps, and whether 14 AI crawlers (GPTBot, ClaudeBot, PerplexityBot...) are allowed.","tags":["web","robots","crawl","compliance","ai-crawlers"],"x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.001000"},"network":"eip155:8453","asset":"USDC"},"parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","description":"Public http(s) URL (scheme optional)","minLength":3},"example":"https://www.nytimes.com/section/technology"},{"name":"userAgent","in":"query","required":false,"schema":{"type":"string","default":"*"},"example":"GPTBot"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"},"example":{"allowed":false,"matchedRule":"Disallow: /","sitemaps":["https://www.nytimes.com/sitemaps/new/news.xml.gz"],"aiCrawlers":{"GPTBot":false,"ClaudeBot":false}}}}},"400":{"description":"Bad input (rejected before payment; never charged)"},"402":{"description":"Payment Required (x402 v2 PAYMENT-REQUIRED header; same JSON in body)"},"502":{"description":"Target or upstream unreachable (payment not settled)"}}}},"/v1/domain/report":{"get":{"operationId":"domain_report","summary":"One-call domain due diligence","description":"One-call domain due diligence: RDAP registration (age, registrar, expiry), DNS (A/AAAA/NS/CAA, DNSSEC), email setup (MX/SPF/DMARC), HTTPS reachability with security-headers grade, and risk flags such as newly_registered_lt_30d.","tags":["domain","security","due-diligence","phishing","whois","dns"],"x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.005000"},"network":"eip155:8453","asset":"USDC"},"parameters":[{"name":"domain","in":"query","required":true,"schema":{"type":"string","description":"Domain name, e.g. example.com","minLength":3},"example":"stripe.com"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"},"example":{"domain":"stripe.com","registration":{"ageDays":10000},"https":{"status":200,"securityHeaders":{"grade":"A"}},"flags":[]}}}},"400":{"description":"Bad input (rejected before payment; never charged)"},"402":{"description":"Payment Required (x402 v2 PAYMENT-REQUIRED header; same JSON in body)"},"502":{"description":"Target or upstream unreachable (payment not settled)"}}}}}}