{"openapi":"3.1.0","info":{"title":"nfin Nasdaq API","version":"0.1.0","description":"Hosted, AI-friendly Nasdaq.com public data API for quotes, historical prices, options, calendars, IPOs, market movers, screeners, news, ownership, funds, ISEE, and Nasdaq Nordic workflows."},"servers":[{"url":"https://api.nfin.dev"}],"tags":[{"name":"System","description":"Health, OpenAPI, and endpoint discovery."},{"name":"Auth","description":"Email verification, API keys, key management, and custom limit requests."},{"name":"Search","description":"Symbol and instrument search."},{"name":"Quotes","description":"Nasdaq quote, chart, historical, dividend, EPS, and trade routes."},{"name":"Options","description":"Option chains, greeks, and most-active option routes."},{"name":"Calendars","description":"Earnings, dividends, splits, and upcoming event calendars."},{"name":"IPOs","description":"IPO calendar, overview, experts, financials, and filings."},{"name":"Markets","description":"Market info, lists, and movers."},{"name":"Screeners","description":"Nasdaq screener routes."},{"name":"Company Data","description":"Ownership and company-oriented data."},{"name":"Funds","description":"Fund section data."},{"name":"News","description":"Press-center and topic news."},{"name":"ISEE","description":"ISEE sentiment index data."},{"name":"Nordic","description":"Nasdaq Nordic search, listing, screener, instrument, and market data."}],"components":{"securitySchemes":{"nfinApiKey":{"type":"apiKey","in":"header","name":"X-Nfin-Key"},"bearerAuth":{"type":"http","scheme":"bearer"},"managementToken":{"type":"apiKey","in":"header","name":"X-Nfin-Management-Token"}},"schemas":{"GenericSuccessResponse":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"description":"Endpoint-specific response data."}},"additionalProperties":true},"HealthResponse":{"type":"object","properties":{"ok":{"type":"boolean"},"name":{"type":"string"},"version":{"type":"string"},"shipped_rest_contracts":{"type":"integer"},"identity":{"$ref":"#/components/schemas/IdentityPolicy"}},"required":["ok","name","version","shipped_rest_contracts"],"additionalProperties":false},"IdentityPolicy":{"type":"object","properties":{"anonymous":{"type":"string"},"contact":{"type":"string"},"auth":{"type":"string"},"key":{"type":"string"},"limits":{"type":"string"}},"additionalProperties":false},"EndpointCatalogResponse":{"type":"object","properties":{"shipped_contract_count":{"type":"integer"},"identity_policy":{"$ref":"#/components/schemas/IdentityPolicy"},"friendly_routes":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/EndpointCatalogRoute"}},"endpoints":{"type":"array","items":{"$ref":"#/components/schemas/EndpointCatalogItem"}}},"required":["shipped_contract_count","friendly_routes","endpoints"],"additionalProperties":false},"EndpointCatalogRoute":{"type":"object","properties":{"path":{"type":"string"}},"required":["path"],"additionalProperties":false},"EndpointCatalogItem":{"type":"object","properties":{"name":{"type":"string"},"path":{"type":"string"},"method":{"type":"string"},"auth_tier":{"type":"string"},"freshness":{"type":"object","properties":{"max_age_seconds":{"type":"integer"},"stale_while_revalidate_seconds":{"type":"integer"}},"additionalProperties":false},"description":{"type":"string"}},"required":["name","path","method","description"],"additionalProperties":false},"ResponseMeta":{"type":"object","properties":{"provider":{"type":"string","const":"nasdaq"},"route":{"type":"string"},"status":{"type":"string"},"generated_at":{"type":"string","format":"date-time"},"freshness":{"$ref":"#/components/schemas/Freshness"}},"required":["provider","route","generated_at"],"additionalProperties":false},"Freshness":{"type":"object","properties":{"as_of":{"type":"string","format":"date-time"},"max_age_seconds":{"type":"integer"},"stale":{"type":"boolean"}},"additionalProperties":false},"NfinMarketDataResponse":{"type":"object","properties":{"meta":{"$ref":"#/components/schemas/ResponseMeta"},"data":{"$ref":"#/components/schemas/NasdaqSourcePayload"}},"required":["meta","data"],"additionalProperties":true},"NasdaqSourcePayload":{"type":"object","properties":{"data":{"oneOf":[{"type":"object","additionalProperties":true},{"type":"array","items":{"type":"object","additionalProperties":true}},{"type":"string"},{"type":"null"}],"description":"Provider payload from Nasdaq. Shape varies by route; table routes commonly expose data.headers and data.rows."},"message":{"type":["string","null"]},"messages":{"type":["array","null"],"items":{"type":"object","additionalProperties":true}},"status":{"$ref":"#/components/schemas/NasdaqStatus"}},"additionalProperties":true},"NasdaqStatus":{"type":"object","properties":{"rCode":{"type":"integer"},"bCodeMessage":{"type":["string","null"]},"developerMessage":{"type":["string","null"]}},"additionalProperties":true},"NasdaqTable":{"type":"object","properties":{"asOf":{"type":["string","null"]},"headers":{"type":"object","additionalProperties":{"type":"string"}},"rows":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":true}}},"additionalProperties":true},"AuthOtpRequest":{"type":"object","properties":{"email":{"type":"string","format":"email"}},"required":["email"],"additionalProperties":false},"AuthOtpResponse":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"data":{"type":"object","properties":{"email":{"type":"string","format":"email"},"expires_in_seconds":{"type":"integer"},"delivery":{"type":"string"},"message_id":{"type":"string"}},"required":["email","expires_in_seconds","delivery"],"additionalProperties":false}},"required":["ok","data"],"additionalProperties":false},"AuthVerifyRequest":{"type":"object","properties":{"email":{"type":"string","format":"email"},"code":{"type":"string"},"label":{"type":"string"},"create_key":{"type":"boolean"},"expires_in_days":{"type":"integer"}},"required":["email","code"],"additionalProperties":false},"ApiKeyRecord":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string","format":"email"},"label":{"type":["string","null"]},"created_at":{"type":"integer"},"expires_at":{"type":"integer"},"revoked_at":{"type":["integer","null"]},"last_used_at":{"type":["integer","null"]},"requests_per_minute":{"type":"integer"},"origin_per_minute":{"type":"integer"}},"required":["id","email","created_at","expires_at"],"additionalProperties":false},"AuthVerifyResponse":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"data":{"type":"object","properties":{"email":{"type":"string","format":"email"},"management_token":{"type":"string"},"token_type":{"type":"string"},"management_expires_in_seconds":{"type":"integer"},"api_key":{"type":"string"},"key":{"$ref":"#/components/schemas/ApiKeyRecord"}},"required":["email","management_token","token_type","management_expires_in_seconds"],"additionalProperties":false}},"required":["ok","data"],"additionalProperties":false},"ApiKeysResponse":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"data":{"type":"object","properties":{"email":{"type":"string","format":"email"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/ApiKeyRecord"}}},"required":["email","keys"],"additionalProperties":false}},"required":["ok","data"],"additionalProperties":false},"ApiKeyCreateRequest":{"type":"object","properties":{"label":{"type":"string"},"expires_in_days":{"type":"integer","minimum":1}},"additionalProperties":false},"ApiKeyCreateResponse":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"data":{"type":"object","properties":{"api_key":{"type":"string"},"key":{"$ref":"#/components/schemas/ApiKeyRecord"}},"required":["api_key","key"],"additionalProperties":false}},"required":["ok","data"],"additionalProperties":false},"ApiKeyRevokeResponse":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"data":{"type":"object","properties":{"id":{"type":"string"},"revoked":{"type":"boolean"},"revoked_at":{"type":"integer"}},"required":["id","revoked","revoked_at"],"additionalProperties":false}},"required":["ok","data"],"additionalProperties":false},"ApiKeyRotateResponse":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"data":{"type":"object","properties":{"revoked_key_id":{"type":"string"},"api_key":{"type":"string"},"key":{"$ref":"#/components/schemas/ApiKeyRecord"}},"required":["revoked_key_id","api_key","key"],"additionalProperties":false}},"required":["ok","data"],"additionalProperties":false},"AuthLimitRequest":{"type":"object","properties":{"requested_rps":{"type":"number"},"requested_origin_rps":{"type":"number"},"use_case":{"type":"string"},"message":{"type":"string"}},"required":["use_case"],"additionalProperties":false},"AuthLimitRequestResponse":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"data":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string","format":"email"},"status":{"type":"string"},"notification":{"type":"object","additionalProperties":true},"message":{"type":"string"}},"required":["id","email","status","message"],"additionalProperties":false}},"required":["ok","data"],"additionalProperties":false},"ErrorDetail":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false},"ErrorResponse":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"$ref":"#/components/schemas/ErrorDetail"},"allow":{"type":"array","items":{"type":"string"}},"meta":{"type":"object","additionalProperties":true}},"required":["ok","error"],"additionalProperties":true},"RateLimitResponse":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"$ref":"#/components/schemas/ErrorDetail"},"rate_limit":{"type":"object","properties":{"scope":{"type":"string"},"tier":{"type":"string"},"retry_after_seconds":{"type":"integer","minimum":1},"upgrade":{"type":"object","additionalProperties":true}},"required":["scope","tier"],"additionalProperties":true}},"required":["ok","error","rate_limit"],"additionalProperties":false},"CalendarDividendsResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Dividend calendar response. The data field contains the Nasdaq payload for Dividend Calendar. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"CalendarEarningsResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Earnings calendar response. The data field contains the Nasdaq payload for Earnings Calendar. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"CalendarSplitsResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Split calendar response. The data field contains the Nasdaq payload for Split Calendar. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"CalendarUpcomingResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Upcoming calendar response. The data field contains the Nasdaq payload for Upcoming Calendar Events. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"CalendarUpcomingRecentResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Upcoming and recent calendar response. The data field contains the Nasdaq payload for Upcoming And Recent Calendar Events. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"CompanyOwnershipResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Company ownership response. The data field contains the Nasdaq payload for Company Ownership. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"FundSectionResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Fund section response. The data field contains the Nasdaq payload for Fund Section. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"IpoCalendarResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"IPO calendar response. The data field contains the Nasdaq payload for IPO Calendar. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"IpoExpertsResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"IPO experts response. The data field contains the Nasdaq payload for IPO Experts. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"IpoFilingsResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"IPO financials and filings response. The data field contains the Nasdaq payload for IPO Financials And Filings. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"IpoOverviewResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"IPO overview response. The data field contains the Nasdaq payload for IPO Overview. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"IseeResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"ISEE index response. The data field contains the Nasdaq payload for ISEE Index. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"IseeChartResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"ISEE chart response. The data field contains the Nasdaq payload for ISEE Chart. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"IseeDownloadResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"ISEE download response. The data field contains the Nasdaq payload for ISEE Download. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"ListTypeResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Market list response. The data field contains the Nasdaq payload for Market List. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"ListTypeExtendedResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Extended market list response. The data field contains the Nasdaq payload for Extended Market List. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"MarketInfoResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Market info response. The data field contains the Nasdaq payload for Market Info. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"MarketMoversResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Market movers response. The data field contains the Nasdaq payload for Market Movers. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"NewsPressCenterResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Press center news response. The data field contains the Nasdaq payload for Press Center News. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"NewsTopicResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Topic news response. The data field contains the Nasdaq payload for Topic News. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"NordicInstrumentInfoResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Nordic instrument info response. The data field contains the Nasdaq payload for Nordic Instrument Info. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"NordicInstrumentPriceInfoResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Nordic instrument price info response. The data field contains the Nasdaq payload for Nordic Instrument Price Info. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"NordicInstrumentSummaryResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Nordic instrument summary response. The data field contains the Nasdaq payload for Nordic Instrument Summary. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"NordicInstrumentTradesResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Nordic instrument trades response. The data field contains the Nasdaq payload for Nordic Instrument Trades. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"NordicListingResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Nordic listing response. The data field contains the Nasdaq payload for Nordic Listing. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"NordicMarketMoversResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Nordic market movers response. The data field contains the Nasdaq payload for Nordic Market Movers. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"NordicScreenerResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Nordic screener response. The data field contains the Nasdaq payload for Nordic Screener. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"NordicSearchResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Nordic search response. The data field contains the Nasdaq payload for Nordic Search. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"NordicStarKeyStatsResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Nordic Star key stats response. The data field contains the Nasdaq payload for Nordic Star Key Stats. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"QuoteBasicResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Batch quotes response. The data field contains the Nasdaq payload for Batch Quotes. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"QuoteChartResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Quote chart response. The data field contains the Nasdaq payload for Quote Chart. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"QuoteDividendsResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Quote dividends response. The data field contains the Nasdaq payload for Quote Dividends. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"QuoteEpsResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Quote EPS response. The data field contains the Nasdaq payload for Quote EPS. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"QuoteExtendedResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Extended trading response. The data field contains the Nasdaq payload for Extended Trading. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"QuoteHistoricalResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Historical prices response. The data field contains the Nasdaq payload for Historical Prices. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"QuoteIndicesResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Index quotes response. The data field contains the Nasdaq payload for Index Quotes. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"QuoteInfoResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Quote info response. The data field contains the Nasdaq payload for Quote Info. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"QuoteOptionsResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Options chain response. The data field contains the Nasdaq payload for Options Chain. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"QuoteOptionsGreeksResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Options greeks response. The data field contains the Nasdaq payload for Options Greeks. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"QuoteOptionsMostActiveResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Most active options response. The data field contains the Nasdaq payload for Most Active Options. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"QuoteRealtimeTradesResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Realtime trades response. The data field contains the Nasdaq payload for Realtime Trades. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"QuoteShortInterestResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Short interest response. The data field contains the Nasdaq payload for Short Interest. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"QuoteSummaryResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Quote summary response. The data field contains the Nasdaq payload for Quote Summary. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"QuoteWatchlistResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Watchlist quotes response. The data field contains the Nasdaq payload for Watchlist Quotes. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"ScreenerResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Screener response. The data field contains the Nasdaq payload for Screener. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."},"SearchResponse":{"allOf":[{"$ref":"#/components/schemas/NfinMarketDataResponse"}],"description":"Symbol search response. The data field contains the Nasdaq payload for Symbol Search. Table-style payloads usually expose data.data.headers and data.data.rows; search payloads commonly expose data.data as an array."}}},"paths":{"/v1/health":{"get":{"tags":["System"],"operationId":"getHealth","summary":"Service health.","description":"Returns basic nfin service status, shipped REST contract count, and auth/rate-limit guidance.","responses":{"200":{"description":"Health response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"},"examples":{"success":{"summary":"Success","value":{"ok":true,"name":"nfin","version":"0.1.0","shipped_rest_contracts":107,"identity":{"anonymous":"Works without setup with IP-based limits.","contact":"Send X-Nfin-Contact or SDK contact= for higher no-key limits and support metadata.","auth":"Create API keys by requesting an email code at /v1/auth/otp and verifying it at /v1/auth/verify.","key":"Send Authorization: Bearer <api_key> or X-Nfin-Key for higher production limits.","limits":"When key-tier limits are too low, email sam@nfin.dev or POST /v1/auth/limits/requests with an API key."}}}}}}}}}},"/v1/endpoints":{"get":{"tags":["System"],"operationId":"listEndpoints","summary":"Endpoint Catalog","description":"Returns the machine-readable catalog of supported nfin endpoints. Use this for tool discovery, code generation, and agents that need to inspect available routes programmatically.","responses":{"200":{"description":"Endpoint catalog.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndpointCatalogResponse"},"examples":{"success":{"summary":"Success","value":{"shipped_contract_count":46,"identity_policy":{"anonymous":"Works without setup with IP-based limits.","contact":"Send X-Nfin-Contact or SDK contact= for higher no-key limits and support metadata.","auth":"Create API keys by requesting an email code at /v1/auth/otp and verifying it at /v1/auth/verify.","key":"Send Authorization: Bearer <api_key> or X-Nfin-Key for higher production limits.","limits":"When key-tier limits are too low, email sam@nfin.dev or POST /v1/auth/limits/requests with an API key."},"friendly_routes":{"search":{"path":"/v1/search"},"quote_summary":{"path":"/v1/quote/{symbol}/summary"}},"endpoints":[{"name":"search","path":"/v1/search","method":"GET","auth_tier":"open","freshness":{"max_age_seconds":300,"stale_while_revalidate_seconds":3600},"description":"Search Nasdaq symbols, companies, ETFs, funds, and other instruments by text query."}]}}}}}}}}},"/v1/auth/otp":{"post":{"tags":["Auth"],"operationId":"requestAuthOtp","summary":"Request Email Verification Code","description":"Sends a short-lived verification code to an email address. Use this before creating nfin API keys.","requestBody":{"required":true,"description":"Email address to verify.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthOtpRequest"},"examples":{"default":{"summary":"Request","value":{"email":"developer@example.com"}}}}}},"responses":{"202":{"description":"Verification code accepted for delivery.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthOtpResponse"},"examples":{"success":{"summary":"Success","value":{"ok":true,"data":{"email":"developer@example.com","expires_in_seconds":600,"delivery":"email","message_id":"<message-id@nfin.dev>"}}}}}}},"400":{"description":"Invalid email or JSON body.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"A valid email is required.","value":{"ok":false,"error":{"code":"bad_request","message":"A valid email is required."}}}}}}},"403":{"description":"Email is not eligible for API key access.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"email_not_eligible":{"summary":"This email is not eligible for API key access. Use another email or contact support.","value":{"ok":false,"error":{"code":"email_not_eligible","message":"This email is not eligible for API key access. Use another email or contact support."}}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"503":{"description":"Auth storage or email delivery is unavailable.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"auth_not_configured":{"summary":"API key authentication is not configured.","value":{"ok":false,"error":{"code":"auth_not_configured","message":"API key authentication is not configured."}}},"email_delivery_failed":{"summary":"Could not send verification email. Retry shortly.","value":{"ok":false,"error":{"code":"email_delivery_failed","message":"Could not send verification email. Retry shortly."}}}}}}}}}},"/v1/auth/verify":{"post":{"tags":["Auth"],"operationId":"verifyAuthOtp","summary":"Verify Email Code","description":"Verifies the email code and returns a short-lived management token. By default, it also creates an API key.","requestBody":{"required":true,"description":"Verification code and optional key settings.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthVerifyRequest"},"examples":{"default":{"summary":"Request","value":{"email":"developer@example.com","code":"123456","label":"agent","expires_in_days":90}}}}}},"responses":{"200":{"description":"Email verified.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthVerifyResponse"},"examples":{"success":{"summary":"Success","value":{"ok":true,"data":{"email":"developer@example.com","management_token":"nfin_mgmt_<token>","token_type":"Bearer","management_expires_in_seconds":86400,"api_key":"nfin_live_<id>_<secret>","key":{"id":"key_123","email":"developer@example.com","label":"agent","created_at":1779991200,"expires_at":1787767200,"revoked_at":null,"last_used_at":null,"requests_per_minute":30000,"origin_per_minute":3000}}}}}}}},"400":{"description":"Invalid or expired verification code.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"A valid email and 6-digit code are required.","value":{"ok":false,"error":{"code":"bad_request","message":"A valid email and 6-digit code are required."}}},"invalid_code":{"summary":"Verification code is invalid or expired.","value":{"ok":false,"error":{"code":"invalid_code","message":"Verification code is invalid or expired."}}}}}}},"403":{"description":"Email is not eligible for API key access.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"email_not_eligible":{"summary":"This email is not eligible for API key access. Use another email or contact support.","value":{"ok":false,"error":{"code":"email_not_eligible","message":"This email is not eligible for API key access. Use another email or contact support."}}}}}}},"429":{"description":"Too many verification attempts.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"too_many_attempts":{"summary":"Too many verification attempts. Request a new code.","value":{"ok":false,"error":{"code":"too_many_attempts","message":"Too many verification attempts. Request a new code."}}}}}}},"503":{"description":"Auth storage is unavailable.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"auth_not_configured":{"summary":"API key authentication is not configured.","value":{"ok":false,"error":{"code":"auth_not_configured","message":"API key authentication is not configured."}}}}}}}}}},"/v1/auth/keys":{"get":{"tags":["Auth"],"operationId":"listApiKeys","summary":"List API Keys","description":"Lists API keys for the verified email tied to the management token.","parameters":[{"name":"X-Nfin-Management-Token","in":"header","required":false,"schema":{"type":"string"},"description":"Management token returned by /v1/auth/verify. Authorization: Bearer is also supported."},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer API key or management token, depending on endpoint."}],"responses":{"200":{"description":"API keys for the verified email.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeysResponse"},"examples":{"success":{"summary":"Success","value":{"ok":true,"data":{"email":"developer@example.com","keys":[{"id":"key_123","email":"developer@example.com","label":"agent","created_at":1779991200,"expires_at":1787767200,"revoked_at":null,"last_used_at":null,"requests_per_minute":30000,"origin_per_minute":3000}]}}}}}}},"401":{"description":"Management token is missing, invalid, or expired.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"unauthorized":{"summary":"Management token is required.","value":{"ok":false,"error":{"code":"unauthorized","message":"Management token is required."}}}}}}},"503":{"description":"Auth storage is unavailable.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"auth_not_configured":{"summary":"API key authentication is not configured.","value":{"ok":false,"error":{"code":"auth_not_configured","message":"API key authentication is not configured."}}}}}}}}},"post":{"tags":["Auth"],"operationId":"createApiKey","summary":"Create API Key","description":"Creates a new API key for the verified email tied to the management token.","parameters":[{"name":"X-Nfin-Management-Token","in":"header","required":false,"schema":{"type":"string"},"description":"Management token returned by /v1/auth/verify. Authorization: Bearer is also supported."},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer API key or management token, depending on endpoint."}],"requestBody":{"required":false,"description":"Optional key label and expiry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateRequest"},"examples":{"default":{"summary":"Request","value":{"label":"production agent","expires_in_days":90}}}}}},"responses":{"201":{"description":"New API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateResponse"},"examples":{"success":{"summary":"Success","value":{"ok":true,"data":{"api_key":"nfin_live_<id>_<secret>","key":{"id":"key_123","email":"developer@example.com","label":"agent","created_at":1779991200,"expires_at":1787767200,"revoked_at":null,"last_used_at":null,"requests_per_minute":30000,"origin_per_minute":3000}}}}}}}},"400":{"description":"Invalid JSON body.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid JSON body.","value":{"ok":false,"error":{"code":"bad_request","message":"Invalid JSON body."}}}}}}},"401":{"description":"Management token is missing, invalid, or expired.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"unauthorized":{"summary":"Management token is required.","value":{"ok":false,"error":{"code":"unauthorized","message":"Management token is required."}}}}}}},"403":{"description":"Email is not eligible for API key access.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"email_not_eligible":{"summary":"This email is not eligible for API key access. Use another email or contact support.","value":{"ok":false,"error":{"code":"email_not_eligible","message":"This email is not eligible for API key access. Use another email or contact support."}}}}}}},"503":{"description":"Auth storage is unavailable.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"auth_not_configured":{"summary":"API key authentication is not configured.","value":{"ok":false,"error":{"code":"auth_not_configured","message":"API key authentication is not configured."}}}}}}}}}},"/v1/auth/keys/{key_id}":{"delete":{"tags":["Auth"],"operationId":"revokeApiKey","summary":"Revoke API Key","description":"Revokes one API key owned by the verified email tied to the management token.","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string"},"description":"API key ID to revoke."},{"name":"X-Nfin-Management-Token","in":"header","required":false,"schema":{"type":"string"},"description":"Management token returned by /v1/auth/verify. Authorization: Bearer is also supported."},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer API key or management token, depending on endpoint."}],"responses":{"200":{"description":"API key revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyRevokeResponse"},"examples":{"success":{"summary":"Success","value":{"ok":true,"data":{"id":"key_123","revoked":true,"revoked_at":1779991200}}}}}}},"401":{"description":"Management token is missing, invalid, or expired.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"unauthorized":{"summary":"Management token is required.","value":{"ok":false,"error":{"code":"unauthorized","message":"Management token is required."}}}}}}},"404":{"description":"API key was not found.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"API key was not found.","value":{"ok":false,"error":{"code":"not_found","message":"API key was not found."}}}}}}},"503":{"description":"Auth storage is unavailable.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"auth_not_configured":{"summary":"API key authentication is not configured.","value":{"ok":false,"error":{"code":"auth_not_configured","message":"API key authentication is not configured."}}}}}}}}}},"/v1/auth/keys/{key_id}/rotate":{"post":{"tags":["Auth"],"operationId":"rotateApiKey","summary":"Rotate API Key","description":"Revokes one API key and creates a replacement key for the same verified email.","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string"},"description":"API key ID to rotate."},{"name":"X-Nfin-Management-Token","in":"header","required":false,"schema":{"type":"string"},"description":"Management token returned by /v1/auth/verify. Authorization: Bearer is also supported."},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer API key or management token, depending on endpoint."}],"requestBody":{"required":false,"description":"Optional replacement key label and expiry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateRequest"},"examples":{"default":{"summary":"Request","value":{"label":"rotated production agent","expires_in_days":90}}}}}},"responses":{"200":{"description":"API key rotated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyRotateResponse"},"examples":{"success":{"summary":"Success","value":{"ok":true,"data":{"revoked_key_id":"key_123","api_key":"nfin_live_<new_id>_<secret>","key":{"id":"key_456","email":"developer@example.com","label":"agent","created_at":1779991200,"expires_at":1787767200,"revoked_at":null,"last_used_at":null,"requests_per_minute":30000,"origin_per_minute":3000}}}}}}}},"400":{"description":"Invalid JSON body.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid JSON body.","value":{"ok":false,"error":{"code":"bad_request","message":"Invalid JSON body."}}}}}}},"401":{"description":"Management token is missing, invalid, or expired.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"unauthorized":{"summary":"Management token is required.","value":{"ok":false,"error":{"code":"unauthorized","message":"Management token is required."}}}}}}},"403":{"description":"Email is not eligible for API key access.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"email_not_eligible":{"summary":"This email is not eligible for API key access. Use another email or contact support.","value":{"ok":false,"error":{"code":"email_not_eligible","message":"This email is not eligible for API key access. Use another email or contact support."}}}}}}},"404":{"description":"API key was not found.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"API key was not found.","value":{"ok":false,"error":{"code":"not_found","message":"API key was not found."}}}}}}},"409":{"description":"API key is already revoked.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"key_revoked":{"summary":"API key is already revoked.","value":{"ok":false,"error":{"code":"key_revoked","message":"API key is already revoked."}}}}}}},"503":{"description":"Auth storage is unavailable.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"auth_not_configured":{"summary":"API key authentication is not configured.","value":{"ok":false,"error":{"code":"auth_not_configured","message":"API key authentication is not configured."}}}}}}}}}},"/v1/auth/limits/requests":{"post":{"tags":["Auth"],"operationId":"requestCustomRateLimit","summary":"Request Custom Rate Limits","description":"Submits a custom RPS request for the authenticated API key. This is intended for agents and automated workflows and is limited to 1 request per minute per API key.","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer API key or management token, depending on endpoint."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"requestBody":{"required":true,"description":"Requested custom rate limits and use case.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthLimitRequest"},"examples":{"default":{"summary":"Request","value":{"requested_rps":50,"requested_origin_rps":5,"use_case":"production agent workload","message":"Short description of traffic pattern and data needed."}}}}}},"responses":{"202":{"description":"Custom rate-limit request received.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthLimitRequestResponse"},"examples":{"success":{"summary":"Success","value":{"ok":true,"data":{"id":"req_123","email":"developer@example.com","status":"received","notification":{"sent":true},"message":"Custom rate-limit request received. You can also email sam@nfin.dev."}}}}}}},"400":{"description":"Invalid JSON body.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid JSON body.","value":{"ok":false,"error":{"code":"bad_request","message":"Invalid JSON body."}}}}}}},"401":{"description":"API key is missing or inactive.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"api_key_required":{"summary":"API key is required to request custom rate limits.","value":{"ok":false,"error":{"code":"api_key_required","message":"API key is required to request custom rate limits."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"503":{"description":"Auth storage is unavailable.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"auth_not_configured":{"summary":"API key authentication is not configured.","value":{"ok":false,"error":{"code":"auth_not_configured","message":"API key authentication is not configured."}}}}}}}}}},"/v1/calendar/dividends":{"get":{"tags":["Calendars"],"operationId":"getCalendarDividends","summary":"Dividend Calendar","description":"Nasdaq dividend calendar events, including ex-dividend dates, payment dates, indicated annual dividends, and yield-oriented table rows.","parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"asset_class","in":"query","required":false,"schema":{"type":"string","examples":["stocks","etf","mutualfunds"]},"description":"Asset class alias. Maps to Nasdaq assetclass/assetClass. Common values include stocks, etf, mutualfunds, and indexes."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Dividend calendar response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CalendarDividendsResponse"},"examples":{"success":{"summary":"Calendar Dividends success","value":{"meta":{"provider":"nasdaq","route":"calendar_dividends","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{"asOf":"Thu, May 28, 2026","headers":{"symbol":"Symbol","name":"Company Name"},"rows":[{"symbol":"COST","name":"Costco Wholesale Corporation","fiscalQuarterEnding":"May/2026"}]},"message":null,"status":{"rCode":200}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"Invalid request parameters."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"calendar_dividends"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"calendar_dividends"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/calendar/earnings":{"get":{"tags":["Calendars"],"operationId":"getCalendarEarnings","summary":"Earnings Calendar","description":"Nasdaq earnings calendar events, including report timing, company name, market cap, fiscal quarter, consensus EPS forecast, and prior-year EPS fields.","parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"asset_class","in":"query","required":false,"schema":{"type":"string","examples":["stocks","etf","mutualfunds"]},"description":"Asset class alias. Maps to Nasdaq assetclass/assetClass. Common values include stocks, etf, mutualfunds, and indexes."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Earnings calendar response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CalendarEarningsResponse"},"examples":{"success":{"summary":"Calendar Earnings success","value":{"meta":{"provider":"nasdaq","route":"calendar_earnings","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{"asOf":"Thu, May 28, 2026","headers":{"symbol":"Symbol","name":"Company Name"},"rows":[{"symbol":"COST","name":"Costco Wholesale Corporation","fiscalQuarterEnding":"May/2026"}]},"message":null,"status":{"rCode":200}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"Invalid request parameters."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"calendar_earnings"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"calendar_earnings"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/calendar/splits":{"get":{"tags":["Calendars"],"operationId":"getCalendarSplits","summary":"Split Calendar","description":"Nasdaq split calendar events with symbol, company name, split ratio, execution date, and related split metadata when Nasdaq publishes it.","parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"asset_class","in":"query","required":false,"schema":{"type":"string","examples":["stocks","etf","mutualfunds"]},"description":"Asset class alias. Maps to Nasdaq assetclass/assetClass. Common values include stocks, etf, mutualfunds, and indexes."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Split calendar response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CalendarSplitsResponse"},"examples":{"success":{"summary":"Calendar Splits success","value":{"meta":{"provider":"nasdaq","route":"calendar_splits","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{"asOf":"Thu, May 28, 2026","headers":{"symbol":"Symbol","name":"Company Name"},"rows":[{"symbol":"COST","name":"Costco Wholesale Corporation","fiscalQuarterEnding":"May/2026"}]},"message":null,"status":{"rCode":200}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"Invalid request parameters."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"calendar_splits"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"calendar_splits"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/calendar/upcoming":{"get":{"tags":["Calendars"],"operationId":"getCalendarUpcoming","summary":"Upcoming Calendar Events","description":"Upcoming Nasdaq calendar events across supported event types.","parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"asset_class","in":"query","required":false,"schema":{"type":"string","examples":["stocks","etf","mutualfunds"]},"description":"Asset class alias. Maps to Nasdaq assetclass/assetClass. Common values include stocks, etf, mutualfunds, and indexes."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Upcoming calendar response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CalendarUpcomingResponse"},"examples":{"success":{"summary":"Calendar Upcoming success","value":{"meta":{"provider":"nasdaq","route":"calendar_upcoming","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{"asOf":"Thu, May 28, 2026","headers":{"symbol":"Symbol","name":"Company Name"},"rows":[{"symbol":"COST","name":"Costco Wholesale Corporation","fiscalQuarterEnding":"May/2026"}]},"message":null,"status":{"rCode":200}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"Invalid request parameters."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"calendar_upcoming"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"calendar_upcoming"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/calendar/upcoming-recent":{"get":{"tags":["Calendars"],"operationId":"getCalendarUpcomingRecent","summary":"Upcoming And Recent Calendar Events","description":"Upcoming and recent Nasdaq event rows for workflows that need nearby corporate actions and event history.","parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"asset_class","in":"query","required":false,"schema":{"type":"string","examples":["stocks","etf","mutualfunds"]},"description":"Asset class alias. Maps to Nasdaq assetclass/assetClass. Common values include stocks, etf, mutualfunds, and indexes."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Upcoming and recent calendar response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CalendarUpcomingRecentResponse"},"examples":{"success":{"summary":"Calendar Upcoming Recent success","value":{"meta":{"provider":"nasdaq","route":"calendar_upcoming_recent","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{"asOf":"Thu, May 28, 2026","headers":{"symbol":"Symbol","name":"Company Name"},"rows":[{"symbol":"COST","name":"Costco Wholesale Corporation","fiscalQuarterEnding":"May/2026"}]},"message":null,"status":{"rCode":200}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"Invalid request parameters."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"calendar_upcoming_recent"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"calendar_upcoming_recent"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/company/ownership":{"get":{"tags":["Company Data"],"operationId":"getCompanyOwnership","summary":"Company Ownership","description":"Institutional and insider ownership search data for a company or symbol when Nasdaq publishes ownership rows.","parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Company ownership response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyOwnershipResponse"},"examples":{"success":{"summary":"Company Ownership success","value":{"meta":{"provider":"nasdaq","route":"company_ownership","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{},"message":null,"status":{"rCode":200,"bCodeMessage":null,"developerMessage":null}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"Invalid request parameters."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"company_ownership"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"company_ownership"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/funds/{symbol}/section":{"get":{"tags":["Funds"],"operationId":"getFundSection","summary":"Fund Section","description":"Nasdaq fund section data for one symbol. Use the section query parameter to request portfolio, holdings, performance, risk, or other supported fund sections.","parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string"},"description":"Ticker or fund symbol, for example AAPL or FXAIX."},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"section","in":"query","required":false,"schema":{"type":"string"},"description":"Fund section to request when supported by the upstream Nasdaq route."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Fund section response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FundSectionResponse"},"examples":{"success":{"summary":"Fund Section success","value":{"meta":{"provider":"nasdaq","route":"fund_section","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{},"message":null,"status":{"rCode":200,"bCodeMessage":null,"developerMessage":null}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"Invalid request parameters."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"fund_section"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"fund_section"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/ipo/calendar":{"get":{"tags":["IPOs"],"operationId":"getIpoCalendar","summary":"IPO Calendar","description":"Nasdaq IPO calendar data, including upcoming, priced, withdrawn, and filed IPO tables when available.","parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"IPO calendar response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IpoCalendarResponse"},"examples":{"success":{"summary":"IPO Calendar success","value":{"meta":{"provider":"nasdaq","route":"ipo_calendar","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{"priced":{"asOf":null,"headers":{"proposedTickerSymbol":"Symbol","companyName":"Company Name","proposedExchange":"Exchange/ Market"},"rows":[{"proposedTickerSymbol":"EXMP","companyName":"Example Corp","proposedExchange":"NASDAQ Global","dealStatus":"Priced"}]}},"message":null,"status":{"rCode":200}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"Invalid request parameters."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"ipo_calendar"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"ipo_calendar"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/ipo/experts":{"get":{"tags":["IPOs"],"operationId":"getIpoExperts","summary":"IPO Experts","description":"Nasdaq IPO expert and analyst-oriented data for IPO workflows.","parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"IPO experts response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IpoExpertsResponse"},"examples":{"success":{"summary":"IPO Experts success","value":{"meta":{"provider":"nasdaq","route":"ipo_experts","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{"priced":{"asOf":null,"headers":{"proposedTickerSymbol":"Symbol","companyName":"Company Name","proposedExchange":"Exchange/ Market"},"rows":[{"proposedTickerSymbol":"EXMP","companyName":"Example Corp","proposedExchange":"NASDAQ Global","dealStatus":"Priced"}]}},"message":null,"status":{"rCode":200}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"Invalid request parameters."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"ipo_experts"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"ipo_experts"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/ipo/financials-filings":{"get":{"tags":["IPOs"],"operationId":"getIpoFilings","summary":"IPO Financials And Filings","description":"Nasdaq IPO financials and filings tables, including filing status and document-oriented fields when available.","parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"IPO financials and filings response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IpoFilingsResponse"},"examples":{"success":{"summary":"IPO Filings success","value":{"meta":{"provider":"nasdaq","route":"ipo_filings","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{"priced":{"asOf":null,"headers":{"proposedTickerSymbol":"Symbol","companyName":"Company Name","proposedExchange":"Exchange/ Market"},"rows":[{"proposedTickerSymbol":"EXMP","companyName":"Example Corp","proposedExchange":"NASDAQ Global","dealStatus":"Priced"}]}},"message":null,"status":{"rCode":200}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"Invalid request parameters."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"ipo_filings"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"ipo_filings"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/ipo/overview":{"get":{"tags":["IPOs"],"operationId":"getIpoOverview","summary":"IPO Overview","description":"Nasdaq IPO overview data for current and recent IPO activity.","parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"IPO overview response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IpoOverviewResponse"},"examples":{"success":{"summary":"IPO Overview success","value":{"meta":{"provider":"nasdaq","route":"ipo_overview","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{"priced":{"asOf":null,"headers":{"proposedTickerSymbol":"Symbol","companyName":"Company Name","proposedExchange":"Exchange/ Market"},"rows":[{"proposedTickerSymbol":"EXMP","companyName":"Example Corp","proposedExchange":"NASDAQ Global","dealStatus":"Priced"}]}},"message":null,"status":{"rCode":200}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"Invalid request parameters."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"ipo_overview"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"ipo_overview"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/isee":{"get":{"tags":["ISEE"],"operationId":"getIsee","summary":"ISEE Index","description":"Nasdaq ISEE index data for equity and ETF option sentiment workflows.","parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"ISEE index response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IseeResponse"},"examples":{"success":{"summary":"ISEE success","value":{"meta":{"provider":"nasdaq","route":"isee","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{},"message":null,"status":{"rCode":200,"bCodeMessage":null,"developerMessage":null}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"Invalid request parameters."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"isee"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"isee"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/isee/chart":{"get":{"tags":["ISEE"],"operationId":"getIseeChart","summary":"ISEE Chart","description":"Chart-ready ISEE index series for equity and ETF option sentiment analysis.","parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"ISEE chart response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IseeChartResponse"},"examples":{"success":{"summary":"ISEE Chart success","value":{"meta":{"provider":"nasdaq","route":"isee_chart","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{},"message":null,"status":{"rCode":200,"bCodeMessage":null,"developerMessage":null}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"Invalid request parameters."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"isee_chart"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"isee_chart"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/isee/download":{"get":{"tags":["ISEE"],"operationId":"getIseeDownload","summary":"ISEE Download","description":"Download-style ISEE index data returned through the nfin JSON envelope.","parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"ISEE download response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IseeDownloadResponse"},"examples":{"success":{"summary":"ISEE Download success","value":{"meta":{"provider":"nasdaq","route":"isee_download","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{},"message":null,"status":{"rCode":200,"bCodeMessage":null,"developerMessage":null}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"Invalid request parameters."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"isee_download"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"isee_download"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/markets/lists/{list_id}":{"get":{"tags":["Markets"],"operationId":"getListType","summary":"Market List","description":"Nasdaq market list rows for a list identifier such as most-active, gainers, losers, or other supported list IDs.","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string"},"description":"Nasdaq list identifier."},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Market list response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListTypeResponse"},"examples":{"success":{"summary":"List Type success","value":{"meta":{"provider":"nasdaq","route":"list_type","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{"table":{"asOf":null,"headers":{"symbol":"Symbol","name":"Name","lastSalePrice":"Last"},"rows":[{"symbol":"AAPL","name":"Apple Inc.","lastSalePrice":"$310.85"}]}},"message":null,"status":{"rCode":200}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"Invalid request parameters."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"list_type"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"list_type"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/markets/extended-lists/{list_id}":{"get":{"tags":["Markets"],"operationId":"getListTypeExtended","summary":"Extended Market List","description":"Extended Nasdaq list data for supported list identifiers with richer table fields when available.","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string"},"description":"Nasdaq list identifier."},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Extended market list response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListTypeExtendedResponse"},"examples":{"success":{"summary":"List Type Extended success","value":{"meta":{"provider":"nasdaq","route":"list_type_extended","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{"table":{"asOf":null,"headers":{"symbol":"Symbol","name":"Name","lastSalePrice":"Last"},"rows":[{"symbol":"AAPL","name":"Apple Inc.","lastSalePrice":"$310.85"}]}},"message":null,"status":{"rCode":200}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"Invalid request parameters."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"list_type_extended"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"list_type_extended"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/markets/info":{"get":{"tags":["Markets"],"operationId":"getMarketInfo","summary":"Market Info","description":"Nasdaq market status, market centers, and session metadata when available.","parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Market info response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketInfoResponse"},"examples":{"success":{"summary":"Market Info success","value":{"meta":{"provider":"nasdaq","route":"market_info","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{"table":{"asOf":null,"headers":{"symbol":"Symbol","name":"Name","lastSalePrice":"Last"},"rows":[{"symbol":"AAPL","name":"Apple Inc.","lastSalePrice":"$310.85"}]}},"message":null,"status":{"rCode":200}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"Invalid request parameters."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"market_info"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"market_info"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/markets/movers":{"get":{"tags":["Markets"],"operationId":"getMarketMovers","summary":"Market Movers","description":"Nasdaq market movers across stocks, ETFs, and other asset classes, including most-active, gainers, and losers tables.","parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"market_type","in":"query","required":false,"schema":{"type":"string"},"description":"Market mover group or market type when supported by Nasdaq. Maps to marketType."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Market movers response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketMoversResponse"},"examples":{"success":{"summary":"Market Movers success","value":{"meta":{"provider":"nasdaq","route":"market_movers","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{"table":{"asOf":null,"headers":{"symbol":"Symbol","name":"Name","lastSalePrice":"Last"},"rows":[{"symbol":"AAPL","name":"Apple Inc.","lastSalePrice":"$310.85"}]}},"message":null,"status":{"rCode":200}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"Invalid request parameters."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"market_movers"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"market_movers"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/news/press-center":{"get":{"tags":["News"],"operationId":"getNewsPressCenter","summary":"Press Center News","description":"Nasdaq press-center news items and announcements.","parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Press center news response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsPressCenterResponse"},"examples":{"success":{"summary":"News Press Center success","value":{"meta":{"provider":"nasdaq","route":"news_press_center","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{},"message":null,"status":{"rCode":200,"bCodeMessage":null,"developerMessage":null}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"Invalid request parameters."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"news_press_center"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"news_press_center"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/news/topic/{topic}":{"get":{"tags":["News"],"operationId":"getNewsTopic","summary":"Topic News","description":"Nasdaq news items for a topic slug.","parameters":[{"name":"topic","in":"path","required":true,"schema":{"type":"string"},"description":"Nasdaq news topic slug."},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Topic news response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsTopicResponse"},"examples":{"success":{"summary":"News Topic success","value":{"meta":{"provider":"nasdaq","route":"news_topic","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{},"message":null,"status":{"rCode":200,"bCodeMessage":null,"developerMessage":null}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"Invalid request parameters."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"news_topic"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"news_topic"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/nordic/instruments/{order_book_id}/info":{"get":{"tags":["Nordic"],"operationId":"getNordicInstrumentInfo","summary":"Nordic Instrument Info","description":"Nasdaq Nordic instrument reference data for one order book ID.","parameters":[{"name":"order_book_id","in":"path","required":true,"schema":{"type":"string"},"description":"Nasdaq Nordic order book ID."},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Nordic instrument info response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NordicInstrumentInfoResponse"},"examples":{"success":{"summary":"Nordic Instrument Info success","value":{"meta":{"provider":"nasdaq","route":"nordic_instrument_info","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{},"message":null,"status":{"rCode":200,"bCodeMessage":null,"developerMessage":null}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"Invalid request parameters."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"nordic_instrument_info"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"nordic_instrument_info"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/nordic/instruments/{order_book_id}/price-info":{"get":{"tags":["Nordic"],"operationId":"getNordicInstrumentPriceInfo","summary":"Nordic Instrument Price Info","description":"Nasdaq Nordic instrument price information for one order book ID.","parameters":[{"name":"order_book_id","in":"path","required":true,"schema":{"type":"string"},"description":"Nasdaq Nordic order book ID."},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Nordic instrument price info response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NordicInstrumentPriceInfoResponse"},"examples":{"success":{"summary":"Nordic Instrument Price Info success","value":{"meta":{"provider":"nasdaq","route":"nordic_instrument_price_info","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{},"message":null,"status":{"rCode":200,"bCodeMessage":null,"developerMessage":null}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"Invalid request parameters."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"nordic_instrument_price_info"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"nordic_instrument_price_info"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/nordic/instruments/{order_book_id}/summary":{"get":{"tags":["Nordic"],"operationId":"getNordicInstrumentSummary","summary":"Nordic Instrument Summary","description":"Nasdaq Nordic instrument summary data for one order book ID.","parameters":[{"name":"order_book_id","in":"path","required":true,"schema":{"type":"string"},"description":"Nasdaq Nordic order book ID."},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Nordic instrument summary response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NordicInstrumentSummaryResponse"},"examples":{"success":{"summary":"Nordic Instrument Summary success","value":{"meta":{"provider":"nasdaq","route":"nordic_instrument_summary","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{},"message":null,"status":{"rCode":200,"bCodeMessage":null,"developerMessage":null}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"Invalid request parameters."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"nordic_instrument_summary"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"nordic_instrument_summary"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/nordic/instruments/{order_book_id}/trades":{"get":{"tags":["Nordic"],"operationId":"getNordicInstrumentTrades","summary":"Nordic Instrument Trades","description":"Recent Nasdaq Nordic trades for one order book ID.","parameters":[{"name":"order_book_id","in":"path","required":true,"schema":{"type":"string"},"description":"Nasdaq Nordic order book ID."},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Nordic instrument trades response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NordicInstrumentTradesResponse"},"examples":{"success":{"summary":"Nordic Instrument Trades success","value":{"meta":{"provider":"nasdaq","route":"nordic_instrument_trades","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{},"message":null,"status":{"rCode":200,"bCodeMessage":null,"developerMessage":null}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"Invalid request parameters."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"nordic_instrument_trades"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"nordic_instrument_trades"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/nordic/listing":{"get":{"tags":["Nordic"],"operationId":"getNordicListing","summary":"Nordic Listing","description":"Nasdaq Nordic listing data, optionally filtered by one or more instrument IDs.","parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"instrument_id","in":"query","required":false,"schema":{"type":"string"},"description":"One or more Nordic instrument IDs. Aliases: instrumentIds and order_book_id."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Nordic listing response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NordicListingResponse"},"examples":{"success":{"summary":"Nordic Listing success","value":{"meta":{"provider":"nasdaq","route":"nordic_listing","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{},"message":null,"status":{"rCode":200,"bCodeMessage":null,"developerMessage":null}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"Invalid request parameters."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"nordic_listing"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"nordic_listing"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/nordic/markets/movers":{"get":{"tags":["Nordic"],"operationId":"getNordicMarketMovers","summary":"Nordic Market Movers","description":"Nasdaq Nordic market movers data.","parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Nordic market movers response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NordicMarketMoversResponse"},"examples":{"success":{"summary":"Nordic Market Movers success","value":{"meta":{"provider":"nasdaq","route":"nordic_market_movers","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{},"message":null,"status":{"rCode":200,"bCodeMessage":null,"developerMessage":null}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"Invalid request parameters."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"nordic_market_movers"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"nordic_market_movers"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/nordic/screener/{type}":{"get":{"tags":["Nordic"],"operationId":"getNordicScreener","summary":"Nordic Screener","description":"Nasdaq Nordic screener rows for a screener type path parameter.","parameters":[{"name":"type","in":"path","required":true,"schema":{"type":"string"},"description":"Screener type."},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Nordic screener response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NordicScreenerResponse"},"examples":{"success":{"summary":"Nordic Screener success","value":{"meta":{"provider":"nasdaq","route":"nordic_screener","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{"table":{"asOf":null,"headers":{"symbol":"Symbol","name":"Name","lastSalePrice":"Last"},"rows":[{"symbol":"AAPL","name":"Apple Inc.","lastSalePrice":"$310.85"}]}},"message":null,"status":{"rCode":200}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"Invalid request parameters."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"nordic_screener"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"nordic_screener"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/nordic/search":{"get":{"tags":["Nordic"],"operationId":"getNordicSearch","summary":"Nordic Search","description":"Search Nasdaq Nordic instruments by text query.","parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"q","in":"query","required":true,"schema":{"type":"string"},"description":"Nasdaq Nordic search text. Aliases: query and searchText."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Nordic search response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NordicSearchResponse"},"examples":{"success":{"summary":"Nordic Search success","value":{"meta":{"provider":"nasdaq","route":"nordic_search","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":[{"group":"Shares Main Market","instruments":[{"orderbookId":"TX69","fullName":"Ericsson B","isin":"SE0000108656","symbol":"ERIC B","assetClass":"SHARES","currency":"SEK"}]}],"messages":null,"status":{"rCode":200}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"nordic_search requires q=, query=, or searchText=."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"nordic_search"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"nordic_search"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/nordic/star/{order_book_id}/key-stats":{"get":{"tags":["Nordic"],"operationId":"getNordicStarKeyStats","summary":"Nordic Star Key Stats","description":"Nasdaq Nordic Star key statistics for one order book ID.","parameters":[{"name":"order_book_id","in":"path","required":true,"schema":{"type":"string"},"description":"Nasdaq Nordic order book ID."},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Nordic Star key stats response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NordicStarKeyStatsResponse"},"examples":{"success":{"summary":"Nordic Star Key Stats success","value":{"meta":{"provider":"nasdaq","route":"nordic_star_key_stats","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{},"message":null,"status":{"rCode":200,"bCodeMessage":null,"developerMessage":null}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"Invalid request parameters."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"nordic_star_key_stats"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"nordic_star_key_stats"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/quotes/basic":{"get":{"tags":["Quotes"],"operationId":"getQuoteBasic","summary":"Batch Quotes","description":"Current Nasdaq quote rows for one or more symbols.","parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"symbols","in":"query","required":true,"schema":{"type":"string"},"description":"Comma-separated symbols. Aliases: symbol, ticker, and tickers."},{"name":"asset_class","in":"query","required":false,"schema":{"type":"string","examples":["stocks","etf","mutualfunds"]},"description":"Asset class alias. Maps to Nasdaq assetclass/assetClass. Common values include stocks, etf, mutualfunds, and indexes."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Batch quotes response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteBasicResponse"},"examples":{"success":{"summary":"Quote Basic success","value":{"meta":{"provider":"nasdaq","route":"quote_basic","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{"symbol":"AAPL","assetClass":"STOCKS","summaryData":{"Exchange":{"label":"Exchange","value":"NASDAQ-GS"},"Sector":{"label":"Sector","value":"Technology"},"PreviousClose":{"label":"Previous Close","value":"$310.85"}}},"message":null,"status":{"rCode":200,"bCodeMessage":null,"developerMessage":null}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"quote_basic requires a symbol path segment or symbol=."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"quote_basic"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"quote_basic"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/quote/{symbol}/chart":{"get":{"tags":["Quotes"],"operationId":"getQuoteChart","summary":"Quote Chart","description":"Chart-ready price series for one Nasdaq symbol.","parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string"},"description":"Ticker or fund symbol, for example AAPL or FXAIX."},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"asset_class","in":"query","required":false,"schema":{"type":"string","examples":["stocks","etf","mutualfunds"]},"description":"Asset class alias. Maps to Nasdaq assetclass/assetClass. Common values include stocks, etf, mutualfunds, and indexes."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Quote chart response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteChartResponse"},"examples":{"success":{"summary":"Quote Chart success","value":{"meta":{"provider":"nasdaq","route":"quote_chart","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{"symbol":"AAPL","assetClass":"STOCKS","summaryData":{"Exchange":{"label":"Exchange","value":"NASDAQ-GS"},"Sector":{"label":"Sector","value":"Technology"},"PreviousClose":{"label":"Previous Close","value":"$310.85"}}},"message":null,"status":{"rCode":200,"bCodeMessage":null,"developerMessage":null}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"quote_chart requires a symbol path segment or symbol=."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"quote_chart"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"quote_chart"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/quote/{symbol}/dividends":{"get":{"tags":["Quotes"],"operationId":"getQuoteDividends","summary":"Quote Dividends","description":"Dividend rows and dividend summary data for one Nasdaq symbol.","parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string"},"description":"Ticker or fund symbol, for example AAPL or FXAIX."},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"asset_class","in":"query","required":false,"schema":{"type":"string","examples":["stocks","etf","mutualfunds"]},"description":"Asset class alias. Maps to Nasdaq assetclass/assetClass. Common values include stocks, etf, mutualfunds, and indexes."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Quote dividends response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteDividendsResponse"},"examples":{"success":{"summary":"Quote Dividends success","value":{"meta":{"provider":"nasdaq","route":"quote_dividends","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{"symbol":"AAPL","assetClass":"STOCKS","summaryData":{"Exchange":{"label":"Exchange","value":"NASDAQ-GS"},"Sector":{"label":"Sector","value":"Technology"},"PreviousClose":{"label":"Previous Close","value":"$310.85"}}},"message":null,"status":{"rCode":200,"bCodeMessage":null,"developerMessage":null}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"quote_dividends requires a symbol path segment or symbol=."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"quote_dividends"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"quote_dividends"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/quote/{symbol}/eps":{"get":{"tags":["Quotes"],"operationId":"getQuoteEps","summary":"Quote EPS","description":"EPS and earnings-per-share data for one Nasdaq symbol.","parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string"},"description":"Ticker or fund symbol, for example AAPL or FXAIX."},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"asset_class","in":"query","required":false,"schema":{"type":"string","examples":["stocks","etf","mutualfunds"]},"description":"Asset class alias. Maps to Nasdaq assetclass/assetClass. Common values include stocks, etf, mutualfunds, and indexes."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Quote EPS response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteEpsResponse"},"examples":{"success":{"summary":"Quote EPS success","value":{"meta":{"provider":"nasdaq","route":"quote_eps","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{"symbol":"AAPL","assetClass":"STOCKS","summaryData":{"Exchange":{"label":"Exchange","value":"NASDAQ-GS"},"Sector":{"label":"Sector","value":"Technology"},"PreviousClose":{"label":"Previous Close","value":"$310.85"}}},"message":null,"status":{"rCode":200,"bCodeMessage":null,"developerMessage":null}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"quote_eps requires a symbol path segment or symbol=."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"quote_eps"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"quote_eps"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/quote/{symbol}/extended-trading":{"get":{"tags":["Quotes"],"operationId":"getQuoteExtended","summary":"Extended Trading","description":"Pre-market and after-hours trading data for one Nasdaq symbol when available.","parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string"},"description":"Ticker or fund symbol, for example AAPL or FXAIX."},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"asset_class","in":"query","required":false,"schema":{"type":"string","examples":["stocks","etf","mutualfunds"]},"description":"Asset class alias. Maps to Nasdaq assetclass/assetClass. Common values include stocks, etf, mutualfunds, and indexes."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Extended trading response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteExtendedResponse"},"examples":{"success":{"summary":"Quote Extended success","value":{"meta":{"provider":"nasdaq","route":"quote_extended","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{"symbol":"AAPL","assetClass":"STOCKS","summaryData":{"Exchange":{"label":"Exchange","value":"NASDAQ-GS"},"Sector":{"label":"Sector","value":"Technology"},"PreviousClose":{"label":"Previous Close","value":"$310.85"}}},"message":null,"status":{"rCode":200,"bCodeMessage":null,"developerMessage":null}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"quote_extended requires a symbol path segment or symbol=."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"quote_extended"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"quote_extended"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/quote/{symbol}/historical":{"get":{"tags":["Quotes"],"operationId":"getQuoteHistorical","summary":"Historical Prices","description":"Historical Nasdaq price rows for one symbol, with optional date range and limit controls.","parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string"},"description":"Ticker or fund symbol, for example AAPL or FXAIX."},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"asset_class","in":"query","required":false,"schema":{"type":"string","examples":["stocks","etf","mutualfunds"]},"description":"Asset class alias. Maps to Nasdaq assetclass/assetClass. Common values include stocks, etf, mutualfunds, and indexes."},{"name":"from_date","in":"query","required":false,"schema":{"type":"string"},"description":"Start date as YYYY-MM-DD. Maps to Nasdaq fromDate/fromdate."},{"name":"to_date","in":"query","required":false,"schema":{"type":"string"},"description":"End date as YYYY-MM-DD. Maps to Nasdaq toDate/todate."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1},"description":"Maximum number of historical rows when Nasdaq supports a limit parameter."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Historical prices response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteHistoricalResponse"},"examples":{"success":{"summary":"Quote Historical success","value":{"meta":{"provider":"nasdaq","route":"quote_historical","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{"symbol":"AAPL","assetClass":"STOCKS","summaryData":{"Exchange":{"label":"Exchange","value":"NASDAQ-GS"},"Sector":{"label":"Sector","value":"Technology"},"PreviousClose":{"label":"Previous Close","value":"$310.85"}}},"message":null,"status":{"rCode":200,"bCodeMessage":null,"developerMessage":null}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"quote_historical requires a symbol path segment or symbol=."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"quote_historical"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"quote_historical"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/quotes/indices":{"get":{"tags":["Quotes"],"operationId":"getQuoteIndices","summary":"Index Quotes","description":"Current Nasdaq index quote rows.","parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"asset_class","in":"query","required":false,"schema":{"type":"string","examples":["stocks","etf","mutualfunds"]},"description":"Asset class alias. Maps to Nasdaq assetclass/assetClass. Common values include stocks, etf, mutualfunds, and indexes."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Index quotes response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteIndicesResponse"},"examples":{"success":{"summary":"Quote Indices success","value":{"meta":{"provider":"nasdaq","route":"quote_indices","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{"symbol":"AAPL","assetClass":"STOCKS","summaryData":{"Exchange":{"label":"Exchange","value":"NASDAQ-GS"},"Sector":{"label":"Sector","value":"Technology"},"PreviousClose":{"label":"Previous Close","value":"$310.85"}}},"message":null,"status":{"rCode":200,"bCodeMessage":null,"developerMessage":null}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"quote_indices requires a symbol path segment or symbol=."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"quote_indices"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"quote_indices"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/quote/{symbol}/info":{"get":{"tags":["Quotes"],"operationId":"getQuoteInfo","summary":"Quote Info","description":"Company and instrument metadata for one Nasdaq symbol.","parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string"},"description":"Ticker or fund symbol, for example AAPL or FXAIX."},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"asset_class","in":"query","required":false,"schema":{"type":"string","examples":["stocks","etf","mutualfunds"]},"description":"Asset class alias. Maps to Nasdaq assetclass/assetClass. Common values include stocks, etf, mutualfunds, and indexes."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Quote info response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteInfoResponse"},"examples":{"success":{"summary":"Quote Info success","value":{"meta":{"provider":"nasdaq","route":"quote_info","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{"symbol":"AAPL","assetClass":"STOCKS","summaryData":{"Exchange":{"label":"Exchange","value":"NASDAQ-GS"},"Sector":{"label":"Sector","value":"Technology"},"PreviousClose":{"label":"Previous Close","value":"$310.85"}}},"message":null,"status":{"rCode":200,"bCodeMessage":null,"developerMessage":null}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"quote_info requires a symbol path segment or symbol=."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"quote_info"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"quote_info"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/quote/{symbol}/options":{"get":{"tags":["Options"],"operationId":"getQuoteOptions","summary":"Options Chain","description":"Nasdaq option chain data for one symbol.","parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string"},"description":"Ticker or fund symbol, for example AAPL or FXAIX."},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"asset_class","in":"query","required":false,"schema":{"type":"string","examples":["stocks","etf","mutualfunds"]},"description":"Asset class alias. Maps to Nasdaq assetclass/assetClass. Common values include stocks, etf, mutualfunds, and indexes."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Options chain response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteOptionsResponse"},"examples":{"success":{"summary":"Quote Options success","value":{"meta":{"provider":"nasdaq","route":"quote_options","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{"symbol":"AAPL","assetClass":"STOCKS","summaryData":{"Exchange":{"label":"Exchange","value":"NASDAQ-GS"},"Sector":{"label":"Sector","value":"Technology"},"PreviousClose":{"label":"Previous Close","value":"$310.85"}}},"message":null,"status":{"rCode":200,"bCodeMessage":null,"developerMessage":null}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"quote_options requires a symbol path segment or symbol=."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"quote_options"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"quote_options"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/quote/{symbol}/options/greeks":{"get":{"tags":["Options"],"operationId":"getQuoteOptionsGreeks","summary":"Options Greeks","description":"Nasdaq option greeks for one symbol.","parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string"},"description":"Ticker or fund symbol, for example AAPL or FXAIX."},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"asset_class","in":"query","required":false,"schema":{"type":"string","examples":["stocks","etf","mutualfunds"]},"description":"Asset class alias. Maps to Nasdaq assetclass/assetClass. Common values include stocks, etf, mutualfunds, and indexes."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Options greeks response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteOptionsGreeksResponse"},"examples":{"success":{"summary":"Quote Options Greeks success","value":{"meta":{"provider":"nasdaq","route":"quote_options_greeks","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{"symbol":"AAPL","assetClass":"STOCKS","summaryData":{"Exchange":{"label":"Exchange","value":"NASDAQ-GS"},"Sector":{"label":"Sector","value":"Technology"},"PreviousClose":{"label":"Previous Close","value":"$310.85"}}},"message":null,"status":{"rCode":200,"bCodeMessage":null,"developerMessage":null}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"quote_options_greeks requires a symbol path segment or symbol=."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"quote_options_greeks"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"quote_options_greeks"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/quote/{symbol}/options/most-active":{"get":{"tags":["Options"],"operationId":"getQuoteOptionsMostActive","summary":"Most Active Options","description":"Most-active Nasdaq options for one symbol.","parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string"},"description":"Ticker or fund symbol, for example AAPL or FXAIX."},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"asset_class","in":"query","required":false,"schema":{"type":"string","examples":["stocks","etf","mutualfunds"]},"description":"Asset class alias. Maps to Nasdaq assetclass/assetClass. Common values include stocks, etf, mutualfunds, and indexes."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Most active options response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteOptionsMostActiveResponse"},"examples":{"success":{"summary":"Quote Options Most Active success","value":{"meta":{"provider":"nasdaq","route":"quote_options_most_active","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{"symbol":"AAPL","assetClass":"STOCKS","summaryData":{"Exchange":{"label":"Exchange","value":"NASDAQ-GS"},"Sector":{"label":"Sector","value":"Technology"},"PreviousClose":{"label":"Previous Close","value":"$310.85"}}},"message":null,"status":{"rCode":200,"bCodeMessage":null,"developerMessage":null}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"quote_options_most_active requires a symbol path segment or symbol=."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"quote_options_most_active"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"quote_options_most_active"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/quote/{symbol}/realtime-trades":{"get":{"tags":["Quotes"],"operationId":"getQuoteRealtimeTrades","summary":"Realtime Trades","description":"Recent realtime trade rows for one Nasdaq symbol when Nasdaq publishes them.","parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string"},"description":"Ticker or fund symbol, for example AAPL or FXAIX."},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"asset_class","in":"query","required":false,"schema":{"type":"string","examples":["stocks","etf","mutualfunds"]},"description":"Asset class alias. Maps to Nasdaq assetclass/assetClass. Common values include stocks, etf, mutualfunds, and indexes."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Realtime trades response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteRealtimeTradesResponse"},"examples":{"success":{"summary":"Quote Realtime Trades success","value":{"meta":{"provider":"nasdaq","route":"quote_realtime_trades","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{"symbol":"AAPL","assetClass":"STOCKS","summaryData":{"Exchange":{"label":"Exchange","value":"NASDAQ-GS"},"Sector":{"label":"Sector","value":"Technology"},"PreviousClose":{"label":"Previous Close","value":"$310.85"}}},"message":null,"status":{"rCode":200,"bCodeMessage":null,"developerMessage":null}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"quote_realtime_trades requires a symbol path segment or symbol=."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"quote_realtime_trades"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"quote_realtime_trades"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/quote/{symbol}/short-interest":{"get":{"tags":["Quotes"],"operationId":"getQuoteShortInterest","summary":"Short Interest","description":"Short-interest rows and summary data for one Nasdaq symbol.","parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string"},"description":"Ticker or fund symbol, for example AAPL or FXAIX."},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"asset_class","in":"query","required":false,"schema":{"type":"string","examples":["stocks","etf","mutualfunds"]},"description":"Asset class alias. Maps to Nasdaq assetclass/assetClass. Common values include stocks, etf, mutualfunds, and indexes."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Short interest response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteShortInterestResponse"},"examples":{"success":{"summary":"Quote Short Interest success","value":{"meta":{"provider":"nasdaq","route":"quote_short_interest","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{"symbol":"AAPL","assetClass":"STOCKS","summaryData":{"Exchange":{"label":"Exchange","value":"NASDAQ-GS"},"Sector":{"label":"Sector","value":"Technology"},"PreviousClose":{"label":"Previous Close","value":"$310.85"}}},"message":null,"status":{"rCode":200,"bCodeMessage":null,"developerMessage":null}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"quote_short_interest requires a symbol path segment or symbol=."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"quote_short_interest"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"quote_short_interest"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/quote/{symbol}/summary":{"get":{"tags":["Quotes"],"operationId":"getQuoteSummary","summary":"Quote Summary","description":"Current quote summary for one Nasdaq symbol, including summary data, bid/ask, key stats, and related table fields when available.","parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string"},"description":"Ticker or fund symbol, for example AAPL or FXAIX."},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"asset_class","in":"query","required":false,"schema":{"type":"string","examples":["stocks","etf","mutualfunds"]},"description":"Asset class alias. Maps to Nasdaq assetclass/assetClass. Common values include stocks, etf, mutualfunds, and indexes."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Quote summary response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteSummaryResponse"},"examples":{"success":{"summary":"Quote Summary success","value":{"meta":{"provider":"nasdaq","route":"quote_summary","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{"symbol":"AAPL","assetClass":"STOCKS","summaryData":{"Exchange":{"label":"Exchange","value":"NASDAQ-GS"},"Sector":{"label":"Sector","value":"Technology"},"PreviousClose":{"label":"Previous Close","value":"$310.85"}}},"message":null,"status":{"rCode":200,"bCodeMessage":null,"developerMessage":null}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"quote_summary requires a symbol path segment or symbol=."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"quote_summary"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"quote_summary"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/quotes/watchlist":{"get":{"tags":["Quotes"],"operationId":"getQuoteWatchlist","summary":"Watchlist Quotes","description":"Current quote rows for one or more watchlist symbols.","parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"symbols","in":"query","required":true,"schema":{"type":"string"},"description":"Comma-separated symbols. Aliases: symbol, ticker, and tickers."},{"name":"asset_class","in":"query","required":false,"schema":{"type":"string","examples":["stocks","etf","mutualfunds"]},"description":"Asset class alias. Maps to Nasdaq assetclass/assetClass. Common values include stocks, etf, mutualfunds, and indexes."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Watchlist quotes response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteWatchlistResponse"},"examples":{"success":{"summary":"Quote Watchlist success","value":{"meta":{"provider":"nasdaq","route":"quote_watchlist","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{"symbol":"AAPL","assetClass":"STOCKS","summaryData":{"Exchange":{"label":"Exchange","value":"NASDAQ-GS"},"Sector":{"label":"Sector","value":"Technology"},"PreviousClose":{"label":"Previous Close","value":"$310.85"}}},"message":null,"status":{"rCode":200,"bCodeMessage":null,"developerMessage":null}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"quote_watchlist requires a symbol path segment or symbol=."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"quote_watchlist"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"quote_watchlist"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/screener/{type}":{"get":{"tags":["Screeners"],"operationId":"getScreener","summary":"Screener","description":"Nasdaq screener rows for a screener type path parameter.","parameters":[{"name":"type","in":"path","required":true,"schema":{"type":"string"},"description":"Screener type."},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"asset_class","in":"query","required":false,"schema":{"type":"string","examples":["stocks","etf","mutualfunds"]},"description":"Asset class alias. Maps to Nasdaq assetclass/assetClass. Common values include stocks, etf, mutualfunds, and indexes."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Screener response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScreenerResponse"},"examples":{"success":{"summary":"Screener success","value":{"meta":{"provider":"nasdaq","route":"screener","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":{"table":{"asOf":null,"headers":{"symbol":"Symbol","name":"Name","lastSalePrice":"Last"},"rows":[{"symbol":"AAPL","name":"Apple Inc.","lastSalePrice":"$310.85"}]}},"message":null,"status":{"rCode":200}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"Invalid request parameters."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"screener"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"screener"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}},"/v1/search":{"get":{"tags":["Search"],"operationId":"getSearch","summary":"Symbol Search","description":"Search Nasdaq symbols, companies, ETFs, funds, and other instruments by text query.","parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Request fresh source data when available. Cached reads remain the default."},{"name":"q","in":"query","required":true,"schema":{"type":"string"},"description":"Search query. Aliases: query and term."},{"name":"X-Nfin-Contact","in":"header","required":false,"schema":{"type":"string"},"description":"Optional contact value for support and abuse analysis. This does not authenticate the request."},{"name":"X-Nfin-Key","in":"header","required":false,"schema":{"type":"string"},"description":"API key created through the email verification flow. Authorization: Bearer is also supported."}],"responses":{"200":{"description":"Symbol search response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"},"examples":{"success":{"summary":"Search success","value":{"meta":{"provider":"nasdaq","route":"search","status":"ok","generated_at":"2026-05-28T18:00:00.000Z","freshness":{"as_of":"2026-05-28T18:00:00.000Z","max_age_seconds":300,"stale":false}},"data":{"data":[{"symbol":"AAPL","name":"Apple Inc. Common Stock","exchange":"NASDAQ-GS","asset":"STOCKS","industry":"Technology Hardware & Equipment"}],"message":null,"status":{"rCode":200,"bCodeMessage":null,"developerMessage":null}}}}}}}},"400":{"description":"Invalid request parameters.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"bad_request":{"summary":"Invalid request","value":{"ok":false,"error":{"code":"bad_request","message":"search requires q=, query=, or term=."}}}}}}},"401":{"description":"API key is invalid, inactive, expired, or missing for the requested operation.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_api_key":{"summary":"The supplied nfin API key is not valid.","value":{"ok":false,"error":{"code":"invalid_api_key","message":"The supplied nfin API key is not valid."}}},"api_key_inactive":{"summary":"API key is no longer active. Create or rotate a key to continue.","value":{"ok":false,"error":{"code":"api_key_inactive","message":"API key is no longer active. Create or rotate a key to continue."}}}}}}},"404":{"description":"Unknown route or endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"not_found":{"summary":"Unknown route","value":{"ok":false,"error":{"code":"not_found","message":"Unknown nfin route."}}},"endpoint_not_found":{"summary":"Unknown endpoint","value":{"ok":false,"error":{"code":"endpoint_not_found","message":"Endpoint is not available in nfin v1."}}}}}}},"405":{"description":"HTTP method is not allowed for this endpoint.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"method_not_allowed":{"summary":"Method not allowed","value":{"ok":false,"error":{"code":"method_not_allowed","message":"nfin v1 exposes read-only GET routes."},"allow":["GET"]}}}}}},"429":{"description":"Request limit exceeded. Retry-After is included when the client should wait before retrying.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitResponse"},"examples":{"rate_limited":{"summary":"Request limit exceeded","value":{"ok":false,"error":{"code":"rate_limited","message":"Request budget exhausted."},"rate_limit":{"scope":"request","tier":"anonymous","retry_after_seconds":42,"upgrade":{"message":"Verify an email to create an API key with higher free limits.","request_otp":"/v1/auth/otp","verify_otp":"/v1/auth/verify","api_key_header":"Authorization: Bearer <api_key>"}}}}}}}},"502":{"description":"The Nasdaq data request could not be completed.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"data_request_failed":{"summary":"Data request failed","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"search"},"error":{"code":"data_request_failed","message":"The service could not complete the Nasdaq request. Retry shortly."}}}}}}},"503":{"description":"The service is temporarily unavailable or busy.","headers":{"x-nfin-error-code":{"description":"Stable nfin error code.","schema":{"type":"string"}},"x-nfin-error-message":{"description":"Short human-readable error message.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"service_busy":{"summary":"Service busy","value":{"ok":false,"error":{"code":"service_busy","message":"The service is temporarily busy. Retry shortly."}}},"data_service_unavailable":{"summary":"Data service unavailable","value":{"ok":false,"meta":{"provider":"nasdaq","generated_at":"2026-05-28T18:00:00.000Z","route":"search"},"error":{"code":"data_service_unavailable","message":"The service is temporarily unavailable. Retry shortly."}}}}}}}}}}}}