{"data":{"schema_version":"v1","service":"replynodes-fetcher","version":"aa57df0ce9a95c40b5bbc2801e69e42358cb5fc2","documentVersion":"v1","documentHash":"sha256:e6a25bc089aa094dad8e7371a9faa97556a5673536ecb7e2881aa45bf75c02a6","document":{"openapi":"3.0.3","info":{"title":"ReplyNodes Fetcher API","version":"v1","description":"Read-only data APIs for AI agents. Bearer auth. Prepaid credits / free tier.\n\nClick **Authorize** and paste ONLY the API key (no \"Bearer\" prefix) — Swagger adds it automatically."},"servers":[{"url":"https://api.replynodes.com"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"rn_test_<64hex> or rn_live_<64hex>","description":"API key. Paste the raw key only (e.g. rn_test_...) — the \"Bearer \" prefix is added automatically."}},"schemas":{"AgentStatus":{"type":"object","description":"A key's own standing (ADR 0024). Restricted keys report a per-key keyless quota; verified and workspace keys report their credit balance.","required":["data","meta"],"properties":{"data":{"type":"object","required":["key","quota","credits","next_actions"],"properties":{"key":{"type":"object","required":["prefix","class","status","expires_at"],"properties":{"prefix":{"type":"string"},"class":{"type":"string","enum":["workspace","agent_read"]},"status":{"type":"string","enum":["restricted","verified","active"]},"expires_at":{"type":["string","null"],"format":"date-time"}}},"quota":{"type":["object","null"],"properties":{"basis":{"type":"string","const":"per_key_per_utc_day"},"reset_at":{"type":"string","format":"date-time"},"capabilities":{"type":"object","additionalProperties":{"type":"object","required":["limit","remaining"],"properties":{"limit":{"type":"integer"},"remaining":{"type":"integer"}}}}}},"credits":{"type":["object","null"],"properties":{"balance":{"type":"number"},"unit":{"type":"string","const":"credit"}}},"next_actions":{"type":"array","items":{"$ref":"#/components/schemas/NextAction"}}}},"meta":{"$ref":"#/components/schemas/GatewayResponseMeta"}}},"AnonymousContinuation":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri","const":"https://replynodes.com/auth.md"}}},"AnonymousQuotaError":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","request_id","continuation"],"properties":{"code":{"const":"anonymous_limit_reached"},"message":{"type":"string","example":"The anonymous daily limit has been reached. Get a free API key through the browser-approved claim flow described at https://replynodes.com/auth.md: 500 free credits are granted when the first long-lived API key is created and delivered."},"request_id":{"type":"string"},"continuation":{"$ref":"#/components/schemas/AnonymousContinuation"},"next_action":{"$ref":"#/components/schemas/NextAction"}}}}},"AppResponse":{"type":"object","properties":{"data":{"description":"Provider-specific JSON payload. May be an object or a list; single lookups do not imply a one-element array. For example, hackernews_item returns an object with item and comments."},"meta":{"$ref":"#/components/schemas/GatewayResponseMeta"}},"additionalProperties":false,"required":["data","meta"],"description":"Shared gateway success envelope for heterogeneous provider reads; data retains each adapter's public JSON shape."},"BrandFontsResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"domain":{"type":"string"},"url":{"type":"string"},"count":{"type":"integer"},"words_count":{"type":"integer"},"fonts":{"type":"array","items":{"type":"object","properties":{"family":{"type":"string"},"source":{"type":"string"},"source_url":{"type":"string"},"weights":{"type":"array","items":{"type":"string"}},"styles":{"type":"array","items":{"type":"string"}},"fallbacks":{"type":"array","items":{"type":"string"}},"used_in":{"type":"array","items":{"type":"string"}},"elements_count":{"type":"integer"},"usage_percent":{"type":"number"}},"additionalProperties":false,"required":["family"]}}},"additionalProperties":false,"required":["domain","url","count"]},"meta":{"$ref":"#/components/schemas/GatewayResponseMeta"}},"additionalProperties":false,"required":["data","meta"]},"BrandLogoData":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri","description":"The snapshot target URL the logos were extracted from."},"brand":{"type":"object","properties":{"name":{"type":"string","description":"Public site/brand name detected on the page, when available."},"logo_url":{"type":"string","format":"uri","description":"Primary brand logo URL, when available."},"logos":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","description":"Asset slot and format (e.g. logo.svg, favicon.ico)."},"url":{"type":"string","format":"uri"}}},"description":"Candidate logo variants detected on the page."},"favicon_url":{"type":"string","format":"uri"},"og_image":{"type":"string","format":"uri"}}}}},"BrandLogoResponse":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/BrandLogoData"},"meta":{"type":"object","additionalProperties":true}}},"BrandRetrieveAsset":{"type":"object","required":["url"],"properties":{"kind":{"type":"string"},"url":{"type":"string"}}},"BrandRetrieveColor":{"type":"object","required":["hex"],"properties":{"hex":{"type":"string"},"usage":{"type":"string"},"count":{"type":"integer","format":"int64"}}},"BrandRetrieveResponse":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"object","required":["domain","url"],"properties":{"domain":{"type":"string"},"url":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"favicon":{"type":"string"},"og_image":{"type":"string"},"primary_logo":{"type":"string"},"logos":{"type":"array","items":{"$ref":"#/components/schemas/BrandRetrieveAsset"}},"backdrops":{"type":"array","items":{"$ref":"#/components/schemas/BrandRetrieveAsset"}},"colors":{"type":"array","items":{"$ref":"#/components/schemas/BrandRetrieveColor"}},"fonts":{"type":"array","items":{"type":"string"}},"social_links":{"type":"array","items":{"type":"string"}}}},"meta":{"type":"object","required":["request_id"],"properties":{"request_id":{"type":"string"},"contract_version":{"type":"string"},"generated_at":{"type":"string","format":"date-time"},"availability":{"type":"string"},"detail":{"type":"string"},"missing_fields":{"type":"array","items":{"type":"string"}},"next_cursor":{"type":"string"},"stale":{"type":"boolean"}}}}},"BrandSearchResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"query":{"type":"string"},"count":{"type":"integer"},"matches":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"domain":{"type":"string"},"url":{"type":"string"},"favicon":{"type":"string"},"description":{"type":"string"}},"additionalProperties":false,"required":["domain"]},"nullable":true}},"additionalProperties":false,"required":["query","count","matches"]},"meta":{"$ref":"#/components/schemas/GatewayResponseMeta"}},"additionalProperties":false,"required":["data","meta"]},"BrandStyleguideResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"domain":{"type":"string"},"url":{"type":"string"},"status":{"type":"string"},"mode":{"type":"string"},"colors":{"type":"array","items":{"type":"object","properties":{"role":{"type":"string"},"value":{"type":"string"},"source":{"type":"string"},"count":{"type":"integer"}},"additionalProperties":false,"required":["value","source"]}},"typography":{"type":"array","items":{"type":"object","properties":{"tag":{"type":"string"},"usage":{"type":"string"},"family":{"type":"string"},"size":{"type":"string"},"weight":{"type":"string"},"line_height":{"type":"string"},"source":{"type":"string"}},"additionalProperties":false,"required":["source"]}},"buttons":{"type":"array","items":{"type":"object","properties":{"variant":{"type":"string"},"background":{"type":"string"},"color":{"type":"string"},"border_radius":{"type":"string"},"padding":{"type":"string"},"font_weight":{"type":"string"},"source":{"type":"string"}},"additionalProperties":false,"required":["variant","source"]}},"card":{"type":"object","properties":{"background":{"type":"string"},"border_radius":{"type":"string"},"box_shadow":{"type":"string"},"padding":{"type":"string"},"border":{"type":"string"},"source":{"type":"string"}},"additionalProperties":false,"required":["source"]},"spacing":{"type":"array","items":{"type":"string"}},"shadows":{"type":"array","items":{"type":"string"}},"radii":{"type":"array","items":{"type":"string"}}},"additionalProperties":false,"required":["domain","url","status"]},"meta":{"$ref":"#/components/schemas/GatewayResponseMeta"}},"additionalProperties":false,"required":["data","meta"]},"CreditTopupRequired":{"type":"object","required":["code","balance_micro","price_micro","topup_url"],"properties":{"code":{"type":"string","enum":["topup_required"]},"balance_micro":{"type":"integer"},"price_micro":{"type":"integer"},"topup_url":{"type":"string","format":"uri","description":"Owner billing page for managing prepaid credits."},"message":{"type":"string"},"upgrade":{"type":"object","required":["url","plans","pricing"],"properties":{"url":{"type":"string","format":"uri"},"plans":{"type":"array","items":{"type":"object","required":["id","url"],"properties":{"id":{"type":"string"},"url":{"type":"string","format":"uri"}},"additionalProperties":false}},"pricing":{"type":"string","format":"uri"}},"additionalProperties":false},"next_action":{"type":"object","description":"Typed next step (ADR 0024): only the human can add credits, on the billing page.","required":["action","method","url","required_fields","docs"],"properties":{"action":{"type":"string","enum":["top_up"]},"method":{"type":"string","enum":["GET"]},"url":{"type":"string","format":"uri"},"required_fields":{"type":"array","items":{"type":"string"}},"human_message":{"type":"string"},"docs":{"type":"string","format":"uri"}},"additionalProperties":false}},"additionalProperties":false},"ErrorEnvelope":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"},"retryable":{"type":"boolean"},"reason":{"type":"string"},"continuation":{"$ref":"#/components/schemas/AnonymousContinuation"},"status":{"type":"integer"},"detail":{"type":"string"},"readme":{"type":"string"},"next_action":{"$ref":"#/components/schemas/NextAction"}},"additionalProperties":false,"required":["code","message","request_id"]}},"additionalProperties":false,"required":["error"]},"GatewayResponseMeta":{"type":"object","required":["request_id"],"properties":{"request_id":{"type":"string"},"contract_version":{"type":"string"},"generated_at":{"type":"string","format":"date-time"},"availability":{"type":"string"},"detail":{"type":"string"},"missing_fields":{"type":"array","items":{"type":"string"}},"next_cursor":{"type":"string"},"stale":{"type":"boolean"}},"additionalProperties":false},"JobSearchRecord":{"type":"object","required":["global_id","url","title","company","ats_type","ats_id","location","country_iso","region","lat","lon","is_remote","salary_currency","salary_period","salary_summary","salary_min","salary_max","employment_type","department","team","requisition_id","apply_url","commitment","description","posted_at","language"],"properties":{"global_id":{"type":"string"},"url":{"type":"string","nullable":true},"title":{"type":"string","nullable":true},"company":{"type":"string","nullable":true},"ats_type":{"type":"string","nullable":true},"ats_id":{"type":"string","nullable":true},"location":{"type":"string","nullable":true},"country_iso":{"type":"string","nullable":true},"region":{"type":"string","nullable":true},"lat":{"type":"string","nullable":true},"lon":{"type":"string","nullable":true},"is_remote":{"type":"boolean","nullable":true},"salary_currency":{"type":"string","nullable":true},"salary_period":{"type":"string","nullable":true},"salary_summary":{"type":"string","nullable":true},"salary_min":{"type":"number","nullable":true},"salary_max":{"type":"number","nullable":true},"employment_type":{"type":"string","nullable":true},"department":{"type":"string","nullable":true},"team":{"type":"string","nullable":true},"requisition_id":{"type":"string","nullable":true},"apply_url":{"type":"string","nullable":true},"commitment":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"posted_at":{"type":"string","nullable":true},"language":{"type":"string","nullable":true}},"additionalProperties":false},"JobSearchResponse":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/JobSearchRecord"}},"meta":{"$ref":"#/components/schemas/GatewayResponseMeta"}},"additionalProperties":false},"MarkdownHostError":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","request_id","reason","retryable"],"properties":{"code":{"type":"string","enum":["invalid_request","not_found","method_not_allowed","anonymous_limit_reached","source_excluded","upstream_blocked","upstream_unavailable","degraded","gateway_timeout","internal_error"]},"message":{"type":"string"},"request_id":{"type":"string"},"reason":{"type":"string","description":"Stable machine-readable failure reason; a closed set (values may be added, never renamed or removed).","enum":["empty_target","bad_scheme","malformed_url","target_too_long","target_not_allowed","target_rejected","bad_option","route_disabled","target_not_found","method_not_allowed","daily_limit","publisher_excluded","access_check","target_unreachable","empty_content","content_too_large","provider_unavailable","service_degraded","target_timeout","client_closed","internal_error"]},"retryable":{"type":"boolean","description":"True when sending the identical request again later can succeed without changing anything; it says nothing about how soon."},"status":{"type":"integer","description":"Stable numeric detail code; present only for source_excluded (45101)."},"detail":{"type":"string","description":"Safe caller guidance; present only for source_excluded."},"continuation":{"$ref":"#/components/schemas/AnonymousContinuation"},"next_action":{"$ref":"#/components/schemas/NextAction"}}}}},"MarkdownJsonResponse":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"object","required":["url","title","markdown","metadata","links","images"],"properties":{"url":{"type":"string"},"title":{"type":["string","null"]},"markdown":{"type":"string"},"metadata":{"type":"object","properties":{"title":{"type":["string","null"]},"description":{"type":["string","null"]},"author":{"type":["string","null"]},"image":{"type":["string","null"]},"favicon":{"type":["string","null"]},"language":{"type":["string","null"]},"published_date":{"type":["string","null"]},"site_name":{"type":["string","null"]},"word_count":{"type":["integer","null"]},"url":{"type":["string","null"]}}},"links":{"type":"array","items":{"type":"string"}},"images":{"type":"array","items":{"type":"string"}}}},"meta":{"type":"object","required":["request_id","generated_at"],"properties":{"request_id":{"type":"string"},"generated_at":{"type":"string","format":"date-time","description":"Time the page was fetched (the cached time on a cache hit)."}}}}},"NextAction":{"type":"object","description":"Typed next step for an agent (ADR 0024). Present only where a next step exists; branch on action, never on message text.","required":["action","method","url","required_fields","docs"],"properties":{"action":{"type":"string","enum":["get_api_key","verify_email","resend_code","renew_key","top_up","retry_later"],"description":"Closed set; values may be added, never renamed or removed."},"method":{"type":"string","enum":["GET","POST"]},"url":{"type":"string","format":"uri"},"required_fields":{"type":"array","items":{"type":"string"}},"optional_fields":{"type":"array","items":{"type":"string"}},"human_message":{"type":"string","description":"Short sentence the agent can show its human."},"docs":{"type":"string","format":"uri"},"retry_after_seconds":{"type":"integer","minimum":1,"description":"When the same request may be retried without completing the action."},"auth":{"type":"string","enum":["bearer_api_key"],"description":"Credential the call needs; bearer_api_key means send the same API key as a Bearer token."}},"additionalProperties":false},"RedditResponse":{"type":"object","additionalProperties":true},"RegistryBilling":{"type":"object","required":["metered"],"properties":{"metered":{"type":"boolean"},"credit_cost":{"type":"integer","format":"int64","minimum":0}},"additionalProperties":false},"RegistryData":{"type":"object","required":["schema_version","service","version","documentVersion","documentHash","document","providers","callable_routes","openapi"],"properties":{"schema_version":{"type":"string","enum":["v1"]},"service":{"type":"string"},"version":{"type":"string"},"documentVersion":{"type":"string"},"documentHash":{"type":"string"},"document":{"type":"object","description":"The embedded OpenAPI document served unchanged."},"providers":{"type":"array","items":{"$ref":"#/components/schemas/RegistryProvider"}},"callable_routes":{"type":"array","items":{"$ref":"#/components/schemas/RegistryRoute"}},"openapi":{"$ref":"#/components/schemas/RegistryOpenAPI"}},"additionalProperties":false},"RegistryOpenAPI":{"type":"object","required":["version","document_hash","document"],"properties":{"version":{"type":"string"},"document_hash":{"type":"string"},"document":{"type":"object","description":"The embedded OpenAPI document served unchanged."}},"additionalProperties":false},"RegistryProvider":{"type":"object","required":["slug","name","description","status","routes"],"properties":{"slug":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"status":{"type":"string"},"routes":{"type":"array","items":{"$ref":"#/components/schemas/RegistryRoute"}}},"additionalProperties":false},"RegistryResponse":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/RegistryData"},"meta":{"type":"object","required":["request_id"],"properties":{"request_id":{"type":"string"}},"additionalProperties":true}},"additionalProperties":false},"RegistryRoute":{"type":"object","required":["provider","route","method","status","callable","auth_required","read_only","billing"],"properties":{"provider":{"type":"string"},"operation_id":{"type":"string"},"tag":{"type":"string"},"schema_ref":{"type":"string"},"route":{"type":"string"},"method":{"type":"string","enum":["GET"]},"status":{"type":"string"},"callable":{"type":"boolean"},"auth_required":{"type":"boolean"},"read_only":{"type":"boolean"},"billing":{"$ref":"#/components/schemas/RegistryBilling"}},"additionalProperties":false},"ResearchWorkflowData":{"type":"object","required":["workflow","domain","targets"],"properties":{"workflow":{"type":"string","enum":["company-research","competitor-research"]},"domain":{"type":"string"},"targets":{"type":"array","items":{"$ref":"#/components/schemas/ResearchWorkflowTarget"}}}},"ResearchWorkflowResponse":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/ResearchWorkflowData"},"meta":{"type":"object","additionalProperties":true}}},"ResearchWorkflowTarget":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string"},"brand":{"type":"object","additionalProperties":true,"description":"Real brand-kit retrieve output; omitted when that primitive fails."},"styleguide":{"type":"object","additionalProperties":true},"logo":{"type":"object","additionalProperties":true},"markdown":{"type":"object","properties":{"content":{"type":"string"}}},"errors":{"type":"object","additionalProperties":{"type":"string"},"description":"Per-primitive typed error codes; a failed primitive's output is omitted rather than fabricated."}}},"WebContextBrandResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"url":{"type":"string"},"brand":{"type":"object","properties":{"name":{"type":"string","nullable":true},"logo_url":{"type":"string","nullable":true},"logos":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string"},"url":{"type":"string"}},"additionalProperties":false,"required":["kind","url"]},"nullable":true},"colors":{"type":"array","items":{"type":"object","properties":{"hex":{"type":"string"},"usage":{"type":"string"},"count":{"type":"integer"}},"additionalProperties":false,"required":["hex","usage","count"]},"nullable":true},"fonts":{"type":"array","items":{"type":"string"},"nullable":true},"favicon_url":{"type":"string","nullable":true},"og_image":{"type":"string","nullable":true}},"additionalProperties":false,"required":["name","logo_url","logos","colors","fonts","favicon_url","og_image"]}},"additionalProperties":false,"required":["url","brand"]},"meta":{"$ref":"#/components/schemas/GatewayResponseMeta"}},"additionalProperties":false,"required":["data","meta"]},"WebContextCrawlResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"url":{"type":"string"},"total":{"type":"integer"},"completed":{"type":"integer"},"errors":{"type":"integer"},"pages":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"depth":{"type":"integer"},"title":{"type":"string","nullable":true},"markdown":{"type":"string","nullable":true},"metadata":{"$ref":"#/components/schemas/WebContextMetadata"},"error":{"type":"string"}},"additionalProperties":false,"required":["url","depth","title","markdown","metadata"]}}},"additionalProperties":false,"required":["url","total","completed","errors","pages"]},"meta":{"$ref":"#/components/schemas/GatewayResponseMeta"}},"additionalProperties":false,"required":["data","meta"]},"WebContextMapResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"url":{"type":"string"},"count":{"type":"integer"},"urls":{"type":"array","items":{"type":"string"}}},"additionalProperties":false,"required":["url","count","urls"]},"meta":{"$ref":"#/components/schemas/GatewayResponseMeta"}},"additionalProperties":false,"required":["data","meta"]},"WebContextMetadata":{"type":"object","properties":{"title":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"author":{"type":"string","nullable":true},"image":{"type":"string","nullable":true},"favicon":{"type":"string","nullable":true},"language":{"type":"string","nullable":true},"published_date":{"type":"string","nullable":true},"site_name":{"type":"string","nullable":true},"url":{"type":"string","nullable":true},"word_count":{"type":"integer","nullable":true}},"additionalProperties":false,"required":["title","description","author","image","favicon","language","published_date","site_name","word_count","url"]},"WebContextScrapeResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"url":{"type":"string"},"title":{"type":"string","nullable":true},"markdown":{"type":"string","nullable":true},"metadata":{"$ref":"#/components/schemas/WebContextMetadata"},"links":{"type":"array","items":{"type":"string"}},"images":{"type":"array","items":{"type":"string"}},"truncated":{"type":"boolean"},"markdown_chars":{"type":"integer"}},"additionalProperties":false,"required":["url","title","markdown","metadata","links","images","truncated","markdown_chars"]},"meta":{"$ref":"#/components/schemas/GatewayResponseMeta"}},"additionalProperties":false,"required":["data","meta"]},"WebSearchData":{"type":"object","required":["data","pagination","meta"],"additionalProperties":false,"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WebSearchRecord"}},"pagination":{"$ref":"#/components/schemas/WebSearchPagination"},"meta":{"$ref":"#/components/schemas/WebSearchMeta"}}},"WebSearchMeta":{"type":"object","required":["contract_version","generated_at","source","availability","engines_requested","engines_failed"],"additionalProperties":false,"properties":{"contract_version":{"type":"string","enum":["v2"]},"generated_at":{"type":"string","format":"date-time","description":"When the original upstream result was generated; preserved on cache hits."},"source":{"type":"string","enum":["searxng"]},"availability":{"type":"string","enum":["complete","partial"]},"engines_requested":{"type":"array","items":{"type":"string"}},"engines_failed":{"type":"array","items":{"type":"string"}}}},"WebSearchPagination":{"type":"object","required":["page","next_page","has_more"],"additionalProperties":false,"properties":{"page":{"type":"integer","minimum":1},"next_page":{"type":"integer","nullable":true,"description":"Always null: continuation is never promised."},"has_more":{"type":"boolean","nullable":true,"description":"Always null: continuation is never promised."}}},"WebSearchRecord":{"type":"object","required":["id","platform","rank","title","snippet","domain","url","engines"],"additionalProperties":false,"properties":{"id":{"type":"string","description":"web-search:s_ followed by the lowercase SHA-256 hex of the canonical URL."},"platform":{"type":"string","enum":["web-search"]},"rank":{"type":"integer","minimum":1,"description":"One-based position within the returned page; never a global rank."},"title":{"type":"string","nullable":true},"snippet":{"type":"string","nullable":true},"domain":{"type":"string","nullable":true},"url":{"type":"string","format":"uri"},"engines":{"type":"array","items":{"type":"string"},"description":"Engines that actually returned this record; empty when provenance is unknown."}}},"WebSearchResponse":{"type":"object","required":["data","meta"],"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/WebSearchData"},"meta":{"$ref":"#/components/schemas/GatewayResponseMeta"}}}}},"security":[{"bearerAuth":[]}],"paths":{"/v1/agent/status":{"get":{"operationId":"get_agent_status","tags":["discovery"],"summary":"Get this API key's status","description":"Returns the presented key's own standing: prefix, class, status (restricted, verified, or active), expiry, per-key keyless quota for a restricted key or credit balance otherwise, and next_actions with a human_message. Reading status never consumes quota. Restricted keys can call only the keyless capability set (403 verification_required otherwise) on their own per-key daily buckets (429 restricted_limit_reached when used up).","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Key standing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentStatus"}}}},"401":{"description":"Missing, unknown, expired, or revoked key; error.next_action is get_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/capabilities":{"get":{"operationId":"get_gateway_capabilities","tags":["discovery"],"summary":"Get gateway capabilities","description":"Unauthenticated, read-only discovery of the gateway-wide provider inventory, routes currently callable under their provider manifests, and the embedded OpenAPI document. Callable discovery is a runtime snapshot, not authorization or billing state.","security":[],"responses":{"200":{"description":"Current gateway capability registry.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}},"X-Registry-Schema-Version":{"description":"Version of the registry response envelope.","schema":{"type":"string"}},"X-OpenAPI-Document-Version":{"description":"Version of the embedded OpenAPI document.","schema":{"type":"string"}},"X-OpenAPI-Document-Hash":{"description":"SHA-256 identity of the embedded OpenAPI document.","schema":{"type":"string"}},"ETag":{"description":"Quoted SHA-256 identity of the embedded OpenAPI document.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegistryResponse"}}}},"503":{"description":"Normalized error with code degraded when the embedded document or callable route registry is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/md/{target}":{"servers":[{"url":"https://md.replynodes.com"}],"get":{"operationId":"anonymous_markdown","tags":["markdown"],"summary":"Read a public URL as Markdown","description":"Already-anonymous Markdown gateway route for canonical capability url-to-markdown (dedicated Markdown tier: 100 valid requests per trusted client-IP bucket per UTC calendar day). Admission occurs after method and target/SSRF validation and before cache/upstream work; cache hits and upstream failures consume one unit. X-RateLimit-Limit is the effective fixed tier limit, X-RateLimit-Remaining is the capability bucket balance, and X-RateLimit-Reset is the next UTC midnight Unix timestamp. Redis failure returns 503 degraded. Output format is chosen with request headers because the whole path and query string belong to the target URL: no Accept header, Accept: */*, text/markdown or text/plain returns Markdown (default); Accept: application/json (JSON preferred with q>0) returns the {data, meta} envelope with the same data shape as GET /v1/webcontext/scrape; X-Format: frontmatter returns Markdown preceded by a fixed seven-key YAML front-matter block; an unknown X-Format value, or application/json together with X-Format: frontmatter, returns 400 invalid_request with reason bad_option before any quota is spent. X-Include-Selectors and X-Exclude-Selectors (comma-separated CSS selectors, at most 10 entries and 512 bytes per header, duplicates removed, no control characters or { } ; < >) filter the page; they are part of the cache key; with selectors set, a page that returns an access-check page returns 502 upstream_blocked (no crawl fallback). A page main heading may remain even when it matches an exclude selector. Every error response of this host carries error.reason (a stable value from the closed set in the MarkdownHostError schema) and error.retryable in addition to error.code, error.message and error.request_id. Successful responses set Vary: Accept, X-Format.","security":[],"parameters":[{"name":"target","in":"path","required":true,"schema":{"type":"string","description":"Complete URL or bare public hostname, URL-encoded as needed."}},{"name":"X-Format","in":"header","required":false,"description":"Output format: markdown (default) or frontmatter. Any other value returns 400 invalid_request with reason bad_option. Cannot be combined with Accept: application/json.","schema":{"type":"string","enum":["markdown","frontmatter"]}},{"name":"X-Include-Selectors","in":"header","required":false,"description":"Comma-separated CSS selectors to keep (at most 10 entries, 512 bytes).","schema":{"type":"string","example":"article,.post-body"}},{"name":"X-Exclude-Selectors","in":"header","required":false,"description":"Comma-separated CSS selectors to remove (at most 10 entries, 512 bytes).","schema":{"type":"string","example":"nav,footer,.sidebar"}}],"responses":{"200":{"description":"Markdown by default; JSON envelope when Accept prefers application/json; Markdown with YAML front matter when X-Format is frontmatter. Quota headers are included.","headers":{"Vary":{"schema":{"type":"string","example":"Accept, X-Format"}},"X-Cache":{"schema":{"type":"string","enum":["hit","miss"]}},"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}}},"content":{"text/markdown":{"schema":{"type":"string"}},"application/json":{"schema":{"$ref":"#/components/schemas/MarkdownJsonResponse"}}}},"400":{"description":"Invalid target, unsafe public URL, unknown or conflicting X-Format, or invalid selector headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkdownHostError"}}}},"404":{"description":"Not found: the provider reports the page does not exist (reason target_not_found) or the Markdown route is not enabled on this host (reason route_disabled). Not retryable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkdownHostError"}}}},"405":{"description":"Method not allowed (reason method_not_allowed); Allow: GET, HEAD. Not retryable.","headers":{"Allow":{"schema":{"type":"string","example":"GET, HEAD"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkdownHostError"}}}},"429":{"description":"Anonymous daily quota exhausted. Includes X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, Retry-After, and the typed continuation. On this host the error also carries reason daily_limit and retryable false.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}},"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnonymousQuotaError"}}}},"451":{"description":"Publisher excluded automated access (source_excluded, error.status 45101, reason publisher_excluded, not retryable).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkdownHostError"}}}},"499":{"description":"The client closed the connection before the response was ready (error.code gateway_timeout, reason client_closed, retryable). Logged as 499; nothing is waiting on this response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkdownHostError"}}}},"500":{"description":"Unclassified internal error (reason internal_error, retryable).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkdownHostError"}}}},"502":{"description":"Upstream_blocked (reason access_check) or upstream_unavailable (reasons target_unreachable, empty_content, content_too_large, provider_unavailable).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkdownHostError"}}}},"503":{"description":"Shared Redis, the source-policy registry or quota admission unavailable; request rejected closed (reason service_degraded, retryable).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkdownHostError"}}}},"504":{"description":"The target did not respond within 30 seconds (reason target_timeout, retryable).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkdownHostError"}}}}}}},"/{domain}":{"servers":[{"url":"https://brand.replynodes.com"}],"get":{"operationId":"anonymous_brand","tags":["brand"],"summary":"Read public brand intelligence","description":"Already-anonymous Brand gateway route for canonical capability brand-kit (fixed Tier A: 20 valid requests per trusted client-IP bucket per UTC calendar day). Domain validation occurs before admission; cache hits and upstream failures consume one unit. X-RateLimit-Limit is the effective fixed tier limit, X-RateLimit-Remaining is the capability bucket balance, and X-RateLimit-Reset is the next UTC midnight Unix timestamp.","security":[],"parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9.-]+$"}}],"responses":{"200":{"description":"Brand intelligence response; quota headers are included."},"400":{"description":"Invalid or blocked domain."},"429":{"description":"Anonymous daily quota exhausted; includes typed continuation and standard quota headers.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}},"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnonymousQuotaError"}}}},"503":{"description":"Shared Redis unavailable; request rejected closed."}}}},"/":{"servers":[{"url":"https://pdf.replynodes.com"}],"get":{"operationId":"pdf_document_help","summary":"PDF conversion endpoint help","description":"Documentation-only root GET for the anonymous PDF conversion contract. POST converts a public PDF URL; HEAD returns the same documentation headers. Allowed methods: GET, HEAD, POST. Limits: 10 MiB source/download, 50 pages, 60 seconds, 20 conversions/IP/hour, 2 active conversions/IP, and a maximum encoded JSON response of 1 MiB. MCP discovery identifies the sole read_document tool at https://mcp.replynodes.com/mcp.","tags":["pdf"],"security":[],"responses":{"200":{"description":"Endpoint usage documentation"},"405":{"description":"Method not allowed; Allow: GET, HEAD, POST"}}},"head":{"operationId":"pdf_document_help_head","summary":"PDF conversion endpoint headers","description":"Documentation-only root HEAD for the anonymous PDF conversion contract. POST converts a public PDF URL and GET returns usage documentation. Allowed methods: GET, HEAD, POST. Limits: 10 MiB source/download, 50 pages, 60 seconds, 20 conversions/IP/hour, 2 active conversions/IP, and a maximum encoded JSON response of 1 MiB. MCP discovery identifies the sole read_document tool at https://mcp.replynodes.com/mcp.","tags":["pdf"],"security":[],"responses":{"200":{"description":"Endpoint usage documentation headers"},"405":{"description":"Method not allowed; Allow: GET, HEAD, POST"}}},"post":{"servers":[{"url":"https://pdf.replynodes.com"}],"operationId":"read_document","summary":"Read a public PDF as Markdown for AI agents","description":"Direct public HTTP POST to https://pdf.replynodes.com/ requires no account, API key, or cookie. POST converts one public PDF URL to Markdown. GET and HEAD on the root are documentation-only; allowed methods are GET, HEAD, POST. This PDF to Markdown response is designed for read PDF, PDF for AI agents, extract PDF text, and PDF context workflows. The MCP read_document / tools/call at https://mcp.replynodes.com/mcp requires the existing MCP authorization boundary; MCP is not anonymous. Limits: 10 MiB source/download, 50 pages, 60 seconds, 20 conversions/IP/hour, 2 active conversions/IP, and a maximum encoded JSON response of 1 MiB including the trailing newline. MCP discovery identifies the sole read_document tool at https://mcp.replynodes.com/mcp.","tags":["pdf"],"security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"additionalProperties":false,"properties":{"url":{"type":"string","format":"uri","pattern":"^https?://"}}}}}},"responses":{"200":{"description":"Converted PDF","content":{"application/json":{"schema":{"type":"object","required":["type","mime_type","markdown","metadata"],"properties":{"type":{"const":"document"},"mime_type":{"const":"application/pdf"},"markdown":{"type":"string"},"metadata":{"type":"object","required":["pages"],"properties":{"pages":{"type":"integer","minimum":1},"title":{"type":["string","null"]}}}}}}}},"400":{"description":"Malformed JSON, unknown fields, invalid URL, or unsafe public URL; standard error envelope"},"405":{"description":"Method not allowed; Allow: GET, HEAD, POST; standard error envelope"},"413":{"description":"PDF source/download exceeds 10 MiB or exceeds 50 pages; standard error envelope"},"429":{"description":"Hourly quota or 2-active-conversions-per-IP limit; standard error envelope"},"502":{"description":"Private conversion runtime failed or encoded response would exceed 1 MiB; standard error envelope"},"503":{"description":"Shared Redis or private conversion runtime unavailable; standard error envelope"},"504":{"description":"Conversion exceeded 60 seconds; standard error envelope"}}}},"/v1/youtube/search":{"get":{"operationId":"youtube_search","tags":["youtube"],"parameters":[{"name":"term","in":"query","required":true,"schema":{"type":"string"}},{"name":"language","in":"query","schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":50}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}}}}},"/v1/youtube/video/{id}":{"get":{"operationId":"youtube_video","tags":["youtube"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"language","in":"query","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}}}}},"/v1/youtube/channel/{id}":{"get":{"operationId":"youtube_channel","tags":["youtube"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"language","in":"query","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}}}}},"/v1/youtube/comments/{id}":{"get":{"operationId":"youtube_comments","tags":["youtube"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":50}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}}}}},"/v1/youtube/playlist/{id}":{"get":{"operationId":"youtube_playlist","tags":["youtube"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"language","in":"query","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}}}}},"/v1/youtube/related/{id}":{"get":{"operationId":"youtube_related","tags":["youtube"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"language","in":"query","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}}}}},"/v1/youtube/transcript/{id}":{"get":{"operationId":"youtube_transcript","tags":["youtube"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"language","in":"query","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}}}}},"/fetcher/healthz":{"get":{"summary":"Health check","security":[],"responses":{"200":{"description":"ok"}}}},"/fetcher/readyz":{"get":{"summary":"Readiness (auth/db status)","security":[],"responses":{"200":{"description":"ok","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["ok"]},"checks":{"type":"object","properties":{"backend_authorizer":{"type":"string","enum":["not_configured","reachable"]},"redis":{"type":"string","enum":["not_configured","reachable"]}},"additionalProperties":false,"required":["backend_authorizer","redis"]},"meta":{"$ref":"#/components/schemas/GatewayResponseMeta"}},"additionalProperties":false,"required":["status","checks","meta"]}}}},"503":{"description":"A configured dependency is unreachable.","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["unhealthy"]},"checks":{"type":"object","properties":{"backend_authorizer":{"type":"string","enum":["not_configured","reachable","unreachable"]},"redis":{"type":"string","enum":["not_configured","reachable","unreachable"]}},"additionalProperties":false,"required":["backend_authorizer","redis"]},"meta":{"$ref":"#/components/schemas/GatewayResponseMeta"}},"additionalProperties":false,"required":["status","checks","meta"]}}}}},"operationId":"get_fetcher_readyz"}},"/v1/hackernews/capabilities":{"get":{"summary":"List available operations","security":[],"responses":{"200":{"description":"ok"}}}},"/v1/hackernews/stories_top":{"get":{"operationId":"hackernews_stories_top","summary":"Fetch current Hacker News top stories","description":"Fetch current Hacker News top stories. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["hackernews"],"parameters":[{"name":"limit","in":"query","required":false,"description":"Maximum number of results; values outside 1..100 are rejected.","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"page","in":"query","required":false,"description":"Result page.","schema":{"type":"integer","minimum":1}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/hackernews/stories_new":{"get":{"operationId":"hackernews_stories_new","summary":"Fetch current Hacker News new stories","description":"Fetch current Hacker News new stories. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["hackernews"],"parameters":[{"name":"limit","in":"query","required":false,"description":"Maximum number of results; values outside 1..100 are rejected.","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"page","in":"query","required":false,"description":"Result page.","schema":{"type":"integer","minimum":1}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/hackernews/stories_best":{"get":{"operationId":"hackernews_stories_best","summary":"Fetch current Hacker News best stories","description":"Fetch current Hacker News best stories. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["hackernews"],"parameters":[{"name":"limit","in":"query","required":false,"description":"Maximum number of results; values outside 1..100 are rejected.","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"page","in":"query","required":false,"description":"Result page.","schema":{"type":"integer","minimum":1}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/hackernews/stories_ask":{"get":{"operationId":"hackernews_stories_ask","summary":"Fetch current Ask HN stories","description":"Fetch current Ask HN stories. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["hackernews"],"parameters":[{"name":"limit","in":"query","required":false,"description":"Maximum number of results; values outside 1..100 are rejected.","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"page","in":"query","required":false,"description":"Result page.","schema":{"type":"integer","minimum":1}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/hackernews/stories_show":{"get":{"operationId":"hackernews_stories_show","summary":"Fetch current Show HN stories","description":"Fetch current Show HN stories. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["hackernews"],"parameters":[{"name":"limit","in":"query","required":false,"description":"Maximum number of results; values outside 1..100 are rejected.","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"page","in":"query","required":false,"description":"Result page.","schema":{"type":"integer","minimum":1}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/hackernews/stories_job":{"get":{"operationId":"hackernews_stories_job","summary":"Fetch current Hacker News job postings","description":"Fetch current Hacker News job postings. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["hackernews"],"parameters":[{"name":"limit","in":"query","required":false,"description":"Maximum number of results; values outside 1..100 are rejected.","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"page","in":"query","required":false,"description":"Result page.","schema":{"type":"integer","minimum":1}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/hackernews/search":{"get":{"operationId":"hackernews_search","summary":"Search Hacker News via Algolia","description":"Search Hacker News via Algolia. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["hackernews"],"parameters":[{"name":"q","in":"query","required":true,"description":"Search query.","schema":{"type":"string"}},{"name":"tags","in":"query","required":false,"description":"Algolia HN Search tag filter (e.g. story, comment, ask_hn).","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Maximum number of results; values outside 1..100 are rejected.","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"page","in":"query","required":false,"description":"Result page.","schema":{"type":"integer","minimum":0}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/hackernews/item/{id}":{"get":{"operationId":"hackernews_item","summary":"Fetch a single Hacker News item and its comment tree","description":"Fetch a single Hacker News item and its comment tree. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["hackernews"],"parameters":[{"name":"id","in":"path","required":true,"description":"Hacker News item id.","schema":{"type":"integer"}},{"name":"depth","in":"query","required":false,"description":"Maximum comment-tree depth to resolve; values outside 1..10 are rejected.","schema":{"type":"integer","minimum":1,"maximum":10}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/hackernews/user/{handle}":{"get":{"operationId":"hackernews_user","summary":"Fetch a public Hacker News user profile","description":"Fetch a public Hacker News user profile. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["hackernews"],"parameters":[{"name":"handle","in":"path","required":true,"description":"Hacker News username.","schema":{"type":"string"}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/appstore/app":{"get":{"operationId":"app","summary":"Look up one public App Store application","description":"Look up one public App Store application. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["appstore"],"parameters":[{"name":"id","in":"query","required":false,"description":"Numeric track id; provide this or appId.","schema":{"type":"string"}},{"name":"appId","in":"query","required":false,"description":"Bundle id; provide this or id.","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"lang","in":"query","required":false,"description":"Language code.","schema":{"type":"string"}},{"name":"ratings","in":"query","required":false,"description":"Include ratings information.","schema":{"type":"boolean"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/appstore/list":{"get":{"operationId":"list","summary":"List applications from an iTunes collection","description":"List applications from an iTunes collection. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["appstore"],"parameters":[{"name":"collection","in":"query","required":false,"description":"Provider collection constant.","schema":{"type":"string"}},{"name":"category","in":"query","required":false,"description":"Provider category constant.","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"lang","in":"query","required":false,"description":"Language code.","schema":{"type":"string"}},{"name":"num","in":"query","required":false,"description":"Number of applications; values outside 1..200 are rejected.","schema":{"type":"integer","minimum":1,"maximum":200}},{"name":"fullDetail","in":"query","required":false,"description":"Request detail enrichment.","schema":{"type":"boolean"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/appstore/search":{"get":{"operationId":"search","summary":"Search public App Store applications by term","description":"Search public App Store applications by term. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["appstore"],"parameters":[{"name":"term","in":"query","required":true,"description":"Search term.","schema":{"type":"string"}},{"name":"num","in":"query","required":false,"description":"Number of results; values outside 1..50 are rejected.","schema":{"type":"integer","minimum":1,"maximum":50}},{"name":"page","in":"query","required":false,"description":"Result page.","schema":{"type":"integer","minimum":1,"maximum":200}},{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"lang","in":"query","required":false,"description":"Language code.","schema":{"type":"string"}},{"name":"idsOnly","in":"query","required":false,"description":"Return ids without detail lookups.","schema":{"type":"boolean"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/appstore/developer":{"get":{"operationId":"developer","summary":"List applications by developer","description":"List applications by developer. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["appstore"],"parameters":[{"name":"devId","in":"query","required":true,"description":"public developer identifier.","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"lang","in":"query","required":false,"description":"Language code.","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/appstore/privacy":{"get":{"operationId":"privacy","summary":"Read public App Store privacy details","description":"Read public App Store privacy details. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["appstore"],"parameters":[{"name":"id","in":"query","required":true,"description":"public application identifier.","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/appstore/suggest":{"get":{"operationId":"suggest","summary":"Suggest public App Store search terms","description":"Suggest public App Store search terms. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["appstore"],"parameters":[{"name":"term","in":"query","required":true,"description":"Search term.","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/appstore/similar":{"get":{"operationId":"similar","summary":"List apps related to an application","description":"List apps related to an application. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["appstore"],"parameters":[{"name":"id","in":"query","required":false,"description":"public application identifier; provide this or appId.","schema":{"type":"string"}},{"name":"appId","in":"query","required":false,"description":"Bundle id; provide this or id.","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/appstore/reviews":{"get":{"operationId":"reviews","summary":"Read a page of public app reviews","description":"Read a page of public app reviews. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["appstore"],"parameters":[{"name":"id","in":"query","required":false,"description":"public application identifier; provide this or appId.","schema":{"type":"string"}},{"name":"appId","in":"query","required":false,"description":"Bundle id; provide this or id.","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"Review page; values outside 1..10 are rejected.","schema":{"type":"integer","minimum":1,"maximum":10}},{"name":"sort","in":"query","required":false,"description":"Provider review sort constant.","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/appstore/ratings":{"get":{"operationId":"ratings","summary":"Read public app ratings","description":"Read public app ratings. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["appstore"],"parameters":[{"name":"id","in":"query","required":false,"description":"public application identifier; provide this or appId.","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"appId","in":"query","required":false,"description":"Bundle id; provide this or id.","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/googleplay/app_details/{id}":{"get":{"operationId":"googleplay_app_details","summary":"Fetch a single Google Play app's public detail record","description":"Fetch a single Google Play app's public detail record. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["googleplay"],"parameters":[{"name":"id","in":"path","required":true,"description":"Google Play package id (e.g. com.nike.snkrs).","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Language code.","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/googleplay/search":{"get":{"operationId":"googleplay_search","summary":"Search public Google Play applications by term","description":"Search public Google Play applications by term. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["googleplay"],"parameters":[{"name":"term","in":"query","required":true,"description":"Search term.","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Language code.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Maximum number of results; values outside 1..50 are rejected.","schema":{"type":"integer","minimum":1,"maximum":50}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/googleplay/similar_apps/{id}":{"get":{"operationId":"googleplay_similar_apps","summary":"Fetch apps similar to a given Google Play package","description":"Fetch apps similar to a given Google Play package. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["googleplay"],"parameters":[{"name":"id","in":"path","required":true,"description":"Google Play package id (e.g. com.nike.snkrs).","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Language code.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Maximum number of results; values outside 1..50 are rejected.","schema":{"type":"integer","minimum":1,"maximum":50}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/googleplay/permissions/{id}":{"get":{"operationId":"googleplay_permissions","summary":"Fetch a Google Play app's declared permissions","description":"Fetch a Google Play app's declared permissions. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["googleplay"],"parameters":[{"name":"id","in":"path","required":true,"description":"Google Play package id (e.g. com.nike.snkrs).","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Language code.","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/googleplay/reviews/{id}":{"get":{"operationId":"googleplay_reviews","summary":"Fetch public reviews for a Google Play app","description":"Fetch public reviews for a Google Play app. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["googleplay"],"parameters":[{"name":"id","in":"path","required":true,"description":"Google Play package id (e.g. com.nike.snkrs).","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Language code.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Maximum number of results; values outside 1..50 are rejected.","schema":{"type":"integer","minimum":1,"maximum":50}},{"name":"sort","in":"query","required":false,"description":"Upstream review sort order.","schema":{"type":"integer"}},{"name":"score","in":"query","required":false,"description":"Filter reviews to this star rating (1..5).","schema":{"type":"integer","minimum":1,"maximum":5}},{"name":"next_token","in":"query","required":false,"description":"Pagination token from a previous reviews response.","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/googleplay/developer":{"get":{"operationId":"googleplay_developer","summary":"Fetch public apps published by a Google Play developer","description":"Fetch public apps published by a Google Play developer. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["googleplay"],"parameters":[{"name":"dev_id","in":"query","required":true,"description":"Google Play developer id.","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Language code.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Maximum number of results; values outside 1..50 are rejected.","schema":{"type":"integer","minimum":1,"maximum":50}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/googleplay/categories":{"get":{"operationId":"googleplay_categories","summary":"List available Google Play category identifiers","description":"List available Google Play category identifiers. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["googleplay"],"parameters":[{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Language code.","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/googleplay/category_apps/{category}":{"get":{"operationId":"googleplay_category_apps","summary":"Fetch top public apps in a Google Play category","description":"Fetch top public apps in a Google Play category. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["googleplay"],"parameters":[{"name":"category","in":"path","required":true,"description":"Google Play category identifier (e.g. GAME, SHOPPING).","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Language code.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Maximum number of results; values outside 1..50 are rejected.","schema":{"type":"integer","minimum":1,"maximum":50}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/googleplay/suggest":{"get":{"operationId":"googleplay_suggest","summary":"Fetch Google Play search-term suggestions","description":"Fetch Google Play search-term suggestions. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["googleplay"],"parameters":[{"name":"term","in":"query","required":true,"description":"Search term.","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Language code.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Maximum number of results; values outside 1..50 are rejected.","schema":{"type":"integer","minimum":1,"maximum":50}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/googleplay/availability/{id}":{"get":{"operationId":"googleplay_availability","summary":"Fetch a Google Play app's per-storefront availability","description":"Fetch a Google Play app's per-storefront availability. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["googleplay"],"parameters":[{"name":"id","in":"path","required":true,"description":"Google Play package id (e.g. com.nike.snkrs).","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"countries","in":"query","required":false,"description":"Comma-separated storefront codes.","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Language code.","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/googleplay/data_safety/{id}":{"get":{"operationId":"googleplay_data_safety","summary":"Fetch a Google Play app's declared data-safety disclosure","description":"Fetch a Google Play app's declared data-safety disclosure. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["googleplay"],"parameters":[{"name":"id","in":"path","required":true,"description":"Google Play package id (e.g. com.nike.snkrs).","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Language code.","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/web/search":{"get":{"operationId":"web_search","summary":"Search the public web","description":"Search the public web (English only) through the SearXNG-backed provider contract v2. The response `data` is an array of records (id, platform, one-based page rank, title, snippet, domain, url, engines), `pagination` is `{page, next_page: null, has_more: null}` (continuation is never promised; request another page explicitly), and `meta` carries `contract_version: v2`, `generated_at`, `source: searxng`, `availability` (`complete` or `partial`), `engines_requested` and `engines_failed`. A partial response is still billed as a successful read; a response with no verified engine execution is a 502.","tags":["web_search"],"parameters":[{"name":"q","in":"query","required":true,"description":"Search query text (1..512 bytes, no control characters). Tokens starting with `!`, `:` or `<` are reserved and rejected; ordinary `site:example.com` text is passed through as search syntax, not a guaranteed filter.","schema":{"type":"string","minLength":1,"maxLength":512}},{"name":"language","in":"query","required":false,"description":"Result language. English only: `en-US` (default) or `en-GB`.","schema":{"type":"string","enum":["en-US","en-GB"],"maxLength":16}},{"name":"engines","in":"query","required":false,"description":"Optional comma-separated approved engines (`brave`, `bing`). Omit to use the default primary/fallback chain.","schema":{"type":"string","maxLength":64}},{"name":"page","in":"query","required":false,"description":"Page number. The current engine profile supports pages 1-2 (Brave); higher pages are rejected with 400 invalid_request until more are verified.","schema":{"type":"integer","minimum":1,"maximum":2,"default":1}},{"name":"time_range","in":"query","required":false,"description":"Recency filter. Only `week` is supported by the current engine profile; `day` and `month` are rejected until verified. Not available when the Bing fallback would be needed (page 1 without a time range only).","schema":{"type":"string","enum":["week"]}},{"name":"limit","in":"query","required":false,"description":"Maximum records returned from the merged page (1..50). Truncation only; never an offset or cursor.","schema":{"type":"integer","minimum":1,"maximum":50,"default":10}}],"security":[],"responses":{"200":{"description":"Success response with the v2 web-search payload: data (records), pagination (never promises continuation) and meta (availability complete or partial).","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebSearchResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/webcontext/scrape":{"get":{"operationId":"webcontext_scrape","summary":"Fetch one URL as clean Markdown","description":"Fetch one URL and return clean, main-content Markdown plus normalized metadata, links, and images. Backed by a privately deployed webclaw-server instance; upstream implementation details are never exposed.","tags":["webcontext"],"parameters":[{"name":"url","in":"query","required":true,"description":"Target URL to fetch. Rejected if it is malformed, uses a disallowed scheme, or resolves to a private/loopback/link-local/cloud-metadata address.","schema":{"type":"string","format":"uri"}},{"name":"include_selectors","in":"query","required":false,"description":"Comma-separated CSS selectors to include (e.g. \"article,.content\").","schema":{"type":"string"}},{"name":"exclude_selectors","in":"query","required":false,"description":"Comma-separated CSS selectors to exclude (e.g. \"nav,.sidebar,footer\").","schema":{"type":"string"}},{"name":"max_chars","in":"query","required":false,"description":"Maximum number of Unicode code points of Markdown to return (1-1048576). A longer page is cut at the last line break (or whitespace) in the second half of the budget; data.truncated is true and data.markdown_chars is the full length. Links and images are still listed from the full page. Priced the same with or without max_chars. A non-integer or out-of-range value is rejected with 400 invalid_request.","schema":{"type":"integer","minimum":1,"maximum":1048576}}],"security":[],"responses":{"200":{"description":"Success response.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebContextScrapeResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/webcontext/crawl":{"get":{"operationId":"webcontext_crawl","summary":"Crawl same-origin links from a URL","description":"Crawl same-origin links starting from a URL and return normalized page results. max_pages/max_depth are clamped server-side regardless of the requested value.","tags":["webcontext"],"parameters":[{"name":"url","in":"query","required":true,"description":"Target URL to fetch. Rejected if it is malformed, uses a disallowed scheme, or resolves to a private/loopback/link-local/cloud-metadata address.","schema":{"type":"string","format":"uri"}},{"name":"max_pages","in":"query","required":false,"description":"Maximum pages to crawl; clamped to 1..50.","schema":{"type":"integer","minimum":1,"maximum":50}},{"name":"max_depth","in":"query","required":false,"description":"Maximum link depth; clamped to 1..3.","schema":{"type":"integer","minimum":1,"maximum":3}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success response.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebContextCrawlResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/webcontext/map":{"get":{"operationId":"webcontext_map","summary":"Discover URLs belonging to a site","description":"Discover URLs belonging to a site without extracting page content. Results are deduplicated.","tags":["webcontext"],"parameters":[{"name":"url","in":"query","required":true,"description":"Target URL to fetch. Rejected if it is malformed, uses a disallowed scheme, or resolves to a private/loopback/link-local/cloud-metadata address.","schema":{"type":"string","format":"uri"}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success response.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebContextMapResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/webcontext/brand":{"get":{"operationId":"webcontext_brand","summary":"Extract public brand identity for a site","description":"Lightweight brand snapshot for one site URL: logos, colors, fonts, and basic public metadata. Prefer brand_retrieve for a fuller normalized brand profile or brand_search for fuzzy company-name discovery.","tags":["webcontext"],"parameters":[{"name":"url","in":"query","required":true,"description":"Target URL to fetch. Rejected if it is malformed, uses a disallowed scheme, or resolves to a private/loopback/link-local/cloud-metadata address.","schema":{"type":"string","format":"uri"}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success response.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebContextBrandResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/brand/retrieve":{"get":{"operationId":"brand_retrieve","summary":"Retrieve Brand","description":"Resolve the full brand profile of a company by domain, or extract brand details from one specific page URL: name, description, primary logo, logos, colors, fonts, social links, favicon, and og_image.","tags":["brand"],"parameters":[{"name":"domain","in":"query","required":false,"description":"Company domain to resolve, e.g. apple.com. One of domain or url is required.","schema":{"type":"string"}},{"name":"url","in":"query","required":false,"description":"One specific page URL to extract brand details from instead of the whole domain.","schema":{"type":"string","format":"uri"}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success response.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandRetrieveResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/brand/search":{"get":{"operationId":"brand_search","summary":"Search Brand","description":"Fuzzy brand or company search by name or domain; returns up to 10 lightweight matches with domain, name, and logo.","tags":["brand"],"parameters":[{"name":"query","in":"query","required":true,"description":"Brand name or domain to search for.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Maximum number of matches to return (default and maximum 10).","schema":{"type":"integer","minimum":1,"maximum":10}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success response.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandSearchResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/brand/styleguide":{"get":{"operationId":"brand_styleguide","summary":"Get Styleguide","description":"Extract the design system of a website by domain or URL: colors, typography, spacing, and more.","tags":["brand"],"parameters":[{"name":"domain","in":"query","required":false,"description":"Website domain to extract a styleguide from, e.g. replynodes.com. One of domain or url is required.","schema":{"type":"string"}},{"name":"url","in":"query","required":false,"description":"One specific page URL to extract a styleguide from instead of the whole domain.","schema":{"type":"string","format":"uri"}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success response.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandStyleguideResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/brand/fonts":{"get":{"operationId":"brand_fonts","summary":"Get Fonts","description":"Extract the typography and font stack of a website by domain or URL.","tags":["brand"],"parameters":[{"name":"domain","in":"query","required":false,"description":"Website domain to extract font information from, e.g. replynodes.com. One of domain or url is required.","schema":{"type":"string"}},{"name":"url","in":"query","required":false,"description":"One specific page URL to extract font information from instead of the whole domain.","schema":{"type":"string","format":"uri"}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success response.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandFontsResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/brand/logo":{"get":{"operationId":"brand_logo","summary":"Get Brand Logo","description":"Fetch the brand logo kit for one company domain: primary logo URL, candidate logo variants, favicon, and og_image.","tags":["brand"],"parameters":[{"name":"domain","in":"query","required":true,"description":"Company domain to resolve, e.g. stripe.com. A bare domain only: no scheme, port, path, or credentials.","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandLogoResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/company-research":{"get":{"operationId":"anonymous_company_research","tags":["research"],"summary":"Run the anonymous company-research workflow","description":"Top-level anonymous company-research workflow for canonical capability company-research (fixed Tier C: 3 valid requests per trusted client-IP bucket per UTC calendar day). A valid request is admitted once, before the read-only server-side fan-out; the url-to-markdown, brand-kit, and brand-logo primitives composed inside the workflow are server-owned and never charged a second anonymous bucket. Malformed input is rejected before admission; admitted provider failures consume one unit. X-RateLimit-Limit is 3, X-RateLimit-Remaining is the Tier C bucket balance, and X-RateLimit-Reset is the next UTC midnight Unix timestamp. Redis failure returns 503 degraded.","security":[],"parameters":[{"name":"domain","in":"query","required":true,"schema":{"type":"string","description":"Company domain, e.g. stripe.com. A bare public hostname only: no scheme, port, path, or credentials."}}],"responses":{"200":{"description":"Composed read-only research dossier; quota headers are included.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResearchWorkflowResponse"}}}},"400":{"description":"Invalid or blocked domain."},"429":{"description":"Anonymous daily quota exhausted. Includes X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, Retry-After, and the typed continuation.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}},"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnonymousQuotaError"}}}},"502":{"description":"Normalized error with code upstream_unavailable when every primitive read fails."},"503":{"description":"Shared Redis unavailable; request rejected closed."}}}},"/v1/competitor-research":{"get":{"operationId":"anonymous_competitor_research","tags":["research"],"summary":"Run the anonymous competitor-research workflow","description":"Top-level anonymous competitor-research workflow for canonical capability competitor-research (fixed Tier C: 3 valid requests per trusted client-IP bucket per UTC calendar day). One admitted request fans out read-only to the company domain plus up to 5 competitor domains; the whole composition is charged once and primitives are never charged a second anonymous bucket. Malformed input (missing/invalid domain, empty/invalid/oversized competitor list) is rejected before admission. See /v1/company-research for the shared quota-header contract.","security":[],"parameters":[{"name":"domain","in":"query","required":true,"schema":{"type":"string","description":"Company domain, e.g. stripe.com."}},{"name":"competitors","in":"query","required":true,"schema":{"type":"string","description":"Comma-separated competitor domains (1..5), e.g. netlify.com,cloudflare.com."}}],"responses":{"200":{"description":"Composed read-only research dossier with one entry per target; quota headers are included.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResearchWorkflowResponse"}}}},"400":{"description":"Invalid or blocked domain, or an empty/invalid/oversized competitor list."},"429":{"description":"Anonymous daily quota exhausted. Includes X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, Retry-After, and the typed continuation.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}},"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnonymousQuotaError"}}}},"502":{"description":"Normalized error with code upstream_unavailable when every primitive read fails."},"503":{"description":"Shared Redis unavailable; request rejected closed."}}}},"/v1/reddit/search_posts":{"get":{"operationId":"search_posts","tags":["reddit"],"parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string"}},{"name":"sort","in":"query","schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100}}],"security":[],"responses":{"200":{"description":"Normalized read-only provider response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditResponse"}}}}}}},"/v1/reddit/subreddit_posts/{subreddit}":{"get":{"operationId":"subreddit_posts","tags":["reddit"],"parameters":[{"name":"subreddit","in":"path","required":true,"schema":{"type":"string"}},{"name":"category","in":"query","schema":{"type":"string"}},{"name":"time_filter","in":"query","schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100}}],"security":[],"responses":{"200":{"description":"Normalized read-only provider response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditResponse"}}}}}}},"/v1/reddit/post_by_id/{id}":{"get":{"operationId":"post_by_id","tags":["reddit"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Normalized read-only provider response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditResponse"}}}}}}},"/v1/reddit/post_by_permalink":{"get":{"operationId":"post_by_permalink","tags":["reddit"],"parameters":[{"name":"permalink","in":"query","required":true,"schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Normalized read-only provider response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditResponse"}}}}}}},"/v1/reddit/user_activity/{username}":{"get":{"operationId":"user_activity","tags":["reddit"],"parameters":[{"name":"username","in":"path","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100}}],"security":[],"responses":{"200":{"description":"Normalized read-only provider response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditResponse"}}}}}}},"/v1/reddit/user_posts/{username}":{"get":{"operationId":"user_posts","tags":["reddit"],"parameters":[{"name":"username","in":"path","required":true,"schema":{"type":"string"}},{"name":"category","in":"query","schema":{"type":"string"}},{"name":"time_filter","in":"query","schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100}}],"security":[],"responses":{"200":{"description":"Normalized read-only provider response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditResponse"}}}}}}},"/v1/jobs/search":{"get":{"operationId":"job_search","summary":"Search Ashby job listings","description":"Search the hash-verified Ashby snapshot using literal filters and source order. Returns up to 10 jobs with the raw provider field omitted. A fresh successful logical search costs 10 credits, including an empty result; errors cost none. Same-identity calls replay the original response while its terminal snapshot is available. Without X-Idempotency-Key, identity is the canonical endpoint and query, so repeating an identical request replays it; send a new X-Idempotency-Key for a fresh logical search.","tags":["jobs"],"parameters":[{"name":"query","in":"query","required":false,"description":"Case-insensitive literal substring of the title; empty is a no-op.","schema":{"type":"string"}},{"name":"location","in":"query","required":false,"description":"Case-insensitive literal substring of location; empty is a no-op.","schema":{"type":"string"}},{"name":"company","in":"query","required":false,"description":"Case-insensitive literal substring of company; empty is a no-op.","schema":{"type":"string"}},{"name":"ats","in":"query","required":false,"description":"Ashby only; omitted or ashby selects the Ashby snapshot.","schema":{"type":"string"}},{"name":"remote","in":"query","required":false,"description":"Filter remote state. false matches only explicitly false rows.","schema":{"type":"boolean"}},{"name":"salary_min","in":"query","required":false,"description":"Minimum salary compared with each row salary_max.","schema":{"type":"number"}},{"name":"salary_max","in":"query","required":false,"description":"Maximum salary compared with each row salary_min.","schema":{"type":"number"}},{"name":"experience_max","in":"query","required":false,"description":"Unsupported because the Ashby snapshot has no experience field; any presence is rejected.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Maximum rows, in source order. Defaults to 10; allowed range is 1 through 10.","schema":{"type":"integer","minimum":1,"maximum":10,"default":10}},{"name":"X-Idempotency-Key","in":"header","required":false,"description":"Optional caller-supplied identity for a fresh logical search. Reusing the same key and query replays its terminal response; send a new key to request a fresh search.","schema":{"type":"string"}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful Ashby search. Each successful fresh logical search costs 10 credits, including an empty result.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobSearchResponse"}}}},"400":{"description":"Invalid or unsupported search input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"X-Request-Id":{"description":"Correlation identifier returned by the gateway.","schema":{"type":"string"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"X-Request-Id":{"description":"Correlation identifier returned by the gateway.","schema":{"type":"string"}}}},"402":{"description":"Prepaid credit balance is insufficient.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditTopupRequired"}}},"headers":{"X-Request-Id":{"description":"Correlation identifier returned by the gateway.","schema":{"type":"string"}}}},"409":{"description":"The same logical search is in progress or its terminal response snapshot is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"X-Request-Id":{"description":"Correlation identifier returned by the gateway.","schema":{"type":"string"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the rate-limit window resets.","schema":{"type":"integer","minimum":1}},"X-Request-Id":{"description":"Correlation identifier returned by the gateway.","schema":{"type":"string"}}}},"500":{"description":"Gateway error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"X-Request-Id":{"description":"Correlation identifier returned by the gateway.","schema":{"type":"string"}}}},"502":{"description":"Job database or provider error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"X-Request-Id":{"description":"Correlation identifier returned by the gateway.","schema":{"type":"string"}}}},"503":{"description":"Billing or service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"X-Request-Id":{"description":"Correlation identifier returned by the gateway.","schema":{"type":"string"}}}},"504":{"description":"Search timed out.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"X-Request-Id":{"description":"Correlation identifier returned by the gateway.","schema":{"type":"string"}}}}}}}}},"providers":[{"slug":"appstore","name":"appstore","description":"Runtime-registered read provider.","status":"available","routes":[{"provider":"appstore","operation_id":"app","tag":"appstore","schema_ref":"#/components/schemas/AppResponse","route":"/v1/appstore/app","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"appstore","operation_id":"developer","tag":"appstore","schema_ref":"#/components/schemas/AppResponse","route":"/v1/appstore/developer","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"appstore","operation_id":"list","tag":"appstore","schema_ref":"#/components/schemas/AppResponse","route":"/v1/appstore/list","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"appstore","operation_id":"privacy","tag":"appstore","schema_ref":"#/components/schemas/AppResponse","route":"/v1/appstore/privacy","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"appstore","operation_id":"ratings","tag":"appstore","schema_ref":"#/components/schemas/AppResponse","route":"/v1/appstore/ratings","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"appstore","operation_id":"reviews","tag":"appstore","schema_ref":"#/components/schemas/AppResponse","route":"/v1/appstore/reviews","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"appstore","operation_id":"search","tag":"appstore","schema_ref":"#/components/schemas/AppResponse","route":"/v1/appstore/search","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"appstore","operation_id":"similar","tag":"appstore","schema_ref":"#/components/schemas/AppResponse","route":"/v1/appstore/similar","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"appstore","operation_id":"suggest","tag":"appstore","schema_ref":"#/components/schemas/AppResponse","route":"/v1/appstore/suggest","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}}]},{"slug":"brand","name":"brand","description":"Runtime-registered read provider.","status":"available","routes":[{"provider":"brand","operation_id":"brand_fonts","tag":"brand","schema_ref":"#/components/schemas/BrandFontsResponse","route":"/v1/brand/fonts","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":5}},{"provider":"brand","operation_id":"brand_logo","tag":"brand","schema_ref":"#/components/schemas/BrandLogoResponse","route":"/v1/brand/logo","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":5}},{"provider":"brand","operation_id":"brand_retrieve","tag":"brand","schema_ref":"#/components/schemas/BrandRetrieveResponse","route":"/v1/brand/retrieve","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":5}},{"provider":"brand","operation_id":"brand_search","tag":"brand","schema_ref":"#/components/schemas/BrandSearchResponse","route":"/v1/brand/search","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":2}},{"provider":"brand","operation_id":"brand_styleguide","tag":"brand","schema_ref":"#/components/schemas/BrandStyleguideResponse","route":"/v1/brand/styleguide","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":8}}]},{"slug":"googleplay","name":"googleplay","description":"Runtime-registered read provider.","status":"available","routes":[{"provider":"googleplay","operation_id":"googleplay_app_details","tag":"googleplay","schema_ref":"#/components/schemas/AppResponse","route":"/v1/googleplay/app_details/{id}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"googleplay","operation_id":"googleplay_availability","tag":"googleplay","schema_ref":"#/components/schemas/AppResponse","route":"/v1/googleplay/availability/{id}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"googleplay","operation_id":"googleplay_categories","tag":"googleplay","schema_ref":"#/components/schemas/AppResponse","route":"/v1/googleplay/categories","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"googleplay","operation_id":"googleplay_category_apps","tag":"googleplay","schema_ref":"#/components/schemas/AppResponse","route":"/v1/googleplay/category_apps/{category}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"googleplay","operation_id":"googleplay_data_safety","tag":"googleplay","schema_ref":"#/components/schemas/AppResponse","route":"/v1/googleplay/data_safety/{id}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"googleplay","operation_id":"googleplay_developer","tag":"googleplay","schema_ref":"#/components/schemas/AppResponse","route":"/v1/googleplay/developer","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"googleplay","operation_id":"googleplay_permissions","tag":"googleplay","schema_ref":"#/components/schemas/AppResponse","route":"/v1/googleplay/permissions/{id}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"googleplay","operation_id":"googleplay_reviews","tag":"googleplay","schema_ref":"#/components/schemas/AppResponse","route":"/v1/googleplay/reviews/{id}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"googleplay","operation_id":"googleplay_search","tag":"googleplay","schema_ref":"#/components/schemas/AppResponse","route":"/v1/googleplay/search","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"googleplay","operation_id":"googleplay_similar_apps","tag":"googleplay","schema_ref":"#/components/schemas/AppResponse","route":"/v1/googleplay/similar_apps/{id}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"googleplay","operation_id":"googleplay_suggest","tag":"googleplay","schema_ref":"#/components/schemas/AppResponse","route":"/v1/googleplay/suggest","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}}]},{"slug":"hackernews","name":"hackernews","description":"Runtime-registered read provider.","status":"available","routes":[{"provider":"hackernews","operation_id":"hackernews_item","tag":"hackernews","schema_ref":"#/components/schemas/AppResponse","route":"/v1/hackernews/item/{id}","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"hackernews","operation_id":"hackernews_search","tag":"hackernews","schema_ref":"#/components/schemas/AppResponse","route":"/v1/hackernews/search","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"hackernews","operation_id":"hackernews_stories_ask","tag":"hackernews","schema_ref":"#/components/schemas/AppResponse","route":"/v1/hackernews/stories_ask","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"hackernews","operation_id":"hackernews_stories_best","tag":"hackernews","schema_ref":"#/components/schemas/AppResponse","route":"/v1/hackernews/stories_best","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"hackernews","operation_id":"hackernews_stories_job","tag":"hackernews","schema_ref":"#/components/schemas/AppResponse","route":"/v1/hackernews/stories_job","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"hackernews","operation_id":"hackernews_stories_new","tag":"hackernews","schema_ref":"#/components/schemas/AppResponse","route":"/v1/hackernews/stories_new","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"hackernews","operation_id":"hackernews_stories_show","tag":"hackernews","schema_ref":"#/components/schemas/AppResponse","route":"/v1/hackernews/stories_show","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"hackernews","operation_id":"hackernews_stories_top","tag":"hackernews","schema_ref":"#/components/schemas/AppResponse","route":"/v1/hackernews/stories_top","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"hackernews","operation_id":"hackernews_user","tag":"hackernews","schema_ref":"#/components/schemas/AppResponse","route":"/v1/hackernews/user/{handle}","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":3}}]},{"slug":"jobs","name":"jobs","description":"Runtime-registered read provider.","status":"available","routes":[{"provider":"jobs","operation_id":"job_search","tag":"jobs","schema_ref":"#/components/schemas/JobSearchResponse","route":"/v1/jobs/search","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":10}}]},{"slug":"reddit","name":"reddit","description":"Runtime-registered read provider.","status":"available","routes":[{"provider":"reddit","operation_id":"post_by_id","tag":"reddit","schema_ref":"#/components/schemas/RedditResponse","route":"/v1/reddit/post_by_id/{id}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":2}},{"provider":"reddit","operation_id":"post_by_permalink","tag":"reddit","schema_ref":"#/components/schemas/RedditResponse","route":"/v1/reddit/post_by_permalink","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":2}},{"provider":"reddit","operation_id":"search_posts","tag":"reddit","schema_ref":"#/components/schemas/RedditResponse","route":"/v1/reddit/search_posts","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":2}},{"provider":"reddit","operation_id":"subreddit_posts","tag":"reddit","schema_ref":"#/components/schemas/RedditResponse","route":"/v1/reddit/subreddit_posts/{subreddit}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":2}},{"provider":"reddit","operation_id":"user_activity","tag":"reddit","schema_ref":"#/components/schemas/RedditResponse","route":"/v1/reddit/user_activity/{username}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":2}},{"provider":"reddit","operation_id":"user_posts","tag":"reddit","schema_ref":"#/components/schemas/RedditResponse","route":"/v1/reddit/user_posts/{username}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":2}}]},{"slug":"web_search","name":"web_search","description":"Runtime-registered read provider.","status":"available","routes":[{"provider":"web_search","operation_id":"web_search","tag":"web_search","schema_ref":"#/components/schemas/WebSearchResponse","route":"/v1/web/search","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":10}}]},{"slug":"webcontext","name":"webcontext","description":"Runtime-registered read provider.","status":"available","routes":[{"provider":"webcontext","operation_id":"webcontext_brand","tag":"webcontext","schema_ref":"#/components/schemas/WebContextBrandResponse","route":"/v1/webcontext/brand","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":5}},{"provider":"webcontext","operation_id":"webcontext_crawl","tag":"webcontext","schema_ref":"#/components/schemas/WebContextCrawlResponse","route":"/v1/webcontext/crawl","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":15}},{"provider":"webcontext","operation_id":"webcontext_map","tag":"webcontext","schema_ref":"#/components/schemas/WebContextMapResponse","route":"/v1/webcontext/map","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":5}},{"provider":"webcontext","operation_id":"webcontext_scrape","tag":"webcontext","schema_ref":"#/components/schemas/WebContextScrapeResponse","route":"/v1/webcontext/scrape","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}}]},{"slug":"youtube","name":"youtube","description":"Runtime-registered read provider.","status":"available","routes":[{"provider":"youtube","operation_id":"youtube_channel","tag":"youtube","schema_ref":"#/components/schemas/AppResponse","route":"/v1/youtube/channel/{id}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"youtube","operation_id":"youtube_comments","tag":"youtube","schema_ref":"#/components/schemas/AppResponse","route":"/v1/youtube/comments/{id}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"youtube","operation_id":"youtube_playlist","tag":"youtube","schema_ref":"#/components/schemas/AppResponse","route":"/v1/youtube/playlist/{id}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"youtube","operation_id":"youtube_related","tag":"youtube","schema_ref":"#/components/schemas/AppResponse","route":"/v1/youtube/related/{id}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"youtube","operation_id":"youtube_search","tag":"youtube","schema_ref":"#/components/schemas/AppResponse","route":"/v1/youtube/search","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"youtube","operation_id":"youtube_transcript","tag":"youtube","schema_ref":"#/components/schemas/AppResponse","route":"/v1/youtube/transcript/{id}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"youtube","operation_id":"youtube_video","tag":"youtube","schema_ref":"#/components/schemas/AppResponse","route":"/v1/youtube/video/{id}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}}]}],"callable_routes":[{"provider":"appstore","operation_id":"app","tag":"appstore","schema_ref":"#/components/schemas/AppResponse","route":"/v1/appstore/app","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"appstore","operation_id":"developer","tag":"appstore","schema_ref":"#/components/schemas/AppResponse","route":"/v1/appstore/developer","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"appstore","operation_id":"list","tag":"appstore","schema_ref":"#/components/schemas/AppResponse","route":"/v1/appstore/list","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"appstore","operation_id":"privacy","tag":"appstore","schema_ref":"#/components/schemas/AppResponse","route":"/v1/appstore/privacy","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"appstore","operation_id":"ratings","tag":"appstore","schema_ref":"#/components/schemas/AppResponse","route":"/v1/appstore/ratings","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"appstore","operation_id":"reviews","tag":"appstore","schema_ref":"#/components/schemas/AppResponse","route":"/v1/appstore/reviews","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"appstore","operation_id":"search","tag":"appstore","schema_ref":"#/components/schemas/AppResponse","route":"/v1/appstore/search","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"appstore","operation_id":"similar","tag":"appstore","schema_ref":"#/components/schemas/AppResponse","route":"/v1/appstore/similar","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"appstore","operation_id":"suggest","tag":"appstore","schema_ref":"#/components/schemas/AppResponse","route":"/v1/appstore/suggest","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"brand","operation_id":"brand_fonts","tag":"brand","schema_ref":"#/components/schemas/BrandFontsResponse","route":"/v1/brand/fonts","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":5}},{"provider":"brand","operation_id":"brand_logo","tag":"brand","schema_ref":"#/components/schemas/BrandLogoResponse","route":"/v1/brand/logo","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":5}},{"provider":"brand","operation_id":"brand_retrieve","tag":"brand","schema_ref":"#/components/schemas/BrandRetrieveResponse","route":"/v1/brand/retrieve","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":5}},{"provider":"brand","operation_id":"brand_search","tag":"brand","schema_ref":"#/components/schemas/BrandSearchResponse","route":"/v1/brand/search","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":2}},{"provider":"brand","operation_id":"brand_styleguide","tag":"brand","schema_ref":"#/components/schemas/BrandStyleguideResponse","route":"/v1/brand/styleguide","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":8}},{"provider":"googleplay","operation_id":"googleplay_app_details","tag":"googleplay","schema_ref":"#/components/schemas/AppResponse","route":"/v1/googleplay/app_details/{id}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"googleplay","operation_id":"googleplay_availability","tag":"googleplay","schema_ref":"#/components/schemas/AppResponse","route":"/v1/googleplay/availability/{id}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"googleplay","operation_id":"googleplay_categories","tag":"googleplay","schema_ref":"#/components/schemas/AppResponse","route":"/v1/googleplay/categories","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"googleplay","operation_id":"googleplay_category_apps","tag":"googleplay","schema_ref":"#/components/schemas/AppResponse","route":"/v1/googleplay/category_apps/{category}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"googleplay","operation_id":"googleplay_data_safety","tag":"googleplay","schema_ref":"#/components/schemas/AppResponse","route":"/v1/googleplay/data_safety/{id}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"googleplay","operation_id":"googleplay_developer","tag":"googleplay","schema_ref":"#/components/schemas/AppResponse","route":"/v1/googleplay/developer","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"googleplay","operation_id":"googleplay_permissions","tag":"googleplay","schema_ref":"#/components/schemas/AppResponse","route":"/v1/googleplay/permissions/{id}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"googleplay","operation_id":"googleplay_reviews","tag":"googleplay","schema_ref":"#/components/schemas/AppResponse","route":"/v1/googleplay/reviews/{id}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"googleplay","operation_id":"googleplay_search","tag":"googleplay","schema_ref":"#/components/schemas/AppResponse","route":"/v1/googleplay/search","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"googleplay","operation_id":"googleplay_similar_apps","tag":"googleplay","schema_ref":"#/components/schemas/AppResponse","route":"/v1/googleplay/similar_apps/{id}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"googleplay","operation_id":"googleplay_suggest","tag":"googleplay","schema_ref":"#/components/schemas/AppResponse","route":"/v1/googleplay/suggest","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"hackernews","operation_id":"hackernews_item","tag":"hackernews","schema_ref":"#/components/schemas/AppResponse","route":"/v1/hackernews/item/{id}","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"hackernews","operation_id":"hackernews_search","tag":"hackernews","schema_ref":"#/components/schemas/AppResponse","route":"/v1/hackernews/search","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"hackernews","operation_id":"hackernews_stories_ask","tag":"hackernews","schema_ref":"#/components/schemas/AppResponse","route":"/v1/hackernews/stories_ask","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"hackernews","operation_id":"hackernews_stories_best","tag":"hackernews","schema_ref":"#/components/schemas/AppResponse","route":"/v1/hackernews/stories_best","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"hackernews","operation_id":"hackernews_stories_job","tag":"hackernews","schema_ref":"#/components/schemas/AppResponse","route":"/v1/hackernews/stories_job","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"hackernews","operation_id":"hackernews_stories_new","tag":"hackernews","schema_ref":"#/components/schemas/AppResponse","route":"/v1/hackernews/stories_new","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"hackernews","operation_id":"hackernews_stories_show","tag":"hackernews","schema_ref":"#/components/schemas/AppResponse","route":"/v1/hackernews/stories_show","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"hackernews","operation_id":"hackernews_stories_top","tag":"hackernews","schema_ref":"#/components/schemas/AppResponse","route":"/v1/hackernews/stories_top","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"hackernews","operation_id":"hackernews_user","tag":"hackernews","schema_ref":"#/components/schemas/AppResponse","route":"/v1/hackernews/user/{handle}","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"jobs","operation_id":"job_search","tag":"jobs","schema_ref":"#/components/schemas/JobSearchResponse","route":"/v1/jobs/search","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":10}},{"provider":"reddit","operation_id":"post_by_id","tag":"reddit","schema_ref":"#/components/schemas/RedditResponse","route":"/v1/reddit/post_by_id/{id}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":2}},{"provider":"reddit","operation_id":"post_by_permalink","tag":"reddit","schema_ref":"#/components/schemas/RedditResponse","route":"/v1/reddit/post_by_permalink","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":2}},{"provider":"reddit","operation_id":"search_posts","tag":"reddit","schema_ref":"#/components/schemas/RedditResponse","route":"/v1/reddit/search_posts","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":2}},{"provider":"reddit","operation_id":"subreddit_posts","tag":"reddit","schema_ref":"#/components/schemas/RedditResponse","route":"/v1/reddit/subreddit_posts/{subreddit}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":2}},{"provider":"reddit","operation_id":"user_activity","tag":"reddit","schema_ref":"#/components/schemas/RedditResponse","route":"/v1/reddit/user_activity/{username}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":2}},{"provider":"reddit","operation_id":"user_posts","tag":"reddit","schema_ref":"#/components/schemas/RedditResponse","route":"/v1/reddit/user_posts/{username}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":2}},{"provider":"web_search","operation_id":"web_search","tag":"web_search","schema_ref":"#/components/schemas/WebSearchResponse","route":"/v1/web/search","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":10}},{"provider":"webcontext","operation_id":"webcontext_brand","tag":"webcontext","schema_ref":"#/components/schemas/WebContextBrandResponse","route":"/v1/webcontext/brand","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":5}},{"provider":"webcontext","operation_id":"webcontext_crawl","tag":"webcontext","schema_ref":"#/components/schemas/WebContextCrawlResponse","route":"/v1/webcontext/crawl","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":15}},{"provider":"webcontext","operation_id":"webcontext_map","tag":"webcontext","schema_ref":"#/components/schemas/WebContextMapResponse","route":"/v1/webcontext/map","method":"GET","status":"available","callable":true,"auth_required":true,"read_only":true,"billing":{"metered":true,"credit_cost":5}},{"provider":"webcontext","operation_id":"webcontext_scrape","tag":"webcontext","schema_ref":"#/components/schemas/WebContextScrapeResponse","route":"/v1/webcontext/scrape","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"youtube","operation_id":"youtube_channel","tag":"youtube","schema_ref":"#/components/schemas/AppResponse","route":"/v1/youtube/channel/{id}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"youtube","operation_id":"youtube_comments","tag":"youtube","schema_ref":"#/components/schemas/AppResponse","route":"/v1/youtube/comments/{id}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"youtube","operation_id":"youtube_playlist","tag":"youtube","schema_ref":"#/components/schemas/AppResponse","route":"/v1/youtube/playlist/{id}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"youtube","operation_id":"youtube_related","tag":"youtube","schema_ref":"#/components/schemas/AppResponse","route":"/v1/youtube/related/{id}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"youtube","operation_id":"youtube_search","tag":"youtube","schema_ref":"#/components/schemas/AppResponse","route":"/v1/youtube/search","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"youtube","operation_id":"youtube_transcript","tag":"youtube","schema_ref":"#/components/schemas/AppResponse","route":"/v1/youtube/transcript/{id}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}},{"provider":"youtube","operation_id":"youtube_video","tag":"youtube","schema_ref":"#/components/schemas/AppResponse","route":"/v1/youtube/video/{id}","method":"GET","status":"available","callable":true,"auth_required":false,"read_only":true,"billing":{"metered":true,"credit_cost":3}}],"openapi":{"version":"v1","document_hash":"sha256:e6a25bc089aa094dad8e7371a9faa97556a5673536ecb7e2881aa45bf75c02a6","document":{"openapi":"3.0.3","info":{"title":"ReplyNodes Fetcher API","version":"v1","description":"Read-only data APIs for AI agents. Bearer auth. Prepaid credits / free tier.\n\nClick **Authorize** and paste ONLY the API key (no \"Bearer\" prefix) — Swagger adds it automatically."},"servers":[{"url":"https://api.replynodes.com"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"rn_test_<64hex> or rn_live_<64hex>","description":"API key. Paste the raw key only (e.g. rn_test_...) — the \"Bearer \" prefix is added automatically."}},"schemas":{"AgentStatus":{"type":"object","description":"A key's own standing (ADR 0024). Restricted keys report a per-key keyless quota; verified and workspace keys report their credit balance.","required":["data","meta"],"properties":{"data":{"type":"object","required":["key","quota","credits","next_actions"],"properties":{"key":{"type":"object","required":["prefix","class","status","expires_at"],"properties":{"prefix":{"type":"string"},"class":{"type":"string","enum":["workspace","agent_read"]},"status":{"type":"string","enum":["restricted","verified","active"]},"expires_at":{"type":["string","null"],"format":"date-time"}}},"quota":{"type":["object","null"],"properties":{"basis":{"type":"string","const":"per_key_per_utc_day"},"reset_at":{"type":"string","format":"date-time"},"capabilities":{"type":"object","additionalProperties":{"type":"object","required":["limit","remaining"],"properties":{"limit":{"type":"integer"},"remaining":{"type":"integer"}}}}}},"credits":{"type":["object","null"],"properties":{"balance":{"type":"number"},"unit":{"type":"string","const":"credit"}}},"next_actions":{"type":"array","items":{"$ref":"#/components/schemas/NextAction"}}}},"meta":{"$ref":"#/components/schemas/GatewayResponseMeta"}}},"AnonymousContinuation":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri","const":"https://replynodes.com/auth.md"}}},"AnonymousQuotaError":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","request_id","continuation"],"properties":{"code":{"const":"anonymous_limit_reached"},"message":{"type":"string","example":"The anonymous daily limit has been reached. Get a free API key through the browser-approved claim flow described at https://replynodes.com/auth.md: 500 free credits are granted when the first long-lived API key is created and delivered."},"request_id":{"type":"string"},"continuation":{"$ref":"#/components/schemas/AnonymousContinuation"},"next_action":{"$ref":"#/components/schemas/NextAction"}}}}},"AppResponse":{"type":"object","properties":{"data":{"description":"Provider-specific JSON payload. May be an object or a list; single lookups do not imply a one-element array. For example, hackernews_item returns an object with item and comments."},"meta":{"$ref":"#/components/schemas/GatewayResponseMeta"}},"additionalProperties":false,"required":["data","meta"],"description":"Shared gateway success envelope for heterogeneous provider reads; data retains each adapter's public JSON shape."},"BrandFontsResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"domain":{"type":"string"},"url":{"type":"string"},"count":{"type":"integer"},"words_count":{"type":"integer"},"fonts":{"type":"array","items":{"type":"object","properties":{"family":{"type":"string"},"source":{"type":"string"},"source_url":{"type":"string"},"weights":{"type":"array","items":{"type":"string"}},"styles":{"type":"array","items":{"type":"string"}},"fallbacks":{"type":"array","items":{"type":"string"}},"used_in":{"type":"array","items":{"type":"string"}},"elements_count":{"type":"integer"},"usage_percent":{"type":"number"}},"additionalProperties":false,"required":["family"]}}},"additionalProperties":false,"required":["domain","url","count"]},"meta":{"$ref":"#/components/schemas/GatewayResponseMeta"}},"additionalProperties":false,"required":["data","meta"]},"BrandLogoData":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri","description":"The snapshot target URL the logos were extracted from."},"brand":{"type":"object","properties":{"name":{"type":"string","description":"Public site/brand name detected on the page, when available."},"logo_url":{"type":"string","format":"uri","description":"Primary brand logo URL, when available."},"logos":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","description":"Asset slot and format (e.g. logo.svg, favicon.ico)."},"url":{"type":"string","format":"uri"}}},"description":"Candidate logo variants detected on the page."},"favicon_url":{"type":"string","format":"uri"},"og_image":{"type":"string","format":"uri"}}}}},"BrandLogoResponse":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/BrandLogoData"},"meta":{"type":"object","additionalProperties":true}}},"BrandRetrieveAsset":{"type":"object","required":["url"],"properties":{"kind":{"type":"string"},"url":{"type":"string"}}},"BrandRetrieveColor":{"type":"object","required":["hex"],"properties":{"hex":{"type":"string"},"usage":{"type":"string"},"count":{"type":"integer","format":"int64"}}},"BrandRetrieveResponse":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"object","required":["domain","url"],"properties":{"domain":{"type":"string"},"url":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"favicon":{"type":"string"},"og_image":{"type":"string"},"primary_logo":{"type":"string"},"logos":{"type":"array","items":{"$ref":"#/components/schemas/BrandRetrieveAsset"}},"backdrops":{"type":"array","items":{"$ref":"#/components/schemas/BrandRetrieveAsset"}},"colors":{"type":"array","items":{"$ref":"#/components/schemas/BrandRetrieveColor"}},"fonts":{"type":"array","items":{"type":"string"}},"social_links":{"type":"array","items":{"type":"string"}}}},"meta":{"type":"object","required":["request_id"],"properties":{"request_id":{"type":"string"},"contract_version":{"type":"string"},"generated_at":{"type":"string","format":"date-time"},"availability":{"type":"string"},"detail":{"type":"string"},"missing_fields":{"type":"array","items":{"type":"string"}},"next_cursor":{"type":"string"},"stale":{"type":"boolean"}}}}},"BrandSearchResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"query":{"type":"string"},"count":{"type":"integer"},"matches":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"domain":{"type":"string"},"url":{"type":"string"},"favicon":{"type":"string"},"description":{"type":"string"}},"additionalProperties":false,"required":["domain"]},"nullable":true}},"additionalProperties":false,"required":["query","count","matches"]},"meta":{"$ref":"#/components/schemas/GatewayResponseMeta"}},"additionalProperties":false,"required":["data","meta"]},"BrandStyleguideResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"domain":{"type":"string"},"url":{"type":"string"},"status":{"type":"string"},"mode":{"type":"string"},"colors":{"type":"array","items":{"type":"object","properties":{"role":{"type":"string"},"value":{"type":"string"},"source":{"type":"string"},"count":{"type":"integer"}},"additionalProperties":false,"required":["value","source"]}},"typography":{"type":"array","items":{"type":"object","properties":{"tag":{"type":"string"},"usage":{"type":"string"},"family":{"type":"string"},"size":{"type":"string"},"weight":{"type":"string"},"line_height":{"type":"string"},"source":{"type":"string"}},"additionalProperties":false,"required":["source"]}},"buttons":{"type":"array","items":{"type":"object","properties":{"variant":{"type":"string"},"background":{"type":"string"},"color":{"type":"string"},"border_radius":{"type":"string"},"padding":{"type":"string"},"font_weight":{"type":"string"},"source":{"type":"string"}},"additionalProperties":false,"required":["variant","source"]}},"card":{"type":"object","properties":{"background":{"type":"string"},"border_radius":{"type":"string"},"box_shadow":{"type":"string"},"padding":{"type":"string"},"border":{"type":"string"},"source":{"type":"string"}},"additionalProperties":false,"required":["source"]},"spacing":{"type":"array","items":{"type":"string"}},"shadows":{"type":"array","items":{"type":"string"}},"radii":{"type":"array","items":{"type":"string"}}},"additionalProperties":false,"required":["domain","url","status"]},"meta":{"$ref":"#/components/schemas/GatewayResponseMeta"}},"additionalProperties":false,"required":["data","meta"]},"CreditTopupRequired":{"type":"object","required":["code","balance_micro","price_micro","topup_url"],"properties":{"code":{"type":"string","enum":["topup_required"]},"balance_micro":{"type":"integer"},"price_micro":{"type":"integer"},"topup_url":{"type":"string","format":"uri","description":"Owner billing page for managing prepaid credits."},"message":{"type":"string"},"upgrade":{"type":"object","required":["url","plans","pricing"],"properties":{"url":{"type":"string","format":"uri"},"plans":{"type":"array","items":{"type":"object","required":["id","url"],"properties":{"id":{"type":"string"},"url":{"type":"string","format":"uri"}},"additionalProperties":false}},"pricing":{"type":"string","format":"uri"}},"additionalProperties":false},"next_action":{"type":"object","description":"Typed next step (ADR 0024): only the human can add credits, on the billing page.","required":["action","method","url","required_fields","docs"],"properties":{"action":{"type":"string","enum":["top_up"]},"method":{"type":"string","enum":["GET"]},"url":{"type":"string","format":"uri"},"required_fields":{"type":"array","items":{"type":"string"}},"human_message":{"type":"string"},"docs":{"type":"string","format":"uri"}},"additionalProperties":false}},"additionalProperties":false},"ErrorEnvelope":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"},"retryable":{"type":"boolean"},"reason":{"type":"string"},"continuation":{"$ref":"#/components/schemas/AnonymousContinuation"},"status":{"type":"integer"},"detail":{"type":"string"},"readme":{"type":"string"},"next_action":{"$ref":"#/components/schemas/NextAction"}},"additionalProperties":false,"required":["code","message","request_id"]}},"additionalProperties":false,"required":["error"]},"GatewayResponseMeta":{"type":"object","required":["request_id"],"properties":{"request_id":{"type":"string"},"contract_version":{"type":"string"},"generated_at":{"type":"string","format":"date-time"},"availability":{"type":"string"},"detail":{"type":"string"},"missing_fields":{"type":"array","items":{"type":"string"}},"next_cursor":{"type":"string"},"stale":{"type":"boolean"}},"additionalProperties":false},"JobSearchRecord":{"type":"object","required":["global_id","url","title","company","ats_type","ats_id","location","country_iso","region","lat","lon","is_remote","salary_currency","salary_period","salary_summary","salary_min","salary_max","employment_type","department","team","requisition_id","apply_url","commitment","description","posted_at","language"],"properties":{"global_id":{"type":"string"},"url":{"type":"string","nullable":true},"title":{"type":"string","nullable":true},"company":{"type":"string","nullable":true},"ats_type":{"type":"string","nullable":true},"ats_id":{"type":"string","nullable":true},"location":{"type":"string","nullable":true},"country_iso":{"type":"string","nullable":true},"region":{"type":"string","nullable":true},"lat":{"type":"string","nullable":true},"lon":{"type":"string","nullable":true},"is_remote":{"type":"boolean","nullable":true},"salary_currency":{"type":"string","nullable":true},"salary_period":{"type":"string","nullable":true},"salary_summary":{"type":"string","nullable":true},"salary_min":{"type":"number","nullable":true},"salary_max":{"type":"number","nullable":true},"employment_type":{"type":"string","nullable":true},"department":{"type":"string","nullable":true},"team":{"type":"string","nullable":true},"requisition_id":{"type":"string","nullable":true},"apply_url":{"type":"string","nullable":true},"commitment":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"posted_at":{"type":"string","nullable":true},"language":{"type":"string","nullable":true}},"additionalProperties":false},"JobSearchResponse":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/JobSearchRecord"}},"meta":{"$ref":"#/components/schemas/GatewayResponseMeta"}},"additionalProperties":false},"MarkdownHostError":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","request_id","reason","retryable"],"properties":{"code":{"type":"string","enum":["invalid_request","not_found","method_not_allowed","anonymous_limit_reached","source_excluded","upstream_blocked","upstream_unavailable","degraded","gateway_timeout","internal_error"]},"message":{"type":"string"},"request_id":{"type":"string"},"reason":{"type":"string","description":"Stable machine-readable failure reason; a closed set (values may be added, never renamed or removed).","enum":["empty_target","bad_scheme","malformed_url","target_too_long","target_not_allowed","target_rejected","bad_option","route_disabled","target_not_found","method_not_allowed","daily_limit","publisher_excluded","access_check","target_unreachable","empty_content","content_too_large","provider_unavailable","service_degraded","target_timeout","client_closed","internal_error"]},"retryable":{"type":"boolean","description":"True when sending the identical request again later can succeed without changing anything; it says nothing about how soon."},"status":{"type":"integer","description":"Stable numeric detail code; present only for source_excluded (45101)."},"detail":{"type":"string","description":"Safe caller guidance; present only for source_excluded."},"continuation":{"$ref":"#/components/schemas/AnonymousContinuation"},"next_action":{"$ref":"#/components/schemas/NextAction"}}}}},"MarkdownJsonResponse":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"object","required":["url","title","markdown","metadata","links","images"],"properties":{"url":{"type":"string"},"title":{"type":["string","null"]},"markdown":{"type":"string"},"metadata":{"type":"object","properties":{"title":{"type":["string","null"]},"description":{"type":["string","null"]},"author":{"type":["string","null"]},"image":{"type":["string","null"]},"favicon":{"type":["string","null"]},"language":{"type":["string","null"]},"published_date":{"type":["string","null"]},"site_name":{"type":["string","null"]},"word_count":{"type":["integer","null"]},"url":{"type":["string","null"]}}},"links":{"type":"array","items":{"type":"string"}},"images":{"type":"array","items":{"type":"string"}}}},"meta":{"type":"object","required":["request_id","generated_at"],"properties":{"request_id":{"type":"string"},"generated_at":{"type":"string","format":"date-time","description":"Time the page was fetched (the cached time on a cache hit)."}}}}},"NextAction":{"type":"object","description":"Typed next step for an agent (ADR 0024). Present only where a next step exists; branch on action, never on message text.","required":["action","method","url","required_fields","docs"],"properties":{"action":{"type":"string","enum":["get_api_key","verify_email","resend_code","renew_key","top_up","retry_later"],"description":"Closed set; values may be added, never renamed or removed."},"method":{"type":"string","enum":["GET","POST"]},"url":{"type":"string","format":"uri"},"required_fields":{"type":"array","items":{"type":"string"}},"optional_fields":{"type":"array","items":{"type":"string"}},"human_message":{"type":"string","description":"Short sentence the agent can show its human."},"docs":{"type":"string","format":"uri"},"retry_after_seconds":{"type":"integer","minimum":1,"description":"When the same request may be retried without completing the action."},"auth":{"type":"string","enum":["bearer_api_key"],"description":"Credential the call needs; bearer_api_key means send the same API key as a Bearer token."}},"additionalProperties":false},"RedditResponse":{"type":"object","additionalProperties":true},"RegistryBilling":{"type":"object","required":["metered"],"properties":{"metered":{"type":"boolean"},"credit_cost":{"type":"integer","format":"int64","minimum":0}},"additionalProperties":false},"RegistryData":{"type":"object","required":["schema_version","service","version","documentVersion","documentHash","document","providers","callable_routes","openapi"],"properties":{"schema_version":{"type":"string","enum":["v1"]},"service":{"type":"string"},"version":{"type":"string"},"documentVersion":{"type":"string"},"documentHash":{"type":"string"},"document":{"type":"object","description":"The embedded OpenAPI document served unchanged."},"providers":{"type":"array","items":{"$ref":"#/components/schemas/RegistryProvider"}},"callable_routes":{"type":"array","items":{"$ref":"#/components/schemas/RegistryRoute"}},"openapi":{"$ref":"#/components/schemas/RegistryOpenAPI"}},"additionalProperties":false},"RegistryOpenAPI":{"type":"object","required":["version","document_hash","document"],"properties":{"version":{"type":"string"},"document_hash":{"type":"string"},"document":{"type":"object","description":"The embedded OpenAPI document served unchanged."}},"additionalProperties":false},"RegistryProvider":{"type":"object","required":["slug","name","description","status","routes"],"properties":{"slug":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"status":{"type":"string"},"routes":{"type":"array","items":{"$ref":"#/components/schemas/RegistryRoute"}}},"additionalProperties":false},"RegistryResponse":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/RegistryData"},"meta":{"type":"object","required":["request_id"],"properties":{"request_id":{"type":"string"}},"additionalProperties":true}},"additionalProperties":false},"RegistryRoute":{"type":"object","required":["provider","route","method","status","callable","auth_required","read_only","billing"],"properties":{"provider":{"type":"string"},"operation_id":{"type":"string"},"tag":{"type":"string"},"schema_ref":{"type":"string"},"route":{"type":"string"},"method":{"type":"string","enum":["GET"]},"status":{"type":"string"},"callable":{"type":"boolean"},"auth_required":{"type":"boolean"},"read_only":{"type":"boolean"},"billing":{"$ref":"#/components/schemas/RegistryBilling"}},"additionalProperties":false},"ResearchWorkflowData":{"type":"object","required":["workflow","domain","targets"],"properties":{"workflow":{"type":"string","enum":["company-research","competitor-research"]},"domain":{"type":"string"},"targets":{"type":"array","items":{"$ref":"#/components/schemas/ResearchWorkflowTarget"}}}},"ResearchWorkflowResponse":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/ResearchWorkflowData"},"meta":{"type":"object","additionalProperties":true}}},"ResearchWorkflowTarget":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string"},"brand":{"type":"object","additionalProperties":true,"description":"Real brand-kit retrieve output; omitted when that primitive fails."},"styleguide":{"type":"object","additionalProperties":true},"logo":{"type":"object","additionalProperties":true},"markdown":{"type":"object","properties":{"content":{"type":"string"}}},"errors":{"type":"object","additionalProperties":{"type":"string"},"description":"Per-primitive typed error codes; a failed primitive's output is omitted rather than fabricated."}}},"WebContextBrandResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"url":{"type":"string"},"brand":{"type":"object","properties":{"name":{"type":"string","nullable":true},"logo_url":{"type":"string","nullable":true},"logos":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string"},"url":{"type":"string"}},"additionalProperties":false,"required":["kind","url"]},"nullable":true},"colors":{"type":"array","items":{"type":"object","properties":{"hex":{"type":"string"},"usage":{"type":"string"},"count":{"type":"integer"}},"additionalProperties":false,"required":["hex","usage","count"]},"nullable":true},"fonts":{"type":"array","items":{"type":"string"},"nullable":true},"favicon_url":{"type":"string","nullable":true},"og_image":{"type":"string","nullable":true}},"additionalProperties":false,"required":["name","logo_url","logos","colors","fonts","favicon_url","og_image"]}},"additionalProperties":false,"required":["url","brand"]},"meta":{"$ref":"#/components/schemas/GatewayResponseMeta"}},"additionalProperties":false,"required":["data","meta"]},"WebContextCrawlResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"url":{"type":"string"},"total":{"type":"integer"},"completed":{"type":"integer"},"errors":{"type":"integer"},"pages":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"depth":{"type":"integer"},"title":{"type":"string","nullable":true},"markdown":{"type":"string","nullable":true},"metadata":{"$ref":"#/components/schemas/WebContextMetadata"},"error":{"type":"string"}},"additionalProperties":false,"required":["url","depth","title","markdown","metadata"]}}},"additionalProperties":false,"required":["url","total","completed","errors","pages"]},"meta":{"$ref":"#/components/schemas/GatewayResponseMeta"}},"additionalProperties":false,"required":["data","meta"]},"WebContextMapResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"url":{"type":"string"},"count":{"type":"integer"},"urls":{"type":"array","items":{"type":"string"}}},"additionalProperties":false,"required":["url","count","urls"]},"meta":{"$ref":"#/components/schemas/GatewayResponseMeta"}},"additionalProperties":false,"required":["data","meta"]},"WebContextMetadata":{"type":"object","properties":{"title":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"author":{"type":"string","nullable":true},"image":{"type":"string","nullable":true},"favicon":{"type":"string","nullable":true},"language":{"type":"string","nullable":true},"published_date":{"type":"string","nullable":true},"site_name":{"type":"string","nullable":true},"url":{"type":"string","nullable":true},"word_count":{"type":"integer","nullable":true}},"additionalProperties":false,"required":["title","description","author","image","favicon","language","published_date","site_name","word_count","url"]},"WebContextScrapeResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"url":{"type":"string"},"title":{"type":"string","nullable":true},"markdown":{"type":"string","nullable":true},"metadata":{"$ref":"#/components/schemas/WebContextMetadata"},"links":{"type":"array","items":{"type":"string"}},"images":{"type":"array","items":{"type":"string"}},"truncated":{"type":"boolean"},"markdown_chars":{"type":"integer"}},"additionalProperties":false,"required":["url","title","markdown","metadata","links","images","truncated","markdown_chars"]},"meta":{"$ref":"#/components/schemas/GatewayResponseMeta"}},"additionalProperties":false,"required":["data","meta"]},"WebSearchData":{"type":"object","required":["data","pagination","meta"],"additionalProperties":false,"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WebSearchRecord"}},"pagination":{"$ref":"#/components/schemas/WebSearchPagination"},"meta":{"$ref":"#/components/schemas/WebSearchMeta"}}},"WebSearchMeta":{"type":"object","required":["contract_version","generated_at","source","availability","engines_requested","engines_failed"],"additionalProperties":false,"properties":{"contract_version":{"type":"string","enum":["v2"]},"generated_at":{"type":"string","format":"date-time","description":"When the original upstream result was generated; preserved on cache hits."},"source":{"type":"string","enum":["searxng"]},"availability":{"type":"string","enum":["complete","partial"]},"engines_requested":{"type":"array","items":{"type":"string"}},"engines_failed":{"type":"array","items":{"type":"string"}}}},"WebSearchPagination":{"type":"object","required":["page","next_page","has_more"],"additionalProperties":false,"properties":{"page":{"type":"integer","minimum":1},"next_page":{"type":"integer","nullable":true,"description":"Always null: continuation is never promised."},"has_more":{"type":"boolean","nullable":true,"description":"Always null: continuation is never promised."}}},"WebSearchRecord":{"type":"object","required":["id","platform","rank","title","snippet","domain","url","engines"],"additionalProperties":false,"properties":{"id":{"type":"string","description":"web-search:s_ followed by the lowercase SHA-256 hex of the canonical URL."},"platform":{"type":"string","enum":["web-search"]},"rank":{"type":"integer","minimum":1,"description":"One-based position within the returned page; never a global rank."},"title":{"type":"string","nullable":true},"snippet":{"type":"string","nullable":true},"domain":{"type":"string","nullable":true},"url":{"type":"string","format":"uri"},"engines":{"type":"array","items":{"type":"string"},"description":"Engines that actually returned this record; empty when provenance is unknown."}}},"WebSearchResponse":{"type":"object","required":["data","meta"],"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/WebSearchData"},"meta":{"$ref":"#/components/schemas/GatewayResponseMeta"}}}}},"security":[{"bearerAuth":[]}],"paths":{"/v1/agent/status":{"get":{"operationId":"get_agent_status","tags":["discovery"],"summary":"Get this API key's status","description":"Returns the presented key's own standing: prefix, class, status (restricted, verified, or active), expiry, per-key keyless quota for a restricted key or credit balance otherwise, and next_actions with a human_message. Reading status never consumes quota. Restricted keys can call only the keyless capability set (403 verification_required otherwise) on their own per-key daily buckets (429 restricted_limit_reached when used up).","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Key standing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentStatus"}}}},"401":{"description":"Missing, unknown, expired, or revoked key; error.next_action is get_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/capabilities":{"get":{"operationId":"get_gateway_capabilities","tags":["discovery"],"summary":"Get gateway capabilities","description":"Unauthenticated, read-only discovery of the gateway-wide provider inventory, routes currently callable under their provider manifests, and the embedded OpenAPI document. Callable discovery is a runtime snapshot, not authorization or billing state.","security":[],"responses":{"200":{"description":"Current gateway capability registry.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}},"X-Registry-Schema-Version":{"description":"Version of the registry response envelope.","schema":{"type":"string"}},"X-OpenAPI-Document-Version":{"description":"Version of the embedded OpenAPI document.","schema":{"type":"string"}},"X-OpenAPI-Document-Hash":{"description":"SHA-256 identity of the embedded OpenAPI document.","schema":{"type":"string"}},"ETag":{"description":"Quoted SHA-256 identity of the embedded OpenAPI document.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegistryResponse"}}}},"503":{"description":"Normalized error with code degraded when the embedded document or callable route registry is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/md/{target}":{"servers":[{"url":"https://md.replynodes.com"}],"get":{"operationId":"anonymous_markdown","tags":["markdown"],"summary":"Read a public URL as Markdown","description":"Already-anonymous Markdown gateway route for canonical capability url-to-markdown (dedicated Markdown tier: 100 valid requests per trusted client-IP bucket per UTC calendar day). Admission occurs after method and target/SSRF validation and before cache/upstream work; cache hits and upstream failures consume one unit. X-RateLimit-Limit is the effective fixed tier limit, X-RateLimit-Remaining is the capability bucket balance, and X-RateLimit-Reset is the next UTC midnight Unix timestamp. Redis failure returns 503 degraded. Output format is chosen with request headers because the whole path and query string belong to the target URL: no Accept header, Accept: */*, text/markdown or text/plain returns Markdown (default); Accept: application/json (JSON preferred with q>0) returns the {data, meta} envelope with the same data shape as GET /v1/webcontext/scrape; X-Format: frontmatter returns Markdown preceded by a fixed seven-key YAML front-matter block; an unknown X-Format value, or application/json together with X-Format: frontmatter, returns 400 invalid_request with reason bad_option before any quota is spent. X-Include-Selectors and X-Exclude-Selectors (comma-separated CSS selectors, at most 10 entries and 512 bytes per header, duplicates removed, no control characters or { } ; < >) filter the page; they are part of the cache key; with selectors set, a page that returns an access-check page returns 502 upstream_blocked (no crawl fallback). A page main heading may remain even when it matches an exclude selector. Every error response of this host carries error.reason (a stable value from the closed set in the MarkdownHostError schema) and error.retryable in addition to error.code, error.message and error.request_id. Successful responses set Vary: Accept, X-Format.","security":[],"parameters":[{"name":"target","in":"path","required":true,"schema":{"type":"string","description":"Complete URL or bare public hostname, URL-encoded as needed."}},{"name":"X-Format","in":"header","required":false,"description":"Output format: markdown (default) or frontmatter. Any other value returns 400 invalid_request with reason bad_option. Cannot be combined with Accept: application/json.","schema":{"type":"string","enum":["markdown","frontmatter"]}},{"name":"X-Include-Selectors","in":"header","required":false,"description":"Comma-separated CSS selectors to keep (at most 10 entries, 512 bytes).","schema":{"type":"string","example":"article,.post-body"}},{"name":"X-Exclude-Selectors","in":"header","required":false,"description":"Comma-separated CSS selectors to remove (at most 10 entries, 512 bytes).","schema":{"type":"string","example":"nav,footer,.sidebar"}}],"responses":{"200":{"description":"Markdown by default; JSON envelope when Accept prefers application/json; Markdown with YAML front matter when X-Format is frontmatter. Quota headers are included.","headers":{"Vary":{"schema":{"type":"string","example":"Accept, X-Format"}},"X-Cache":{"schema":{"type":"string","enum":["hit","miss"]}},"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}}},"content":{"text/markdown":{"schema":{"type":"string"}},"application/json":{"schema":{"$ref":"#/components/schemas/MarkdownJsonResponse"}}}},"400":{"description":"Invalid target, unsafe public URL, unknown or conflicting X-Format, or invalid selector headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkdownHostError"}}}},"404":{"description":"Not found: the provider reports the page does not exist (reason target_not_found) or the Markdown route is not enabled on this host (reason route_disabled). Not retryable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkdownHostError"}}}},"405":{"description":"Method not allowed (reason method_not_allowed); Allow: GET, HEAD. Not retryable.","headers":{"Allow":{"schema":{"type":"string","example":"GET, HEAD"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkdownHostError"}}}},"429":{"description":"Anonymous daily quota exhausted. Includes X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, Retry-After, and the typed continuation. On this host the error also carries reason daily_limit and retryable false.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}},"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnonymousQuotaError"}}}},"451":{"description":"Publisher excluded automated access (source_excluded, error.status 45101, reason publisher_excluded, not retryable).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkdownHostError"}}}},"499":{"description":"The client closed the connection before the response was ready (error.code gateway_timeout, reason client_closed, retryable). Logged as 499; nothing is waiting on this response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkdownHostError"}}}},"500":{"description":"Unclassified internal error (reason internal_error, retryable).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkdownHostError"}}}},"502":{"description":"Upstream_blocked (reason access_check) or upstream_unavailable (reasons target_unreachable, empty_content, content_too_large, provider_unavailable).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkdownHostError"}}}},"503":{"description":"Shared Redis, the source-policy registry or quota admission unavailable; request rejected closed (reason service_degraded, retryable).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkdownHostError"}}}},"504":{"description":"The target did not respond within 30 seconds (reason target_timeout, retryable).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkdownHostError"}}}}}}},"/{domain}":{"servers":[{"url":"https://brand.replynodes.com"}],"get":{"operationId":"anonymous_brand","tags":["brand"],"summary":"Read public brand intelligence","description":"Already-anonymous Brand gateway route for canonical capability brand-kit (fixed Tier A: 20 valid requests per trusted client-IP bucket per UTC calendar day). Domain validation occurs before admission; cache hits and upstream failures consume one unit. X-RateLimit-Limit is the effective fixed tier limit, X-RateLimit-Remaining is the capability bucket balance, and X-RateLimit-Reset is the next UTC midnight Unix timestamp.","security":[],"parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9.-]+$"}}],"responses":{"200":{"description":"Brand intelligence response; quota headers are included."},"400":{"description":"Invalid or blocked domain."},"429":{"description":"Anonymous daily quota exhausted; includes typed continuation and standard quota headers.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}},"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnonymousQuotaError"}}}},"503":{"description":"Shared Redis unavailable; request rejected closed."}}}},"/":{"servers":[{"url":"https://pdf.replynodes.com"}],"get":{"operationId":"pdf_document_help","summary":"PDF conversion endpoint help","description":"Documentation-only root GET for the anonymous PDF conversion contract. POST converts a public PDF URL; HEAD returns the same documentation headers. Allowed methods: GET, HEAD, POST. Limits: 10 MiB source/download, 50 pages, 60 seconds, 20 conversions/IP/hour, 2 active conversions/IP, and a maximum encoded JSON response of 1 MiB. MCP discovery identifies the sole read_document tool at https://mcp.replynodes.com/mcp.","tags":["pdf"],"security":[],"responses":{"200":{"description":"Endpoint usage documentation"},"405":{"description":"Method not allowed; Allow: GET, HEAD, POST"}}},"head":{"operationId":"pdf_document_help_head","summary":"PDF conversion endpoint headers","description":"Documentation-only root HEAD for the anonymous PDF conversion contract. POST converts a public PDF URL and GET returns usage documentation. Allowed methods: GET, HEAD, POST. Limits: 10 MiB source/download, 50 pages, 60 seconds, 20 conversions/IP/hour, 2 active conversions/IP, and a maximum encoded JSON response of 1 MiB. MCP discovery identifies the sole read_document tool at https://mcp.replynodes.com/mcp.","tags":["pdf"],"security":[],"responses":{"200":{"description":"Endpoint usage documentation headers"},"405":{"description":"Method not allowed; Allow: GET, HEAD, POST"}}},"post":{"servers":[{"url":"https://pdf.replynodes.com"}],"operationId":"read_document","summary":"Read a public PDF as Markdown for AI agents","description":"Direct public HTTP POST to https://pdf.replynodes.com/ requires no account, API key, or cookie. POST converts one public PDF URL to Markdown. GET and HEAD on the root are documentation-only; allowed methods are GET, HEAD, POST. This PDF to Markdown response is designed for read PDF, PDF for AI agents, extract PDF text, and PDF context workflows. The MCP read_document / tools/call at https://mcp.replynodes.com/mcp requires the existing MCP authorization boundary; MCP is not anonymous. Limits: 10 MiB source/download, 50 pages, 60 seconds, 20 conversions/IP/hour, 2 active conversions/IP, and a maximum encoded JSON response of 1 MiB including the trailing newline. MCP discovery identifies the sole read_document tool at https://mcp.replynodes.com/mcp.","tags":["pdf"],"security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"additionalProperties":false,"properties":{"url":{"type":"string","format":"uri","pattern":"^https?://"}}}}}},"responses":{"200":{"description":"Converted PDF","content":{"application/json":{"schema":{"type":"object","required":["type","mime_type","markdown","metadata"],"properties":{"type":{"const":"document"},"mime_type":{"const":"application/pdf"},"markdown":{"type":"string"},"metadata":{"type":"object","required":["pages"],"properties":{"pages":{"type":"integer","minimum":1},"title":{"type":["string","null"]}}}}}}}},"400":{"description":"Malformed JSON, unknown fields, invalid URL, or unsafe public URL; standard error envelope"},"405":{"description":"Method not allowed; Allow: GET, HEAD, POST; standard error envelope"},"413":{"description":"PDF source/download exceeds 10 MiB or exceeds 50 pages; standard error envelope"},"429":{"description":"Hourly quota or 2-active-conversions-per-IP limit; standard error envelope"},"502":{"description":"Private conversion runtime failed or encoded response would exceed 1 MiB; standard error envelope"},"503":{"description":"Shared Redis or private conversion runtime unavailable; standard error envelope"},"504":{"description":"Conversion exceeded 60 seconds; standard error envelope"}}}},"/v1/youtube/search":{"get":{"operationId":"youtube_search","tags":["youtube"],"parameters":[{"name":"term","in":"query","required":true,"schema":{"type":"string"}},{"name":"language","in":"query","schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":50}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}}}}},"/v1/youtube/video/{id}":{"get":{"operationId":"youtube_video","tags":["youtube"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"language","in":"query","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}}}}},"/v1/youtube/channel/{id}":{"get":{"operationId":"youtube_channel","tags":["youtube"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"language","in":"query","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}}}}},"/v1/youtube/comments/{id}":{"get":{"operationId":"youtube_comments","tags":["youtube"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":50}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}}}}},"/v1/youtube/playlist/{id}":{"get":{"operationId":"youtube_playlist","tags":["youtube"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"language","in":"query","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}}}}},"/v1/youtube/related/{id}":{"get":{"operationId":"youtube_related","tags":["youtube"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"language","in":"query","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}}}}},"/v1/youtube/transcript/{id}":{"get":{"operationId":"youtube_transcript","tags":["youtube"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"language","in":"query","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}}}}},"/fetcher/healthz":{"get":{"summary":"Health check","security":[],"responses":{"200":{"description":"ok"}}}},"/fetcher/readyz":{"get":{"summary":"Readiness (auth/db status)","security":[],"responses":{"200":{"description":"ok","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["ok"]},"checks":{"type":"object","properties":{"backend_authorizer":{"type":"string","enum":["not_configured","reachable"]},"redis":{"type":"string","enum":["not_configured","reachable"]}},"additionalProperties":false,"required":["backend_authorizer","redis"]},"meta":{"$ref":"#/components/schemas/GatewayResponseMeta"}},"additionalProperties":false,"required":["status","checks","meta"]}}}},"503":{"description":"A configured dependency is unreachable.","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["unhealthy"]},"checks":{"type":"object","properties":{"backend_authorizer":{"type":"string","enum":["not_configured","reachable","unreachable"]},"redis":{"type":"string","enum":["not_configured","reachable","unreachable"]}},"additionalProperties":false,"required":["backend_authorizer","redis"]},"meta":{"$ref":"#/components/schemas/GatewayResponseMeta"}},"additionalProperties":false,"required":["status","checks","meta"]}}}}},"operationId":"get_fetcher_readyz"}},"/v1/hackernews/capabilities":{"get":{"summary":"List available operations","security":[],"responses":{"200":{"description":"ok"}}}},"/v1/hackernews/stories_top":{"get":{"operationId":"hackernews_stories_top","summary":"Fetch current Hacker News top stories","description":"Fetch current Hacker News top stories. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["hackernews"],"parameters":[{"name":"limit","in":"query","required":false,"description":"Maximum number of results; values outside 1..100 are rejected.","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"page","in":"query","required":false,"description":"Result page.","schema":{"type":"integer","minimum":1}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/hackernews/stories_new":{"get":{"operationId":"hackernews_stories_new","summary":"Fetch current Hacker News new stories","description":"Fetch current Hacker News new stories. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["hackernews"],"parameters":[{"name":"limit","in":"query","required":false,"description":"Maximum number of results; values outside 1..100 are rejected.","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"page","in":"query","required":false,"description":"Result page.","schema":{"type":"integer","minimum":1}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/hackernews/stories_best":{"get":{"operationId":"hackernews_stories_best","summary":"Fetch current Hacker News best stories","description":"Fetch current Hacker News best stories. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["hackernews"],"parameters":[{"name":"limit","in":"query","required":false,"description":"Maximum number of results; values outside 1..100 are rejected.","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"page","in":"query","required":false,"description":"Result page.","schema":{"type":"integer","minimum":1}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/hackernews/stories_ask":{"get":{"operationId":"hackernews_stories_ask","summary":"Fetch current Ask HN stories","description":"Fetch current Ask HN stories. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["hackernews"],"parameters":[{"name":"limit","in":"query","required":false,"description":"Maximum number of results; values outside 1..100 are rejected.","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"page","in":"query","required":false,"description":"Result page.","schema":{"type":"integer","minimum":1}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/hackernews/stories_show":{"get":{"operationId":"hackernews_stories_show","summary":"Fetch current Show HN stories","description":"Fetch current Show HN stories. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["hackernews"],"parameters":[{"name":"limit","in":"query","required":false,"description":"Maximum number of results; values outside 1..100 are rejected.","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"page","in":"query","required":false,"description":"Result page.","schema":{"type":"integer","minimum":1}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/hackernews/stories_job":{"get":{"operationId":"hackernews_stories_job","summary":"Fetch current Hacker News job postings","description":"Fetch current Hacker News job postings. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["hackernews"],"parameters":[{"name":"limit","in":"query","required":false,"description":"Maximum number of results; values outside 1..100 are rejected.","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"page","in":"query","required":false,"description":"Result page.","schema":{"type":"integer","minimum":1}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/hackernews/search":{"get":{"operationId":"hackernews_search","summary":"Search Hacker News via Algolia","description":"Search Hacker News via Algolia. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["hackernews"],"parameters":[{"name":"q","in":"query","required":true,"description":"Search query.","schema":{"type":"string"}},{"name":"tags","in":"query","required":false,"description":"Algolia HN Search tag filter (e.g. story, comment, ask_hn).","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Maximum number of results; values outside 1..100 are rejected.","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"page","in":"query","required":false,"description":"Result page.","schema":{"type":"integer","minimum":0}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/hackernews/item/{id}":{"get":{"operationId":"hackernews_item","summary":"Fetch a single Hacker News item and its comment tree","description":"Fetch a single Hacker News item and its comment tree. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["hackernews"],"parameters":[{"name":"id","in":"path","required":true,"description":"Hacker News item id.","schema":{"type":"integer"}},{"name":"depth","in":"query","required":false,"description":"Maximum comment-tree depth to resolve; values outside 1..10 are rejected.","schema":{"type":"integer","minimum":1,"maximum":10}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/hackernews/user/{handle}":{"get":{"operationId":"hackernews_user","summary":"Fetch a public Hacker News user profile","description":"Fetch a public Hacker News user profile. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["hackernews"],"parameters":[{"name":"handle","in":"path","required":true,"description":"Hacker News username.","schema":{"type":"string"}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/appstore/app":{"get":{"operationId":"app","summary":"Look up one public App Store application","description":"Look up one public App Store application. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["appstore"],"parameters":[{"name":"id","in":"query","required":false,"description":"Numeric track id; provide this or appId.","schema":{"type":"string"}},{"name":"appId","in":"query","required":false,"description":"Bundle id; provide this or id.","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"lang","in":"query","required":false,"description":"Language code.","schema":{"type":"string"}},{"name":"ratings","in":"query","required":false,"description":"Include ratings information.","schema":{"type":"boolean"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/appstore/list":{"get":{"operationId":"list","summary":"List applications from an iTunes collection","description":"List applications from an iTunes collection. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["appstore"],"parameters":[{"name":"collection","in":"query","required":false,"description":"Provider collection constant.","schema":{"type":"string"}},{"name":"category","in":"query","required":false,"description":"Provider category constant.","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"lang","in":"query","required":false,"description":"Language code.","schema":{"type":"string"}},{"name":"num","in":"query","required":false,"description":"Number of applications; values outside 1..200 are rejected.","schema":{"type":"integer","minimum":1,"maximum":200}},{"name":"fullDetail","in":"query","required":false,"description":"Request detail enrichment.","schema":{"type":"boolean"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/appstore/search":{"get":{"operationId":"search","summary":"Search public App Store applications by term","description":"Search public App Store applications by term. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["appstore"],"parameters":[{"name":"term","in":"query","required":true,"description":"Search term.","schema":{"type":"string"}},{"name":"num","in":"query","required":false,"description":"Number of results; values outside 1..50 are rejected.","schema":{"type":"integer","minimum":1,"maximum":50}},{"name":"page","in":"query","required":false,"description":"Result page.","schema":{"type":"integer","minimum":1,"maximum":200}},{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"lang","in":"query","required":false,"description":"Language code.","schema":{"type":"string"}},{"name":"idsOnly","in":"query","required":false,"description":"Return ids without detail lookups.","schema":{"type":"boolean"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/appstore/developer":{"get":{"operationId":"developer","summary":"List applications by developer","description":"List applications by developer. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["appstore"],"parameters":[{"name":"devId","in":"query","required":true,"description":"public developer identifier.","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"lang","in":"query","required":false,"description":"Language code.","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/appstore/privacy":{"get":{"operationId":"privacy","summary":"Read public App Store privacy details","description":"Read public App Store privacy details. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["appstore"],"parameters":[{"name":"id","in":"query","required":true,"description":"public application identifier.","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/appstore/suggest":{"get":{"operationId":"suggest","summary":"Suggest public App Store search terms","description":"Suggest public App Store search terms. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["appstore"],"parameters":[{"name":"term","in":"query","required":true,"description":"Search term.","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/appstore/similar":{"get":{"operationId":"similar","summary":"List apps related to an application","description":"List apps related to an application. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["appstore"],"parameters":[{"name":"id","in":"query","required":false,"description":"public application identifier; provide this or appId.","schema":{"type":"string"}},{"name":"appId","in":"query","required":false,"description":"Bundle id; provide this or id.","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/appstore/reviews":{"get":{"operationId":"reviews","summary":"Read a page of public app reviews","description":"Read a page of public app reviews. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["appstore"],"parameters":[{"name":"id","in":"query","required":false,"description":"public application identifier; provide this or appId.","schema":{"type":"string"}},{"name":"appId","in":"query","required":false,"description":"Bundle id; provide this or id.","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"Review page; values outside 1..10 are rejected.","schema":{"type":"integer","minimum":1,"maximum":10}},{"name":"sort","in":"query","required":false,"description":"Provider review sort constant.","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/appstore/ratings":{"get":{"operationId":"ratings","summary":"Read public app ratings","description":"Read public app ratings. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["appstore"],"parameters":[{"name":"id","in":"query","required":false,"description":"public application identifier; provide this or appId.","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"appId","in":"query","required":false,"description":"Bundle id; provide this or id.","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/googleplay/app_details/{id}":{"get":{"operationId":"googleplay_app_details","summary":"Fetch a single Google Play app's public detail record","description":"Fetch a single Google Play app's public detail record. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["googleplay"],"parameters":[{"name":"id","in":"path","required":true,"description":"Google Play package id (e.g. com.nike.snkrs).","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Language code.","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/googleplay/search":{"get":{"operationId":"googleplay_search","summary":"Search public Google Play applications by term","description":"Search public Google Play applications by term. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["googleplay"],"parameters":[{"name":"term","in":"query","required":true,"description":"Search term.","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Language code.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Maximum number of results; values outside 1..50 are rejected.","schema":{"type":"integer","minimum":1,"maximum":50}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/googleplay/similar_apps/{id}":{"get":{"operationId":"googleplay_similar_apps","summary":"Fetch apps similar to a given Google Play package","description":"Fetch apps similar to a given Google Play package. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["googleplay"],"parameters":[{"name":"id","in":"path","required":true,"description":"Google Play package id (e.g. com.nike.snkrs).","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Language code.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Maximum number of results; values outside 1..50 are rejected.","schema":{"type":"integer","minimum":1,"maximum":50}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/googleplay/permissions/{id}":{"get":{"operationId":"googleplay_permissions","summary":"Fetch a Google Play app's declared permissions","description":"Fetch a Google Play app's declared permissions. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["googleplay"],"parameters":[{"name":"id","in":"path","required":true,"description":"Google Play package id (e.g. com.nike.snkrs).","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Language code.","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/googleplay/reviews/{id}":{"get":{"operationId":"googleplay_reviews","summary":"Fetch public reviews for a Google Play app","description":"Fetch public reviews for a Google Play app. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["googleplay"],"parameters":[{"name":"id","in":"path","required":true,"description":"Google Play package id (e.g. com.nike.snkrs).","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Language code.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Maximum number of results; values outside 1..50 are rejected.","schema":{"type":"integer","minimum":1,"maximum":50}},{"name":"sort","in":"query","required":false,"description":"Upstream review sort order.","schema":{"type":"integer"}},{"name":"score","in":"query","required":false,"description":"Filter reviews to this star rating (1..5).","schema":{"type":"integer","minimum":1,"maximum":5}},{"name":"next_token","in":"query","required":false,"description":"Pagination token from a previous reviews response.","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/googleplay/developer":{"get":{"operationId":"googleplay_developer","summary":"Fetch public apps published by a Google Play developer","description":"Fetch public apps published by a Google Play developer. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["googleplay"],"parameters":[{"name":"dev_id","in":"query","required":true,"description":"Google Play developer id.","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Language code.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Maximum number of results; values outside 1..50 are rejected.","schema":{"type":"integer","minimum":1,"maximum":50}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/googleplay/categories":{"get":{"operationId":"googleplay_categories","summary":"List available Google Play category identifiers","description":"List available Google Play category identifiers. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["googleplay"],"parameters":[{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Language code.","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/googleplay/category_apps/{category}":{"get":{"operationId":"googleplay_category_apps","summary":"Fetch top public apps in a Google Play category","description":"Fetch top public apps in a Google Play category. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["googleplay"],"parameters":[{"name":"category","in":"path","required":true,"description":"Google Play category identifier (e.g. GAME, SHOPPING).","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Language code.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Maximum number of results; values outside 1..50 are rejected.","schema":{"type":"integer","minimum":1,"maximum":50}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/googleplay/suggest":{"get":{"operationId":"googleplay_suggest","summary":"Fetch Google Play search-term suggestions","description":"Fetch Google Play search-term suggestions. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["googleplay"],"parameters":[{"name":"term","in":"query","required":true,"description":"Search term.","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Language code.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Maximum number of results; values outside 1..50 are rejected.","schema":{"type":"integer","minimum":1,"maximum":50}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/googleplay/availability/{id}":{"get":{"operationId":"googleplay_availability","summary":"Fetch a Google Play app's per-storefront availability","description":"Fetch a Google Play app's per-storefront availability. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["googleplay"],"parameters":[{"name":"id","in":"path","required":true,"description":"Google Play package id (e.g. com.nike.snkrs).","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"countries","in":"query","required":false,"description":"Comma-separated storefront codes.","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Language code.","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/googleplay/data_safety/{id}":{"get":{"operationId":"googleplay_data_safety","summary":"Fetch a Google Play app's declared data-safety disclosure","description":"Fetch a Google Play app's declared data-safety disclosure. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.","tags":["googleplay"],"parameters":[{"name":"id","in":"path","required":true,"description":"Google Play package id (e.g. com.nike.snkrs).","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Two-letter storefront code.","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Language code.","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response. The data payload retains the provider-specific JSON shape described by this operation.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Normalized error with code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/web/search":{"get":{"operationId":"web_search","summary":"Search the public web","description":"Search the public web (English only) through the SearXNG-backed provider contract v2. The response `data` is an array of records (id, platform, one-based page rank, title, snippet, domain, url, engines), `pagination` is `{page, next_page: null, has_more: null}` (continuation is never promised; request another page explicitly), and `meta` carries `contract_version: v2`, `generated_at`, `source: searxng`, `availability` (`complete` or `partial`), `engines_requested` and `engines_failed`. A partial response is still billed as a successful read; a response with no verified engine execution is a 502.","tags":["web_search"],"parameters":[{"name":"q","in":"query","required":true,"description":"Search query text (1..512 bytes, no control characters). Tokens starting with `!`, `:` or `<` are reserved and rejected; ordinary `site:example.com` text is passed through as search syntax, not a guaranteed filter.","schema":{"type":"string","minLength":1,"maxLength":512}},{"name":"language","in":"query","required":false,"description":"Result language. English only: `en-US` (default) or `en-GB`.","schema":{"type":"string","enum":["en-US","en-GB"],"maxLength":16}},{"name":"engines","in":"query","required":false,"description":"Optional comma-separated approved engines (`brave`, `bing`). Omit to use the default primary/fallback chain.","schema":{"type":"string","maxLength":64}},{"name":"page","in":"query","required":false,"description":"Page number. The current engine profile supports pages 1-2 (Brave); higher pages are rejected with 400 invalid_request until more are verified.","schema":{"type":"integer","minimum":1,"maximum":2,"default":1}},{"name":"time_range","in":"query","required":false,"description":"Recency filter. Only `week` is supported by the current engine profile; `day` and `month` are rejected until verified. Not available when the Bing fallback would be needed (page 1 without a time range only).","schema":{"type":"string","enum":["week"]}},{"name":"limit","in":"query","required":false,"description":"Maximum records returned from the merged page (1..50). Truncation only; never an offset or cursor.","schema":{"type":"integer","minimum":1,"maximum":50,"default":10}}],"security":[],"responses":{"200":{"description":"Success response with the v2 web-search payload: data (records), pagination (never promises continuation) and meta (availability complete or partial).","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebSearchResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/webcontext/scrape":{"get":{"operationId":"webcontext_scrape","summary":"Fetch one URL as clean Markdown","description":"Fetch one URL and return clean, main-content Markdown plus normalized metadata, links, and images. Backed by a privately deployed webclaw-server instance; upstream implementation details are never exposed.","tags":["webcontext"],"parameters":[{"name":"url","in":"query","required":true,"description":"Target URL to fetch. Rejected if it is malformed, uses a disallowed scheme, or resolves to a private/loopback/link-local/cloud-metadata address.","schema":{"type":"string","format":"uri"}},{"name":"include_selectors","in":"query","required":false,"description":"Comma-separated CSS selectors to include (e.g. \"article,.content\").","schema":{"type":"string"}},{"name":"exclude_selectors","in":"query","required":false,"description":"Comma-separated CSS selectors to exclude (e.g. \"nav,.sidebar,footer\").","schema":{"type":"string"}},{"name":"max_chars","in":"query","required":false,"description":"Maximum number of Unicode code points of Markdown to return (1-1048576). A longer page is cut at the last line break (or whitespace) in the second half of the budget; data.truncated is true and data.markdown_chars is the full length. Links and images are still listed from the full page. Priced the same with or without max_chars. A non-integer or out-of-range value is rejected with 400 invalid_request.","schema":{"type":"integer","minimum":1,"maximum":1048576}}],"security":[],"responses":{"200":{"description":"Success response.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebContextScrapeResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/webcontext/crawl":{"get":{"operationId":"webcontext_crawl","summary":"Crawl same-origin links from a URL","description":"Crawl same-origin links starting from a URL and return normalized page results. max_pages/max_depth are clamped server-side regardless of the requested value.","tags":["webcontext"],"parameters":[{"name":"url","in":"query","required":true,"description":"Target URL to fetch. Rejected if it is malformed, uses a disallowed scheme, or resolves to a private/loopback/link-local/cloud-metadata address.","schema":{"type":"string","format":"uri"}},{"name":"max_pages","in":"query","required":false,"description":"Maximum pages to crawl; clamped to 1..50.","schema":{"type":"integer","minimum":1,"maximum":50}},{"name":"max_depth","in":"query","required":false,"description":"Maximum link depth; clamped to 1..3.","schema":{"type":"integer","minimum":1,"maximum":3}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success response.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebContextCrawlResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/webcontext/map":{"get":{"operationId":"webcontext_map","summary":"Discover URLs belonging to a site","description":"Discover URLs belonging to a site without extracting page content. Results are deduplicated.","tags":["webcontext"],"parameters":[{"name":"url","in":"query","required":true,"description":"Target URL to fetch. Rejected if it is malformed, uses a disallowed scheme, or resolves to a private/loopback/link-local/cloud-metadata address.","schema":{"type":"string","format":"uri"}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success response.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebContextMapResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/webcontext/brand":{"get":{"operationId":"webcontext_brand","summary":"Extract public brand identity for a site","description":"Lightweight brand snapshot for one site URL: logos, colors, fonts, and basic public metadata. Prefer brand_retrieve for a fuller normalized brand profile or brand_search for fuzzy company-name discovery.","tags":["webcontext"],"parameters":[{"name":"url","in":"query","required":true,"description":"Target URL to fetch. Rejected if it is malformed, uses a disallowed scheme, or resolves to a private/loopback/link-local/cloud-metadata address.","schema":{"type":"string","format":"uri"}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success response.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebContextBrandResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/brand/retrieve":{"get":{"operationId":"brand_retrieve","summary":"Retrieve Brand","description":"Resolve the full brand profile of a company by domain, or extract brand details from one specific page URL: name, description, primary logo, logos, colors, fonts, social links, favicon, and og_image.","tags":["brand"],"parameters":[{"name":"domain","in":"query","required":false,"description":"Company domain to resolve, e.g. apple.com. One of domain or url is required.","schema":{"type":"string"}},{"name":"url","in":"query","required":false,"description":"One specific page URL to extract brand details from instead of the whole domain.","schema":{"type":"string","format":"uri"}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success response.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandRetrieveResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/brand/search":{"get":{"operationId":"brand_search","summary":"Search Brand","description":"Fuzzy brand or company search by name or domain; returns up to 10 lightweight matches with domain, name, and logo.","tags":["brand"],"parameters":[{"name":"query","in":"query","required":true,"description":"Brand name or domain to search for.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Maximum number of matches to return (default and maximum 10).","schema":{"type":"integer","minimum":1,"maximum":10}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success response.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandSearchResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/brand/styleguide":{"get":{"operationId":"brand_styleguide","summary":"Get Styleguide","description":"Extract the design system of a website by domain or URL: colors, typography, spacing, and more.","tags":["brand"],"parameters":[{"name":"domain","in":"query","required":false,"description":"Website domain to extract a styleguide from, e.g. replynodes.com. One of domain or url is required.","schema":{"type":"string"}},{"name":"url","in":"query","required":false,"description":"One specific page URL to extract a styleguide from instead of the whole domain.","schema":{"type":"string","format":"uri"}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success response.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandStyleguideResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/brand/fonts":{"get":{"operationId":"brand_fonts","summary":"Get Fonts","description":"Extract the typography and font stack of a website by domain or URL.","tags":["brand"],"parameters":[{"name":"domain","in":"query","required":false,"description":"Website domain to extract font information from, e.g. replynodes.com. One of domain or url is required.","schema":{"type":"string"}},{"name":"url","in":"query","required":false,"description":"One specific page URL to extract font information from instead of the whole domain.","schema":{"type":"string","format":"uri"}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success response.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandFontsResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/brand/logo":{"get":{"operationId":"brand_logo","summary":"Get Brand Logo","description":"Fetch the brand logo kit for one company domain: primary logo URL, candidate logo variants, favicon, and og_image.","tags":["brand"],"parameters":[{"name":"domain","in":"query","required":true,"description":"Company domain to resolve, e.g. stripe.com. A bare domain only: no scheme, port, path, or credentials.","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Success response.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandLogoResponse"}}}},"400":{"description":"Normalized error with code invalid_request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Normalized error with code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the quota window resets.","schema":{"type":"integer"}}}},"502":{"description":"Normalized error with code upstream_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Normalized error with code degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/company-research":{"get":{"operationId":"anonymous_company_research","tags":["research"],"summary":"Run the anonymous company-research workflow","description":"Top-level anonymous company-research workflow for canonical capability company-research (fixed Tier C: 3 valid requests per trusted client-IP bucket per UTC calendar day). A valid request is admitted once, before the read-only server-side fan-out; the url-to-markdown, brand-kit, and brand-logo primitives composed inside the workflow are server-owned and never charged a second anonymous bucket. Malformed input is rejected before admission; admitted provider failures consume one unit. X-RateLimit-Limit is 3, X-RateLimit-Remaining is the Tier C bucket balance, and X-RateLimit-Reset is the next UTC midnight Unix timestamp. Redis failure returns 503 degraded.","security":[],"parameters":[{"name":"domain","in":"query","required":true,"schema":{"type":"string","description":"Company domain, e.g. stripe.com. A bare public hostname only: no scheme, port, path, or credentials."}}],"responses":{"200":{"description":"Composed read-only research dossier; quota headers are included.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResearchWorkflowResponse"}}}},"400":{"description":"Invalid or blocked domain."},"429":{"description":"Anonymous daily quota exhausted. Includes X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, Retry-After, and the typed continuation.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}},"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnonymousQuotaError"}}}},"502":{"description":"Normalized error with code upstream_unavailable when every primitive read fails."},"503":{"description":"Shared Redis unavailable; request rejected closed."}}}},"/v1/competitor-research":{"get":{"operationId":"anonymous_competitor_research","tags":["research"],"summary":"Run the anonymous competitor-research workflow","description":"Top-level anonymous competitor-research workflow for canonical capability competitor-research (fixed Tier C: 3 valid requests per trusted client-IP bucket per UTC calendar day). One admitted request fans out read-only to the company domain plus up to 5 competitor domains; the whole composition is charged once and primitives are never charged a second anonymous bucket. Malformed input (missing/invalid domain, empty/invalid/oversized competitor list) is rejected before admission. See /v1/company-research for the shared quota-header contract.","security":[],"parameters":[{"name":"domain","in":"query","required":true,"schema":{"type":"string","description":"Company domain, e.g. stripe.com."}},{"name":"competitors","in":"query","required":true,"schema":{"type":"string","description":"Comma-separated competitor domains (1..5), e.g. netlify.com,cloudflare.com."}}],"responses":{"200":{"description":"Composed read-only research dossier with one entry per target; quota headers are included.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResearchWorkflowResponse"}}}},"400":{"description":"Invalid or blocked domain, or an empty/invalid/oversized competitor list."},"429":{"description":"Anonymous daily quota exhausted. Includes X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, Retry-After, and the typed continuation.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}},"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnonymousQuotaError"}}}},"502":{"description":"Normalized error with code upstream_unavailable when every primitive read fails."},"503":{"description":"Shared Redis unavailable; request rejected closed."}}}},"/v1/reddit/search_posts":{"get":{"operationId":"search_posts","tags":["reddit"],"parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string"}},{"name":"sort","in":"query","schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100}}],"security":[],"responses":{"200":{"description":"Normalized read-only provider response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditResponse"}}}}}}},"/v1/reddit/subreddit_posts/{subreddit}":{"get":{"operationId":"subreddit_posts","tags":["reddit"],"parameters":[{"name":"subreddit","in":"path","required":true,"schema":{"type":"string"}},{"name":"category","in":"query","schema":{"type":"string"}},{"name":"time_filter","in":"query","schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100}}],"security":[],"responses":{"200":{"description":"Normalized read-only provider response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditResponse"}}}}}}},"/v1/reddit/post_by_id/{id}":{"get":{"operationId":"post_by_id","tags":["reddit"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Normalized read-only provider response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditResponse"}}}}}}},"/v1/reddit/post_by_permalink":{"get":{"operationId":"post_by_permalink","tags":["reddit"],"parameters":[{"name":"permalink","in":"query","required":true,"schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"Normalized read-only provider response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditResponse"}}}}}}},"/v1/reddit/user_activity/{username}":{"get":{"operationId":"user_activity","tags":["reddit"],"parameters":[{"name":"username","in":"path","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100}}],"security":[],"responses":{"200":{"description":"Normalized read-only provider response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditResponse"}}}}}}},"/v1/reddit/user_posts/{username}":{"get":{"operationId":"user_posts","tags":["reddit"],"parameters":[{"name":"username","in":"path","required":true,"schema":{"type":"string"}},{"name":"category","in":"query","schema":{"type":"string"}},{"name":"time_filter","in":"query","schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100}}],"security":[],"responses":{"200":{"description":"Normalized read-only provider response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditResponse"}}}}}}},"/v1/jobs/search":{"get":{"operationId":"job_search","summary":"Search Ashby job listings","description":"Search the hash-verified Ashby snapshot using literal filters and source order. Returns up to 10 jobs with the raw provider field omitted. A fresh successful logical search costs 10 credits, including an empty result; errors cost none. Same-identity calls replay the original response while its terminal snapshot is available. Without X-Idempotency-Key, identity is the canonical endpoint and query, so repeating an identical request replays it; send a new X-Idempotency-Key for a fresh logical search.","tags":["jobs"],"parameters":[{"name":"query","in":"query","required":false,"description":"Case-insensitive literal substring of the title; empty is a no-op.","schema":{"type":"string"}},{"name":"location","in":"query","required":false,"description":"Case-insensitive literal substring of location; empty is a no-op.","schema":{"type":"string"}},{"name":"company","in":"query","required":false,"description":"Case-insensitive literal substring of company; empty is a no-op.","schema":{"type":"string"}},{"name":"ats","in":"query","required":false,"description":"Ashby only; omitted or ashby selects the Ashby snapshot.","schema":{"type":"string"}},{"name":"remote","in":"query","required":false,"description":"Filter remote state. false matches only explicitly false rows.","schema":{"type":"boolean"}},{"name":"salary_min","in":"query","required":false,"description":"Minimum salary compared with each row salary_max.","schema":{"type":"number"}},{"name":"salary_max","in":"query","required":false,"description":"Maximum salary compared with each row salary_min.","schema":{"type":"number"}},{"name":"experience_max","in":"query","required":false,"description":"Unsupported because the Ashby snapshot has no experience field; any presence is rejected.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Maximum rows, in source order. Defaults to 10; allowed range is 1 through 10.","schema":{"type":"integer","minimum":1,"maximum":10,"default":10}},{"name":"X-Idempotency-Key","in":"header","required":false,"description":"Optional caller-supplied identity for a fresh logical search. Reusing the same key and query replays its terminal response; send a new key to request a fresh search.","schema":{"type":"string"}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful Ashby search. Each successful fresh logical search costs 10 credits, including an empty result.","headers":{"X-Request-Id":{"description":"Correlation identifier echoed as meta.request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobSearchResponse"}}}},"400":{"description":"Invalid or unsupported search input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"X-Request-Id":{"description":"Correlation identifier returned by the gateway.","schema":{"type":"string"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"X-Request-Id":{"description":"Correlation identifier returned by the gateway.","schema":{"type":"string"}}}},"402":{"description":"Prepaid credit balance is insufficient.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditTopupRequired"}}},"headers":{"X-Request-Id":{"description":"Correlation identifier returned by the gateway.","schema":{"type":"string"}}}},"409":{"description":"The same logical search is in progress or its terminal response snapshot is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"X-Request-Id":{"description":"Correlation identifier returned by the gateway.","schema":{"type":"string"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"Retry-After":{"description":"Seconds until the rate-limit window resets.","schema":{"type":"integer","minimum":1}},"X-Request-Id":{"description":"Correlation identifier returned by the gateway.","schema":{"type":"string"}}}},"500":{"description":"Gateway error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"X-Request-Id":{"description":"Correlation identifier returned by the gateway.","schema":{"type":"string"}}}},"502":{"description":"Job database or provider error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"X-Request-Id":{"description":"Correlation identifier returned by the gateway.","schema":{"type":"string"}}}},"503":{"description":"Billing or service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"X-Request-Id":{"description":"Correlation identifier returned by the gateway.","schema":{"type":"string"}}}},"504":{"description":"Search timed out.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"X-Request-Id":{"description":"Correlation identifier returned by the gateway.","schema":{"type":"string"}}}}}}}}}}},"meta":{"request_id":"65bbfa29-5233-4084-bf53-71803e8738b2"}}
