{"openapi":"3.1.0","info":{"title":"MiroMiro Design Extraction API","version":"1.0.0","description":"Turn any live website URL into design data: production-ready section code, brand identity, the full design-token system, and every asset (images, SVGs, fonts, videos, audio, Lottie). Built for developers and AI agents — also available as an MCP server at https://miromiro.app/mcp.\n\nAuth: Bearer key (`mm_live_…`). Get one free at https://miromiro.app/api/onboarding — 300 credits/month, no card. Docs: https://miromiro.app/api/docs (append .md to any docs URL for raw Markdown).","contact":{"name":"MiroMiro","url":"https://miromiro.app/api"}},"servers":[{"url":"https://miromiro.app/api/v1","description":"Production"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"API key from the MiroMiro console, format mm_live_… Sent as `Authorization: Bearer mm_live_…`."}}},"paths":{"/code":{"get":{"operationId":"extractCode","summary":"URL → code: a live section as a clean component","description":"The flagship. Resolves the page's real CSS cascade and returns a self-contained component (Tailwind, HTML+CSS, React or Vue) plus the design tokens that section uses. Omit `selector` and the hero section is auto-detected; the `sections` field lists every extractable section so you can call again for a specific one. For jsx/vue, repeated structures collapse into a data array with .map()/v-for.\n\n**Cost:** 25 credits (+5 with render=true). Cache hits and failed calls cost 0.","security":[{"bearerAuth":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"The page to extract from. Scheme optional — `stripe.com` works.","schema":{"type":"string","examples":["stripe.com"]}},{"name":"selector","in":"query","required":false,"description":"CSS selector of the section to extract (e.g. #hero, .pricing-card). Omit to auto-detect the hero. No match → 404 listing the sections that do exist.","schema":{"type":"string"}},{"name":"framework","in":"query","required":false,"description":"Output flavor.","schema":{"type":"string","enum":["tailwind","html","jsx","vue"],"default":"tailwind"}},{"name":"name","in":"query","required":false,"description":"Component name for jsx output (ignored by tailwind, html and vue). Not part of the cache key: renaming a cached section costs 0 credits.","schema":{"type":"string"}},{"name":"theme","in":"query","required":false,"description":"Which color scheme to extract. Default light: the page's light styles are the component, its prefers-color-scheme: dark rules ride along as dark: variants. theme=dark promotes the dark rules and custom properties to the component itself. Works whether the page expresses its themes as a prefers-color-scheme media query or as a root attribute/class its CSS is scoped to ([data-theme=dark], html.dark). Themes switched purely in JavaScript cannot be selected: you get the page default plus a hint. No extra credits.","schema":{"type":"string","enum":["light","dark"],"default":"light"}},{"name":"render","in":"query","required":false,"description":"Load the page in a real browser and run its JavaScript before extracting. Use for client-rendered sites (React/Next/SPAs). Adds 5 credits. When a static extraction comes back thin on a client-rendered page, the response includes a top-level `hint` field telling you to retry with render=true. Also the fix for a 403 `target_blocked`: that is usually bot protection refusing a plain HTTP request, and the same URL generally succeeds with render=true.","schema":{"type":"boolean","default":false}},{"name":"fresh","in":"query","required":false,"description":"Skip the 24-hour cache and re-extract from the live page (charged normally). The fresh result replaces the cached copy. Without it, identical repeat calls within 24 hours are served from cache at 0 credits.","schema":{"type":"boolean","default":false}},{"name":"screenshot","in":"query","required":false,"description":"Requires render=true. Captures a screenshot in the same browser session - `true` for the 1440x900 viewport, `full` for the entire page height - and adds a `screenshot` field (public image URL, live for 7 days) to the response. No extra credits beyond the render surcharge. Captured on fresh extractions; a cache hit returns the screenshot stored with the cached result.","schema":{"type":"string","enum":["true","full"]}},{"name":"fields","in":"query","required":false,"description":"Comma-separated list of response fields to return. Trims the response only — the credit cost is unchanged. `url` is always included. Allowed: code, css, tokens, theme, assets, selector, autoDetected, sections, framework.","schema":{"type":"string","examples":["code,css"]}}],"responses":{"200":{"description":"Successful extraction.","headers":{"X-RateLimit-Limit":{"description":"Per-minute request allowance for your plan.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current 60s window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Quota-Limit":{"description":"Monthly credit quota. Omitted on unlimited plans.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Credits remaining this month. Omitted on unlimited plans.","schema":{"type":"integer"}},"X-Cache":{"description":"HIT = served from the 24h cache (0 credits) · MISS = extracted live · BYPASS = fresh=true skipped the cache.","schema":{"type":"string","enum":["HIT","MISS","BYPASS"]}},"X-Request-Id":{"description":"Unique id for this call (req_…), present on every response. Errors echo it as data.requestId. Include it when reporting a problem.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"The resolved URL that was extracted."},"code":{"type":"string","description":"The component, paste-ready."},"css":{"type":["string","null"],"description":"Companion stylesheet (always for framework=html; for others only when @keyframes are needed)."},"tokens":{"type":"object","description":"Design tokens this section actually uses.","additionalProperties":true},"theme":{"type":"string","enum":["light","dark"],"description":"Whether the CAPTURED code reads light or dark. Measured from the page - its declared root theme when it has one, else the backgrounds the cascade resolved - and never echoed back from the theme parameter, so a request the page could not honour still reports what you actually received. A site that expresses themes only through a prefers-color-scheme media query returns its light branch unless you pass theme=dark. Absent when the page declares no theme and no readable background was found."},"assets":{"type":"object","description":"Asset URLs the section references.","additionalProperties":true},"selector":{"type":"string"},"autoDetected":{"type":"boolean"},"sections":{"type":"array","description":"Every extractable section on the page, best first: { selector, label, elements, preview }.","items":{"type":"object","additionalProperties":true}},"framework":{"type":"string","enum":["tailwind","html","jsx","vue"]},"summary":{"type":"object","description":"Extraction quality: elements, mappedToTailwind, arbitrary, styledCoverage (0-100 quality signal), repeatedGroups, truncated.","additionalProperties":true},"hint":{"type":"string","description":"Present only when the extraction looks degraded (e.g. client-rendered app shell). Says what to do — usually retry with render=true."},"screenshot":{"type":"string","description":"Present only when a screenshot was requested: public URL of the page capture (1440x900 viewport, or full page with screenshot=full), live for 7 days."},"usage":{"type":"object","description":"Metering for this call. creditsSpent is 0 on cache hits.","properties":{"creditsThisMonth":{"type":"number"},"monthlyLimit":{"type":["number","null"],"description":"null = unlimited plan"},"remaining":{"type":["number","null"]},"creditsSpent":{"type":"number"},"cached":{"type":"boolean"},"overageCredits":{"type":"number","description":"Present only when a paid key is past its quota: billed overage credits used this period."}}}}}}}},"400":{"description":"Invalid input — missing url, unknown fields name, or bad parameter value. The statusMessage lists what is valid.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"401":{"description":"Missing, invalid, or revoked API key.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"422":{"description":"The target URL could not be fetched or parsed.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"429":{"description":"Per-minute rate limit or monthly credit quota exceeded. The statusMessage says which, and when to retry.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"503":{"description":"render=true requested but JS rendering is not available. Retry without render.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}}}}},"/brand":{"get":{"operationId":"extractBrand","summary":"Brand identity: color roles, palette, fonts, logo, socials","description":"The curated view: named color roles (primary/accent/background/text) with human-readable names, theme (dark/light), brand palette, primary fonts by role, logos, og-image, social profiles, and a 0-1 confidence score (how much the site declared vs how much was inferred — gate on it for bulk extraction).\n\n**Cost:** 15 credits (+5 with render=true). Cache hits and failed calls cost 0.","security":[{"bearerAuth":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"The page to extract from. Scheme optional — `stripe.com` works.","schema":{"type":"string","examples":["stripe.com"]}},{"name":"render","in":"query","required":false,"description":"Load the page in a real browser and run its JavaScript before extracting. Use for client-rendered sites (React/Next/SPAs). Adds 5 credits. When a static extraction comes back thin on a client-rendered page, the response includes a top-level `hint` field telling you to retry with render=true. Also the fix for a 403 `target_blocked`: that is usually bot protection refusing a plain HTTP request, and the same URL generally succeeds with render=true.","schema":{"type":"boolean","default":false}},{"name":"fresh","in":"query","required":false,"description":"Skip the 24-hour cache and re-extract from the live page (charged normally). The fresh result replaces the cached copy. Without it, identical repeat calls within 24 hours are served from cache at 0 credits.","schema":{"type":"boolean","default":false}},{"name":"screenshot","in":"query","required":false,"description":"Requires render=true. Captures a screenshot in the same browser session - `true` for the 1440x900 viewport, `full` for the entire page height - and adds a `screenshot` field (public image URL, live for 7 days) to the response. No extra credits beyond the render surcharge. Captured on fresh extractions; a cache hit returns the screenshot stored with the cached result.","schema":{"type":"string","enum":["true","full"]}},{"name":"fields","in":"query","required":false,"description":"Comma-separated list of response fields to return. Trims the response only — the credit cost is unchanged. `url` is always included. Allowed: title, description, siteName, themeColor, theme, colors, colorNames, palette, fonts, typography, logo, logos, ogImage, socials, confidence, signals.","schema":{"type":"string","examples":["title,description"]}}],"responses":{"200":{"description":"Successful extraction.","headers":{"X-RateLimit-Limit":{"description":"Per-minute request allowance for your plan.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current 60s window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Quota-Limit":{"description":"Monthly credit quota. Omitted on unlimited plans.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Credits remaining this month. Omitted on unlimited plans.","schema":{"type":"integer"}},"X-Cache":{"description":"HIT = served from the 24h cache (0 credits) · MISS = extracted live · BYPASS = fresh=true skipped the cache.","schema":{"type":"string","enum":["HIT","MISS","BYPASS"]}},"X-Request-Id":{"description":"Unique id for this call (req_…), present on every response. Errors echo it as data.requestId. Include it when reporting a problem.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"The resolved URL that was extracted."},"title":{"type":["string","null"]},"description":{"type":["string","null"]},"siteName":{"type":["string","null"]},"themeColor":{"type":["string","null"]},"theme":{"type":["string","null"],"description":"dark | light when detectable."},"colors":{"type":"object","description":"Named color roles: primary, accent, background, text — as hex.","additionalProperties":true},"colorNames":{"type":"object","description":"Human-readable name per role, e.g. \"Royal Blue\".","additionalProperties":true},"palette":{"type":"array","description":"The brand palette.","items":{"type":"object","additionalProperties":true}},"fonts":{"type":"object","description":"Primary fonts by role (primary/mono).","additionalProperties":true},"typography":{"type":"object","description":"Typography scale details.","additionalProperties":true},"logo":{"type":["string","null"],"description":"Primary logo URL."},"logos":{"type":"array","description":"All logo candidates found.","items":{"type":"object","additionalProperties":true}},"ogImage":{"type":["string","null"]},"socials":{"type":"array","description":"One { platform, url, handle } per platform (x, github, linkedin, …).","items":{"type":"object","additionalProperties":true}},"confidence":{"type":"number","minimum":0,"maximum":1},"signals":{"type":"object","description":"The provenance behind confidence: primarySource (css-var | theme-color | logo | usage | null — where colors.primary came from, strongest first; \"usage\" means it was inferred from frequency rather than declared), declaredBackground, declaredText, declaredLogo, fontsFound, and explanation — a ready-to-show sentence stating how much was declared vs inferred.","additionalProperties":true},"hint":{"type":"string","description":"Present only when the extraction looks degraded (e.g. client-rendered app shell). Says what to do — usually retry with render=true."},"screenshot":{"type":"string","description":"Present only when a screenshot was requested: public URL of the page capture (1440x900 viewport, or full page with screenshot=full), live for 7 days."},"usage":{"type":"object","description":"Metering for this call. creditsSpent is 0 on cache hits.","properties":{"creditsThisMonth":{"type":"number"},"monthlyLimit":{"type":["number","null"],"description":"null = unlimited plan"},"remaining":{"type":["number","null"]},"creditsSpent":{"type":"number"},"cached":{"type":"boolean"},"overageCredits":{"type":"number","description":"Present only when a paid key is past its quota: billed overage credits used this period."}}}}}}}},"400":{"description":"Invalid input — missing url, unknown fields name, or bad parameter value. The statusMessage lists what is valid.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"401":{"description":"Missing, invalid, or revoked API key.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"422":{"description":"The target URL could not be fetched or parsed.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"429":{"description":"Per-minute rate limit or monthly credit quota exceeded. The statusMessage says which, and when to retry.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"503":{"description":"render=true requested but JS rendering is not available. Retry without render.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}}}}},"/extract":{"get":{"operationId":"extractDesignTokens","summary":"The full design-token system of a page","description":"Every token group with usage data: colors (with the CSS properties they paint), fontFamilies, fontSizes, fontWeights, letterSpacings, lineHeights, spacing, borderRadiuses, borderWidths, boxShadows, textShadows, opacities, gradients, durations, easings, breakpoints, zIndexes, plus colorSchemes. Counts are tallied over the whole stylesheet, so on a page that ships both themes the values are the union of the two - check colorSchemes before treating the most-used color as the background. Add format=css or format=tailwind for a paste-ready text block instead of JSON.\n\n**Cost:** 10 credits (+5 with render=true). Cache hits and failed calls cost 0.","security":[{"bearerAuth":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"The page to extract from. Scheme optional — `stripe.com` works.","schema":{"type":"string","examples":["stripe.com"]}},{"name":"format","in":"query","required":false,"description":"json returns the token object; css returns :root { } custom properties (text/css); tailwind returns a theme block (text/plain); dtcg returns a standalone W3C Design Tokens file (application/json) for Style Dictionary / Figma variables pipelines.","schema":{"type":"string","enum":["json","css","tailwind","dtcg"],"default":"json"}},{"name":"render","in":"query","required":false,"description":"Load the page in a real browser and run its JavaScript before extracting. Use for client-rendered sites (React/Next/SPAs). Adds 5 credits. When a static extraction comes back thin on a client-rendered page, the response includes a top-level `hint` field telling you to retry with render=true. Also the fix for a 403 `target_blocked`: that is usually bot protection refusing a plain HTTP request, and the same URL generally succeeds with render=true.","schema":{"type":"boolean","default":false}},{"name":"fresh","in":"query","required":false,"description":"Skip the 24-hour cache and re-extract from the live page (charged normally). The fresh result replaces the cached copy. Without it, identical repeat calls within 24 hours are served from cache at 0 credits.","schema":{"type":"boolean","default":false}},{"name":"screenshot","in":"query","required":false,"description":"Requires render=true. Captures a screenshot in the same browser session - `true` for the 1440x900 viewport, `full` for the entire page height - and adds a `screenshot` field (public image URL, live for 7 days) to the response. No extra credits beyond the render surcharge. Captured on fresh extractions; a cache hit returns the screenshot stored with the cached result.","schema":{"type":"string","enum":["true","full"]}},{"name":"fields","in":"query","required":false,"description":"Comma-separated list of response fields to return. Trims the response only — the credit cost is unchanged. `url` is always included. Allowed: colors, fontSizes, fontFamilies, fontWeights, letterSpacings, borderRadiuses, boxShadows, lineHeights, zIndexes, spacing, gradients, durations, easings, textShadows, borderWidths, opacities, breakpoints, colorSchemes.","schema":{"type":"string","examples":["colors,fontSizes"]}}],"responses":{"200":{"description":"Successful extraction.","headers":{"X-RateLimit-Limit":{"description":"Per-minute request allowance for your plan.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current 60s window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Quota-Limit":{"description":"Monthly credit quota. Omitted on unlimited plans.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Credits remaining this month. Omitted on unlimited plans.","schema":{"type":"integer"}},"X-Cache":{"description":"HIT = served from the 24h cache (0 credits) · MISS = extracted live · BYPASS = fresh=true skipped the cache.","schema":{"type":"string","enum":["HIT","MISS","BYPASS"]}},"X-Request-Id":{"description":"Unique id for this call (req_…), present on every response. Errors echo it as data.requestId. Include it when reporting a problem.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"The resolved URL that was extracted."},"colors":{"type":"object","description":"The colors token group.","additionalProperties":true},"fontSizes":{"type":"object","description":"The fontSizes token group.","additionalProperties":true},"fontFamilies":{"type":"object","description":"The fontFamilies token group.","additionalProperties":true},"fontWeights":{"type":"object","description":"The fontWeights token group.","additionalProperties":true},"letterSpacings":{"type":"object","description":"The letterSpacings token group.","additionalProperties":true},"borderRadiuses":{"type":"object","description":"The borderRadiuses token group.","additionalProperties":true},"boxShadows":{"type":"object","description":"The boxShadows token group.","additionalProperties":true},"lineHeights":{"type":"object","description":"The lineHeights token group.","additionalProperties":true},"zIndexes":{"type":"object","description":"The zIndexes token group.","additionalProperties":true},"spacing":{"type":"object","description":"The spacing token group.","additionalProperties":true},"gradients":{"type":"object","description":"The gradients token group.","additionalProperties":true},"durations":{"type":"object","description":"The durations token group.","additionalProperties":true},"easings":{"type":"object","description":"The easings token group.","additionalProperties":true},"textShadows":{"type":"object","description":"The textShadows token group.","additionalProperties":true},"borderWidths":{"type":"object","description":"The borderWidths token group.","additionalProperties":true},"opacities":{"type":"object","description":"The opacities token group.","additionalProperties":true},"breakpoints":{"type":"object","description":"The breakpoints token group.","additionalProperties":true},"colorSchemes":{"type":"array","items":{"type":"string","enum":["light","dark"]},"description":"The color schemes this page declares: [\"light\"] or [\"light\",\"dark\"]. When both, the token counts above mix the two themes and neither is labelled."},"hint":{"type":"string","description":"Present only when the extraction looks degraded (e.g. client-rendered app shell). Says what to do — usually retry with render=true."},"screenshot":{"type":"string","description":"Present only when a screenshot was requested: public URL of the page capture (1440x900 viewport, or full page with screenshot=full), live for 7 days."},"usage":{"type":"object","description":"Metering for this call. creditsSpent is 0 on cache hits.","properties":{"creditsThisMonth":{"type":"number"},"monthlyLimit":{"type":["number","null"],"description":"null = unlimited plan"},"remaining":{"type":["number","null"]},"creditsSpent":{"type":"number"},"cached":{"type":"boolean"},"overageCredits":{"type":"number","description":"Present only when a paid key is past its quota: billed overage credits used this period."}}}}}}}},"400":{"description":"Invalid input — missing url, unknown fields name, or bad parameter value. The statusMessage lists what is valid.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"401":{"description":"Missing, invalid, or revoked API key.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"422":{"description":"The target URL could not be fetched or parsed.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"429":{"description":"Per-minute rate limit or monthly credit quota exceeded. The statusMessage says which, and when to retry.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"503":{"description":"render=true requested but JS rendering is not available. Retry without render.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}}}}},"/images":{"get":{"operationId":"extractImages","summary":"Every image a page declares","description":"img, srcset, picture, CSS background-image, favicons, og:image — each tagged by source.\n\n**Cost:** 1 credit (+5 with render=true). Cache hits and failed calls cost 0.","security":[{"bearerAuth":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"The page to extract from. Scheme optional — `stripe.com` works.","schema":{"type":"string","examples":["stripe.com"]}},{"name":"render","in":"query","required":false,"description":"Load the page in a real browser and run its JavaScript before extracting. Use for client-rendered sites (React/Next/SPAs). Adds 5 credits. When a static extraction comes back thin on a client-rendered page, the response includes a top-level `hint` field telling you to retry with render=true. Also the fix for a 403 `target_blocked`: that is usually bot protection refusing a plain HTTP request, and the same URL generally succeeds with render=true.","schema":{"type":"boolean","default":false}},{"name":"fresh","in":"query","required":false,"description":"Skip the 24-hour cache and re-extract from the live page (charged normally). The fresh result replaces the cached copy. Without it, identical repeat calls within 24 hours are served from cache at 0 credits.","schema":{"type":"boolean","default":false}},{"name":"screenshot","in":"query","required":false,"description":"Requires render=true. Captures a screenshot in the same browser session - `true` for the 1440x900 viewport, `full` for the entire page height - and adds a `screenshot` field (public image URL, live for 7 days) to the response. No extra credits beyond the render surcharge. Captured on fresh extractions; a cache hit returns the screenshot stored with the cached result.","schema":{"type":"string","enum":["true","full"]}},{"name":"fields","in":"query","required":false,"description":"Comma-separated list of response fields to return. Trims the response only — the credit cost is unchanged. `url` is always included. Allowed: images, count.","schema":{"type":"string","examples":["images,count"]}}],"responses":{"200":{"description":"Successful extraction.","headers":{"X-RateLimit-Limit":{"description":"Per-minute request allowance for your plan.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current 60s window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Quota-Limit":{"description":"Monthly credit quota. Omitted on unlimited plans.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Credits remaining this month. Omitted on unlimited plans.","schema":{"type":"integer"}},"X-Cache":{"description":"HIT = served from the 24h cache (0 credits) · MISS = extracted live · BYPASS = fresh=true skipped the cache.","schema":{"type":"string","enum":["HIT","MISS","BYPASS"]}},"X-Request-Id":{"description":"Unique id for this call (req_…), present on every response. Errors echo it as data.requestId. Include it when reporting a problem.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"The resolved URL that was extracted."},"images":{"type":"array","description":"Each { url, source, … }.","items":{"type":"object","additionalProperties":true}},"count":{"type":"number"},"hint":{"type":"string","description":"Present only when the extraction looks degraded (e.g. client-rendered app shell). Says what to do — usually retry with render=true."},"screenshot":{"type":"string","description":"Present only when a screenshot was requested: public URL of the page capture (1440x900 viewport, or full page with screenshot=full), live for 7 days."},"usage":{"type":"object","description":"Metering for this call. creditsSpent is 0 on cache hits.","properties":{"creditsThisMonth":{"type":"number"},"monthlyLimit":{"type":["number","null"],"description":"null = unlimited plan"},"remaining":{"type":["number","null"]},"creditsSpent":{"type":"number"},"cached":{"type":"boolean"},"overageCredits":{"type":"number","description":"Present only when a paid key is past its quota: billed overage credits used this period."}}}}}}}},"400":{"description":"Invalid input — missing url, unknown fields name, or bad parameter value. The statusMessage lists what is valid.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"401":{"description":"Missing, invalid, or revoked API key.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"422":{"description":"The target URL could not be fetched or parsed.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"429":{"description":"Per-minute rate limit or monthly credit quota exceeded. The statusMessage says which, and when to retry.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"503":{"description":"render=true requested but JS rendering is not available. Retry without render.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}}}}},"/svg":{"get":{"operationId":"extractSvgs","summary":"Inline SVGs as code + external SVG files","description":"Inline <svg> markup paste-ready, plus external .svg file references.\n\n**Cost:** 1 credit (+5 with render=true). Cache hits and failed calls cost 0.","security":[{"bearerAuth":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"The page to extract from. Scheme optional — `stripe.com` works.","schema":{"type":"string","examples":["stripe.com"]}},{"name":"render","in":"query","required":false,"description":"Load the page in a real browser and run its JavaScript before extracting. Use for client-rendered sites (React/Next/SPAs). Adds 5 credits. When a static extraction comes back thin on a client-rendered page, the response includes a top-level `hint` field telling you to retry with render=true. Also the fix for a 403 `target_blocked`: that is usually bot protection refusing a plain HTTP request, and the same URL generally succeeds with render=true.","schema":{"type":"boolean","default":false}},{"name":"fresh","in":"query","required":false,"description":"Skip the 24-hour cache and re-extract from the live page (charged normally). The fresh result replaces the cached copy. Without it, identical repeat calls within 24 hours are served from cache at 0 credits.","schema":{"type":"boolean","default":false}},{"name":"screenshot","in":"query","required":false,"description":"Requires render=true. Captures a screenshot in the same browser session - `true` for the 1440x900 viewport, `full` for the entire page height - and adds a `screenshot` field (public image URL, live for 7 days) to the response. No extra credits beyond the render surcharge. Captured on fresh extractions; a cache hit returns the screenshot stored with the cached result.","schema":{"type":"string","enum":["true","full"]}},{"name":"fields","in":"query","required":false,"description":"Comma-separated list of response fields to return. Trims the response only — the credit cost is unchanged. `url` is always included. Allowed: svgs, count.","schema":{"type":"string","examples":["svgs,count"]}}],"responses":{"200":{"description":"Successful extraction.","headers":{"X-RateLimit-Limit":{"description":"Per-minute request allowance for your plan.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current 60s window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Quota-Limit":{"description":"Monthly credit quota. Omitted on unlimited plans.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Credits remaining this month. Omitted on unlimited plans.","schema":{"type":"integer"}},"X-Cache":{"description":"HIT = served from the 24h cache (0 credits) · MISS = extracted live · BYPASS = fresh=true skipped the cache.","schema":{"type":"string","enum":["HIT","MISS","BYPASS"]}},"X-Request-Id":{"description":"Unique id for this call (req_…), present on every response. Errors echo it as data.requestId. Include it when reporting a problem.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"The resolved URL that was extracted."},"svgs":{"type":"array","description":"Inline SVG code and file references.","items":{"type":"object","additionalProperties":true}},"count":{"type":"number"},"hint":{"type":"string","description":"Present only when the extraction looks degraded (e.g. client-rendered app shell). Says what to do — usually retry with render=true."},"screenshot":{"type":"string","description":"Present only when a screenshot was requested: public URL of the page capture (1440x900 viewport, or full page with screenshot=full), live for 7 days."},"usage":{"type":"object","description":"Metering for this call. creditsSpent is 0 on cache hits.","properties":{"creditsThisMonth":{"type":"number"},"monthlyLimit":{"type":["number","null"],"description":"null = unlimited plan"},"remaining":{"type":["number","null"]},"creditsSpent":{"type":"number"},"cached":{"type":"boolean"},"overageCredits":{"type":"number","description":"Present only when a paid key is past its quota: billed overage credits used this period."}}}}}}}},"400":{"description":"Invalid input — missing url, unknown fields name, or bad parameter value. The statusMessage lists what is valid.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"401":{"description":"Missing, invalid, or revoked API key.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"422":{"description":"The target URL could not be fetched or parsed.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"429":{"description":"Per-minute rate limit or monthly credit quota exceeded. The statusMessage says which, and when to retry.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"503":{"description":"render=true requested but JS rendering is not available. Retry without render.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}}}}},"/fonts":{"get":{"operationId":"extractFonts","summary":"The real typography a site loads","description":"Resolves the full CSS cascade (linked stylesheets + @import) and returns every @font-face file with family/weight/style/format, Google Fonts links, and a grouped per-family summary. Families named as a foundry demo or trial cut are marked `demo: true` and summarised in `note`.\n\n**Cost:** 5 credits (+5 with render=true). Cache hits and failed calls cost 0.","security":[{"bearerAuth":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"The page to extract from. Scheme optional — `stripe.com` works.","schema":{"type":"string","examples":["stripe.com"]}},{"name":"render","in":"query","required":false,"description":"Load the page in a real browser and run its JavaScript before extracting. Use for client-rendered sites (React/Next/SPAs). Adds 5 credits. When a static extraction comes back thin on a client-rendered page, the response includes a top-level `hint` field telling you to retry with render=true. Also the fix for a 403 `target_blocked`: that is usually bot protection refusing a plain HTTP request, and the same URL generally succeeds with render=true.","schema":{"type":"boolean","default":false}},{"name":"fresh","in":"query","required":false,"description":"Skip the 24-hour cache and re-extract from the live page (charged normally). The fresh result replaces the cached copy. Without it, identical repeat calls within 24 hours are served from cache at 0 credits.","schema":{"type":"boolean","default":false}},{"name":"screenshot","in":"query","required":false,"description":"Requires render=true. Captures a screenshot in the same browser session - `true` for the 1440x900 viewport, `full` for the entire page height - and adds a `screenshot` field (public image URL, live for 7 days) to the response. No extra credits beyond the render surcharge. Captured on fresh extractions; a cache hit returns the screenshot stored with the cached result.","schema":{"type":"string","enum":["true","full"]}},{"name":"fields","in":"query","required":false,"description":"Comma-separated list of response fields to return. Trims the response only — the credit cost is unchanged. `url` is always included. Allowed: fonts, families, googleFontsLinks, count, note.","schema":{"type":"string","examples":["fonts,families"]}}],"responses":{"200":{"description":"Successful extraction.","headers":{"X-RateLimit-Limit":{"description":"Per-minute request allowance for your plan.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current 60s window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Quota-Limit":{"description":"Monthly credit quota. Omitted on unlimited plans.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Credits remaining this month. Omitted on unlimited plans.","schema":{"type":"integer"}},"X-Cache":{"description":"HIT = served from the 24h cache (0 credits) · MISS = extracted live · BYPASS = fresh=true skipped the cache.","schema":{"type":"string","enum":["HIT","MISS","BYPASS"]}},"X-Request-Id":{"description":"Unique id for this call (req_…), present on every response. Errors echo it as data.requestId. Include it when reporting a problem.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"The resolved URL that was extracted."},"fonts":{"type":"array","description":"Every font file: family, weight, style, format, src.","items":{"type":"object","additionalProperties":true}},"families":{"type":"array","description":"Per-family summary: weights, styles, file count, and demo:true when the name marks it a demo/trial cut.","items":{"type":"object","additionalProperties":true}},"googleFontsLinks":{"type":"array","description":"Google Fonts stylesheet links.","items":{"type":"object","additionalProperties":true}},"count":{"type":"number"},"note":{"type":"string","description":"Present only when demo/trial families were found. These are subset, feature-stripped cuts foundries serve for their own specimens - not the usable typeface. Always returned, even when ?fields= omits it."},"hint":{"type":"string","description":"Present only when the extraction looks degraded (e.g. client-rendered app shell). Says what to do — usually retry with render=true."},"screenshot":{"type":"string","description":"Present only when a screenshot was requested: public URL of the page capture (1440x900 viewport, or full page with screenshot=full), live for 7 days."},"usage":{"type":"object","description":"Metering for this call. creditsSpent is 0 on cache hits.","properties":{"creditsThisMonth":{"type":"number"},"monthlyLimit":{"type":["number","null"],"description":"null = unlimited plan"},"remaining":{"type":["number","null"]},"creditsSpent":{"type":"number"},"cached":{"type":"boolean"},"overageCredits":{"type":"number","description":"Present only when a paid key is past its quota: billed overage credits used this period."}}}}}}}},"400":{"description":"Invalid input — missing url, unknown fields name, or bad parameter value. The statusMessage lists what is valid.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"401":{"description":"Missing, invalid, or revoked API key.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"422":{"description":"The target URL could not be fetched or parsed.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"429":{"description":"Per-minute rate limit or monthly credit quota exceeded. The statusMessage says which, and when to retry.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"503":{"description":"render=true requested but JS rendering is not available. Retry without render.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}}}}},"/videos":{"get":{"operationId":"extractVideos","summary":"Every video a page declares","description":"<video>/<source> files, og:video, player embeds (YouTube, Vimeo, Wistia, Loom — source \"embed\" is a player page, not a file) and direct video links, with posters when declared. JS-mounted players need render=true.\n\n**Cost:** 1 credit (+5 with render=true). Cache hits and failed calls cost 0.","security":[{"bearerAuth":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"The page to extract from. Scheme optional — `stripe.com` works.","schema":{"type":"string","examples":["stripe.com"]}},{"name":"render","in":"query","required":false,"description":"Load the page in a real browser and run its JavaScript before extracting. Use for client-rendered sites (React/Next/SPAs). Adds 5 credits. When a static extraction comes back thin on a client-rendered page, the response includes a top-level `hint` field telling you to retry with render=true. Also the fix for a 403 `target_blocked`: that is usually bot protection refusing a plain HTTP request, and the same URL generally succeeds with render=true.","schema":{"type":"boolean","default":false}},{"name":"fresh","in":"query","required":false,"description":"Skip the 24-hour cache and re-extract from the live page (charged normally). The fresh result replaces the cached copy. Without it, identical repeat calls within 24 hours are served from cache at 0 credits.","schema":{"type":"boolean","default":false}},{"name":"screenshot","in":"query","required":false,"description":"Requires render=true. Captures a screenshot in the same browser session - `true` for the 1440x900 viewport, `full` for the entire page height - and adds a `screenshot` field (public image URL, live for 7 days) to the response. No extra credits beyond the render surcharge. Captured on fresh extractions; a cache hit returns the screenshot stored with the cached result.","schema":{"type":"string","enum":["true","full"]}},{"name":"fields","in":"query","required":false,"description":"Comma-separated list of response fields to return. Trims the response only — the credit cost is unchanged. `url` is always included. Allowed: videos, count, note.","schema":{"type":"string","examples":["videos,count"]}}],"responses":{"200":{"description":"Successful extraction.","headers":{"X-RateLimit-Limit":{"description":"Per-minute request allowance for your plan.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current 60s window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Quota-Limit":{"description":"Monthly credit quota. Omitted on unlimited plans.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Credits remaining this month. Omitted on unlimited plans.","schema":{"type":"integer"}},"X-Cache":{"description":"HIT = served from the 24h cache (0 credits) · MISS = extracted live · BYPASS = fresh=true skipped the cache.","schema":{"type":"string","enum":["HIT","MISS","BYPASS"]}},"X-Request-Id":{"description":"Unique id for this call (req_…), present on every response. Errors echo it as data.requestId. Include it when reporting a problem.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"The resolved URL that was extracted."},"videos":{"type":"array","description":"Each { url, source, poster? }.","items":{"type":"object","additionalProperties":true}},"count":{"type":"number"},"note":{"type":"string"},"hint":{"type":"string","description":"Present only when the extraction looks degraded (e.g. client-rendered app shell). Says what to do — usually retry with render=true."},"screenshot":{"type":"string","description":"Present only when a screenshot was requested: public URL of the page capture (1440x900 viewport, or full page with screenshot=full), live for 7 days."},"usage":{"type":"object","description":"Metering for this call. creditsSpent is 0 on cache hits.","properties":{"creditsThisMonth":{"type":"number"},"monthlyLimit":{"type":["number","null"],"description":"null = unlimited plan"},"remaining":{"type":["number","null"]},"creditsSpent":{"type":"number"},"cached":{"type":"boolean"},"overageCredits":{"type":"number","description":"Present only when a paid key is past its quota: billed overage credits used this period."}}}}}}}},"400":{"description":"Invalid input — missing url, unknown fields name, or bad parameter value. The statusMessage lists what is valid.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"401":{"description":"Missing, invalid, or revoked API key.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"422":{"description":"The target URL could not be fetched or parsed.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"429":{"description":"Per-minute rate limit or monthly credit quota exceeded. The statusMessage says which, and when to retry.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"503":{"description":"render=true requested but JS rendering is not available. Retry without render.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}}}}},"/audio":{"get":{"operationId":"extractAudio","summary":"Every audio file a page declares","description":"<audio>/<source> files, og:audio, podcast enclosures and direct audio links, tagged by source. JS-mounted players need render=true.\n\n**Cost:** 1 credit (+5 with render=true). Cache hits and failed calls cost 0.","security":[{"bearerAuth":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"The page to extract from. Scheme optional — `stripe.com` works.","schema":{"type":"string","examples":["stripe.com"]}},{"name":"render","in":"query","required":false,"description":"Load the page in a real browser and run its JavaScript before extracting. Use for client-rendered sites (React/Next/SPAs). Adds 5 credits. When a static extraction comes back thin on a client-rendered page, the response includes a top-level `hint` field telling you to retry with render=true. Also the fix for a 403 `target_blocked`: that is usually bot protection refusing a plain HTTP request, and the same URL generally succeeds with render=true.","schema":{"type":"boolean","default":false}},{"name":"fresh","in":"query","required":false,"description":"Skip the 24-hour cache and re-extract from the live page (charged normally). The fresh result replaces the cached copy. Without it, identical repeat calls within 24 hours are served from cache at 0 credits.","schema":{"type":"boolean","default":false}},{"name":"screenshot","in":"query","required":false,"description":"Requires render=true. Captures a screenshot in the same browser session - `true` for the 1440x900 viewport, `full` for the entire page height - and adds a `screenshot` field (public image URL, live for 7 days) to the response. No extra credits beyond the render surcharge. Captured on fresh extractions; a cache hit returns the screenshot stored with the cached result.","schema":{"type":"string","enum":["true","full"]}},{"name":"fields","in":"query","required":false,"description":"Comma-separated list of response fields to return. Trims the response only — the credit cost is unchanged. `url` is always included. Allowed: audio, count, note.","schema":{"type":"string","examples":["audio,count"]}}],"responses":{"200":{"description":"Successful extraction.","headers":{"X-RateLimit-Limit":{"description":"Per-minute request allowance for your plan.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current 60s window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Quota-Limit":{"description":"Monthly credit quota. Omitted on unlimited plans.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Credits remaining this month. Omitted on unlimited plans.","schema":{"type":"integer"}},"X-Cache":{"description":"HIT = served from the 24h cache (0 credits) · MISS = extracted live · BYPASS = fresh=true skipped the cache.","schema":{"type":"string","enum":["HIT","MISS","BYPASS"]}},"X-Request-Id":{"description":"Unique id for this call (req_…), present on every response. Errors echo it as data.requestId. Include it when reporting a problem.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"The resolved URL that was extracted."},"audio":{"type":"array","description":"Each { url, source }.","items":{"type":"object","additionalProperties":true}},"count":{"type":"number"},"note":{"type":"string"},"hint":{"type":"string","description":"Present only when the extraction looks degraded (e.g. client-rendered app shell). Says what to do — usually retry with render=true."},"screenshot":{"type":"string","description":"Present only when a screenshot was requested: public URL of the page capture (1440x900 viewport, or full page with screenshot=full), live for 7 days."},"usage":{"type":"object","description":"Metering for this call. creditsSpent is 0 on cache hits.","properties":{"creditsThisMonth":{"type":"number"},"monthlyLimit":{"type":["number","null"],"description":"null = unlimited plan"},"remaining":{"type":["number","null"]},"creditsSpent":{"type":"number"},"cached":{"type":"boolean"},"overageCredits":{"type":"number","description":"Present only when a paid key is past its quota: billed overage credits used this period."}}}}}}}},"400":{"description":"Invalid input — missing url, unknown fields name, or bad parameter value. The statusMessage lists what is valid.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"401":{"description":"Missing, invalid, or revoked API key.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"422":{"description":"The target URL could not be fetched or parsed.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"429":{"description":"Per-minute rate limit or monthly credit quota exceeded. The statusMessage says which, and when to retry.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"503":{"description":"render=true requested but JS rendering is not available. Retry without render.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}}}}},"/lottie":{"get":{"operationId":"extractLottie","summary":"Lottie animations on a page","description":"Lottie JSON animations declared in static HTML. Most Lotties are injected at runtime — add render=true to catch those too.\n\n**Cost:** 3 credits (+5 with render=true). Cache hits and failed calls cost 0.","security":[{"bearerAuth":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"The page to extract from. Scheme optional — `stripe.com` works.","schema":{"type":"string","examples":["stripe.com"]}},{"name":"render","in":"query","required":false,"description":"Load the page in a real browser and run its JavaScript before extracting. Use for client-rendered sites (React/Next/SPAs). Adds 5 credits. When a static extraction comes back thin on a client-rendered page, the response includes a top-level `hint` field telling you to retry with render=true. Also the fix for a 403 `target_blocked`: that is usually bot protection refusing a plain HTTP request, and the same URL generally succeeds with render=true.","schema":{"type":"boolean","default":false}},{"name":"fresh","in":"query","required":false,"description":"Skip the 24-hour cache and re-extract from the live page (charged normally). The fresh result replaces the cached copy. Without it, identical repeat calls within 24 hours are served from cache at 0 credits.","schema":{"type":"boolean","default":false}},{"name":"screenshot","in":"query","required":false,"description":"Requires render=true. Captures a screenshot in the same browser session - `true` for the 1440x900 viewport, `full` for the entire page height - and adds a `screenshot` field (public image URL, live for 7 days) to the response. No extra credits beyond the render surcharge. Captured on fresh extractions; a cache hit returns the screenshot stored with the cached result.","schema":{"type":"string","enum":["true","full"]}},{"name":"fields","in":"query","required":false,"description":"Comma-separated list of response fields to return. Trims the response only — the credit cost is unchanged. `url` is always included. Allowed: lotties, count, note.","schema":{"type":"string","examples":["lotties,count"]}}],"responses":{"200":{"description":"Successful extraction.","headers":{"X-RateLimit-Limit":{"description":"Per-minute request allowance for your plan.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current 60s window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Quota-Limit":{"description":"Monthly credit quota. Omitted on unlimited plans.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Credits remaining this month. Omitted on unlimited plans.","schema":{"type":"integer"}},"X-Cache":{"description":"HIT = served from the 24h cache (0 credits) · MISS = extracted live · BYPASS = fresh=true skipped the cache.","schema":{"type":"string","enum":["HIT","MISS","BYPASS"]}},"X-Request-Id":{"description":"Unique id for this call (req_…), present on every response. Errors echo it as data.requestId. Include it when reporting a problem.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"The resolved URL that was extracted."},"lotties":{"type":"array","description":"Each detected Lottie with its source.","items":{"type":"object","additionalProperties":true}},"count":{"type":"number"},"note":{"type":"string"},"hint":{"type":"string","description":"Present only when the extraction looks degraded (e.g. client-rendered app shell). Says what to do — usually retry with render=true."},"screenshot":{"type":"string","description":"Present only when a screenshot was requested: public URL of the page capture (1440x900 viewport, or full page with screenshot=full), live for 7 days."},"usage":{"type":"object","description":"Metering for this call. creditsSpent is 0 on cache hits.","properties":{"creditsThisMonth":{"type":"number"},"monthlyLimit":{"type":["number","null"],"description":"null = unlimited plan"},"remaining":{"type":["number","null"]},"creditsSpent":{"type":"number"},"cached":{"type":"boolean"},"overageCredits":{"type":"number","description":"Present only when a paid key is past its quota: billed overage credits used this period."}}}}}}}},"400":{"description":"Invalid input — missing url, unknown fields name, or bad parameter value. The statusMessage lists what is valid.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"401":{"description":"Missing, invalid, or revoked API key.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"422":{"description":"The target URL could not be fetched or parsed.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"429":{"description":"Per-minute rate limit or monthly credit quota exceeded. The statusMessage says which, and when to retry.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}},"503":{"description":"render=true requested but JS rendering is not available. Retry without render.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"statusCode":{"type":"integer"},"statusMessage":{"type":"string","description":"Human- and agent-readable explanation, including what to do next (e.g. \"Rate limit exceeded. Retry in 42s.\")."},"data":{"type":"object","description":"Machine-readable error detail. Branch on code, not on the English message.","properties":{"code":{"type":"string","description":"Stable error code.","enum":["invalid_request","invalid_api_key","billing_issue","target_blocked","not_found","target_timeout","unprocessable_content","rate_limited","quota_exceeded","target_error","target_unreachable","render_unavailable","internal_error"]},"requestId":{"type":["string","null"],"description":"The X-Request-Id of this call - the lookup key for support."}}}}}}}}}}}}}