{"openapi":"3.1.0","info":{"title":"LinkGlow API","version":"1.0.0","summary":"Public REST API for LinkGlow page analysis and product discovery.","description":"Run SEO link audits to inspect internal links and verify known backlink placements. Get emailed when a link is removed, broken, or changes status. This document covers the unauthenticated public surface only. Saved audits, schedules, and team resources require a browser session and are not listed here. Human docs: https://linkglow.io/docs/api. Support: support@linkglow.io.","contact":{"name":"LinkGlow support","email":"support@linkglow.io","url":"https://linkglow.io/contact"},"license":{"name":"Proprietary","url":"https://linkglow.io/terms"}},"servers":[{"url":"https://linkglow.io","description":"Production"}],"tags":[{"name":"Discovery","description":"Find operations and product facts without scraping a page."},{"name":"Analysis","description":"Anonymous page analysis. Rate-limited. Does not persist an audit."}],"paths":{"/api/v1":{"get":{"operationId":"listPublicApi","tags":["Discovery"],"summary":"List the public LinkGlow API","description":"Returns the public operation catalog, docs URLs, and OpenAPI location. Use this as the first call when you only have the origin.","responses":{"200":{"description":"Public API index.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiIndex"}}}}}}},"/api/v1/health":{"get":{"operationId":"getHealth","tags":["Discovery"],"summary":"Liveness check","description":"Cheap liveness probe. Does not read customer data or spend scrape credits. Safe to call from uptime monitors and agent preflights.","responses":{"200":{"description":"Service is up.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"}}}}}}},"/api/v1/product":{"get":{"operationId":"getProduct","tags":["Discovery"],"summary":"LinkGlow product card for agents","description":"When to use LinkGlow, when not to, and the URLs an agent should call. Prefer this over scraping the homepage when you only need product facts.","responses":{"200":{"description":"Product card.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Product"}}}}}}},"/openapi.json":{"get":{"operationId":"getOpenApiSpec","tags":["Discovery"],"summary":"Download this OpenAPI document","description":"Returns this OpenAPI 3.1 specification. Every operation has a unique operationId, description, and typed request/response schemas for LLM function calling.","responses":{"200":{"description":"OpenAPI 3.1 document.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/demo/analyze":{"post":{"operationId":"analyzePublicDemo","tags":["Analysis"],"summary":"Analyze a public page without an account","description":"Renders a public URL (or classifies pasted HTML) with the same sanitizer and link classifier as signed-in audits. Results are not saved. URL mode is IP rate-limited (10/minute) and may return BOT_DETECTED for automated traffic. Paste mode does not spend a URL-render credit. Do not submit non-public pages.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoAnalyzeRequest"},"examples":{"urlMode":{"summary":"Fetch and render a public URL","value":{"url":"https://example.com/article"}},"pasteMode":{"summary":"Classify pasted HTML against a host","value":{"html":"<!doctype html><html><body><a href='/about'>About</a></body></html>","domain":"example.com"}}}}}},"responses":{"200":{"description":"Sanitized snapshot and classified links.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoAnalyzeSuccess"}}}},"400":{"description":"Invalid JSON, missing url/html, or URL failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Bot detected, blocked URL, or blocked redirect.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Method not allowed. This operation is POST only.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"HTML payload too large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Page could not be processed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited or demo URL budget exhausted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Upstream fetch or render failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Error":{"type":"object","additionalProperties":false,"required":["success","error","errorCode","hint","docs"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string","description":"Human-readable message."},"errorCode":{"type":"string","description":"Stable machine code such as NOT_FOUND, RATE_LIMITED, INVALID_URL."},"hint":{"type":"string","description":"What to do next."},"docs":{"type":"string","format":"uri","description":"Human docs for this API."}}},"Health":{"type":"object","additionalProperties":false,"required":["status","service"],"properties":{"status":{"type":"string","enum":["ok"]},"service":{"type":"string","enum":["linkglow"]}}},"ApiIndex":{"type":"object","additionalProperties":false,"required":["name","version","description","docs","openapi","llmsTxt","operations"],"properties":{"name":{"type":"string"},"version":{"type":"string"},"description":{"type":"string"},"docs":{"type":"string","format":"uri"},"openapi":{"type":"string","format":"uri"},"llmsTxt":{"type":"string","format":"uri"},"operations":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["method","path","operationId","description"],"properties":{"method":{"type":"string"},"path":{"type":"string"},"operationId":{"type":"string"},"description":{"type":"string"}}}}}},"Product":{"type":"object","additionalProperties":false,"required":["name","url","description","whenToUse","whenNotToUse","howToCall","contact"],"properties":{"name":{"type":"string"},"url":{"type":"string","format":"uri"},"description":{"type":"string"},"whenToUse":{"type":"array","items":{"type":"string"}},"whenNotToUse":{"type":"array","items":{"type":"string"}},"howToCall":{"type":"object","additionalProperties":{"type":"string"}},"contact":{"type":"string"}}},"DemoAnalyzeRequest":{"oneOf":[{"type":"object","additionalProperties":false,"required":["url"],"properties":{"url":{"type":"string","format":"uri","description":"Public http(s) URL to fetch and render."}}},{"type":"object","additionalProperties":false,"required":["html"],"properties":{"html":{"type":"string","description":"Raw HTML to classify. Not fetched from the network."},"domain":{"type":"string","description":"Hostname used as the classification origin. Defaults to example.com.","examples":["example.com"]}}}]},"DemoAnalyzeSuccess":{"type":"object","additionalProperties":false,"required":["success","sanitizedHtml","links","stats","domain","url"],"properties":{"success":{"type":"boolean","enum":[true]},"sanitizedHtml":{"type":"string","description":"Defanged snapshot HTML for inspection. Scripts and handlers are stripped."},"links":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["href","position","linkType","anchorText","isNofollow","isSponsored","isUgc","httpStatus","matchedGroupName"],"properties":{"href":{"type":"string"},"position":{"type":["integer","null"]},"linkType":{"type":"string","enum":["internal","external","ignored"]},"anchorText":{"type":["string","null"]},"isNofollow":{"type":["boolean","null"]},"isSponsored":{"type":["boolean","null"]},"isUgc":{"type":["boolean","null"]},"isImage":{"type":["boolean","null"]},"httpStatus":{"type":["integer","null"]},"matchedGroupName":{"type":["string","null"]}}}},"stats":{"type":"object","additionalProperties":false,"required":["total","internal","external","ignored","follow","nofollow","sponsored","ugc","broken"],"properties":{"total":{"type":"integer"},"internal":{"type":"integer"},"external":{"type":"integer"},"ignored":{"type":"integer"},"follow":{"type":"integer"},"nofollow":{"type":"integer"},"sponsored":{"type":"integer"},"ugc":{"type":"integer"},"broken":{"type":"integer"}}},"domain":{"type":"string"},"url":{"type":"string","format":"uri"}}}}},"externalDocs":{"description":"LinkGlow API docs for humans","url":"https://linkglow.io/docs/api"}}