{"openapi":"3.1.0","info":{"title":"FlowFrame API (beta)","version":"1.0.0-beta","description":"# FlowFrame Public API v1\n\nPublic API for prediction-market intelligence:\n- **Pulse** — published market-event feed\n- **Polymarket movers** — biggest YES-price movers over 1h/4h/12h/24h\n- **Kalshi movers** — biggest Kalshi YES-price movers since midnight UTC\n- **Kalshi trending** — top open Kalshi markets by 24h volume\n- **Live trade feed** — recent large trades from FlowFrame's tracked top-trader wallets\n- **Blog** — FlowFrame Research articles (Deep Research + Market Insights)\n- **Smart Money Skew** — markets where top traders are concentrated on one side\n- **Mentions Hub** — keyword search across political-speech transcripts (Trump, Vance, Powell, Rubio, Hegseth, Leavitt)\n\n## Authentication\nAll endpoints under `/v1/*` (except `/v1/openapi.json`) require an API key:\n```\nAuthorization: Bearer flowframe_live_<32 chars>\n```\nGenerate keys at https://flowframe.xyz/account/api-keys.\n\n## Rate limits\nPer-key, fixed 1-hour window. Free tier = 20 requests/hour. All Mentions Hub endpoints (`/v1/mentions/speakers`, `/v1/mentions/search`, `/v1/mentions/frequency`) are currently free. The 3 paid endpoints (`/v1/markets/{conditionId}/price-history`, `/v1/signals/breakout`, `/v1/signals/spread-widening`) require a paid tier and return 403 on free keys.\nResponses include IETF draft-7 headers: `RateLimit-Limit`, `RateLimit-Remaining`, `RateLimit-Reset`. 429 responses also include `Retry-After`.\nThe window is fixed (not sliding): the counter resets at the boundary indicated by `RateLimit-Reset`.\n\n## Errors\nStandard error codes: `unauthorized`, `forbidden`, `rate_limit_exceeded`, `not_found`, `validation_error`, `internal_error`."},"servers":[{"url":"https://flowframe.xyz","description":"Production"}],"security":[{"bearerAuth":[]}],"paths":{"/v1/pulse":{"get":{"summary":"List Pulse items","description":"Returns published Pulse items in reverse chronological order. Cursor pagination via `meta.nextCursor`.","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor returned in `meta.nextCursor`."},{"name":"source","in":"query","schema":{"type":"string"},"description":"Filter by source."},{"name":"since","in":"query","schema":{"type":"string","format":"date-time"},"description":"ISO 8601 timestamp; only items published after."}],"responses":{"200":{"description":"Pulse items envelope.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":["string","null"]},"subject":{"type":"string"},"source":{"type":"string"},"publishedAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"content":{"type":"string"},"polymarketUrl":{"type":["string","null"]},"conditionId":{"type":["string","null"],"description":"Polymarket conditionId if derivable from polymarketUrl."},"isPinned":{"type":"boolean"},"permalink":{"type":"string","format":"uri"}}}},"meta":{"type":"object","required":["fetchedAt","brand"],"properties":{"fetchedAt":{"type":"string","format":"date-time"},"nextCursor":{"type":["string","null"]},"count":{"type":"integer"},"brand":{"type":"object","description":"FlowFrame branding + attribution metadata. Free-tier keys MUST display the attribution label in any UI built on top of this API; paid tiers may suppress it.","required":["source","docs","attribution"],"properties":{"source":{"type":"string","example":"flowframe.xyz"},"docs":{"type":"string","format":"uri"},"attribution":{"type":"object","required":["required","label","url","tier"],"properties":{"required":{"type":"boolean","description":"True for free-tier keys, false for paid tiers."},"label":{"type":"string","example":"Powered by FlowFrame"},"url":{"type":"string","format":"uri"},"terms":{"type":"string","format":"uri"},"tier":{"type":"string","enum":["free","starter","pro","institutional"]}}}}}},"additionalProperties":true}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimitExceeded"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/v1/pulse/by-market/{conditionId}":{"get":{"summary":"List Pulse items by Polymarket conditionId","description":"Returns published Pulse items linked to the given Polymarket conditionId. Items without a derivable conditionId (e.g., Kalshi-only) are excluded.","parameters":[{"name":"conditionId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Pulse items envelope.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":["string","null"]},"subject":{"type":"string"},"source":{"type":"string"},"publishedAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"content":{"type":"string"},"polymarketUrl":{"type":["string","null"]},"conditionId":{"type":["string","null"],"description":"Polymarket conditionId if derivable from polymarketUrl."},"isPinned":{"type":"boolean"},"permalink":{"type":"string","format":"uri"}}}},"meta":{"type":"object","required":["fetchedAt","brand"],"properties":{"fetchedAt":{"type":"string","format":"date-time"},"nextCursor":{"type":["string","null"]},"count":{"type":"integer"},"brand":{"type":"object","description":"FlowFrame branding + attribution metadata. Free-tier keys MUST display the attribution label in any UI built on top of this API; paid tiers may suppress it.","required":["source","docs","attribution"],"properties":{"source":{"type":"string","example":"flowframe.xyz"},"docs":{"type":"string","format":"uri"},"attribution":{"type":"object","required":["required","label","url","tier"],"properties":{"required":{"type":"boolean","description":"True for free-tier keys, false for paid tiers."},"label":{"type":"string","example":"Powered by FlowFrame"},"url":{"type":"string","format":"uri"},"terms":{"type":"string","format":"uri"},"tier":{"type":"string","enum":["free","starter","pro","institutional"]}}}}}},"additionalProperties":true}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimitExceeded"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/v1/pulse/{identifier}":{"get":{"summary":"Get a single Pulse item","description":"Identifier is either the UUID id or the slug. Returns 404 if not found or unpublished.","parameters":[{"name":"identifier","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Single Pulse item envelope.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":["string","null"]},"subject":{"type":"string"},"source":{"type":"string"},"publishedAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"content":{"type":"string"},"polymarketUrl":{"type":["string","null"]},"conditionId":{"type":["string","null"],"description":"Polymarket conditionId if derivable from polymarketUrl."},"isPinned":{"type":"boolean"},"permalink":{"type":"string","format":"uri"}}},"meta":{"type":"object","required":["fetchedAt","brand"],"properties":{"fetchedAt":{"type":"string","format":"date-time"},"nextCursor":{"type":["string","null"]},"count":{"type":"integer"},"brand":{"type":"object","description":"FlowFrame branding + attribution metadata. Free-tier keys MUST display the attribution label in any UI built on top of this API; paid tiers may suppress it.","required":["source","docs","attribution"],"properties":{"source":{"type":"string","example":"flowframe.xyz"},"docs":{"type":"string","format":"uri"},"attribution":{"type":"object","required":["required","label","url","tier"],"properties":{"required":{"type":"boolean","description":"True for free-tier keys, false for paid tiers."},"label":{"type":"string","example":"Powered by FlowFrame"},"url":{"type":"string","format":"uri"},"terms":{"type":"string","format":"uri"},"tier":{"type":"string","enum":["free","starter","pro","institutional"]}}}}}},"additionalProperties":true}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimitExceeded"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/v1/movers/polymarket":{"get":{"summary":"Polymarket biggest movers","description":"Markets with the largest YES-price changes over the selected window.","parameters":[{"name":"window","in":"query","schema":{"type":"string","enum":["1h","4h","12h","24h"],"default":"24h"}},{"name":"direction","in":"query","schema":{"type":"string","enum":["up","down","both"],"default":"both"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Mover items envelope.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"type":"object","properties":{"conditionId":{"type":["string","null"]},"marketTitle":{"type":["string","null"]},"currentPrice":{"type":"number"},"priceFrom":{"type":"number"},"priceTo":{"type":"number"},"deltaPct":{"type":"number"},"deltaAbsPct":{"type":"number"},"volume24h":{"type":["number","null"]},"liquidity":{"type":["number","null"]},"polymarketUrl":{"type":["string","null"]}}}},"meta":{"type":"object","required":["fetchedAt","brand"],"properties":{"fetchedAt":{"type":"string","format":"date-time"},"nextCursor":{"type":["string","null"]},"count":{"type":"integer"},"brand":{"type":"object","description":"FlowFrame branding + attribution metadata. Free-tier keys MUST display the attribution label in any UI built on top of this API; paid tiers may suppress it.","required":["source","docs","attribution"],"properties":{"source":{"type":"string","example":"flowframe.xyz"},"docs":{"type":"string","format":"uri"},"attribution":{"type":"object","required":["required","label","url","tier"],"properties":{"required":{"type":"boolean","description":"True for free-tier keys, false for paid tiers."},"label":{"type":"string","example":"Powered by FlowFrame"},"url":{"type":"string","format":"uri"},"terms":{"type":"string","format":"uri"},"tier":{"type":"string","enum":["free","starter","pro","institutional"]}}}}}},"additionalProperties":true}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimitExceeded"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/v1/movers/kalshi":{"get":{"summary":"Kalshi biggest movers","description":"Kalshi markets with the largest YES-price changes since midnight UTC (Kalshi's `previous_yes_bid` reference resets daily — the effective window is 0–24h). Sorted by absolute price change. Excludes settled, sub-2¢ moves, and terminal-priced markets (≤1¢ or ≥99¢).","parameters":[{"name":"direction","in":"query","schema":{"type":"string","enum":["up","down","both"],"default":"both"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Kalshi mover items envelope.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"type":"object","properties":{"ticker":{"type":"string","description":"Kalshi market ticker (e.g., KXBTCD-25MAY0817-T92500)."},"eventTicker":{"type":"string","description":"Parent event ticker."},"title":{"type":"string"},"eventTitle":{"type":"string"},"category":{"type":"string"},"currentPrice":{"type":"number","description":"Current YES price in cents (0–100)."},"previousPrice":{"type":"number","description":"Reference YES price in cents (0–100), set by Kalshi at midnight UTC."},"priceChange":{"type":"number","description":"Signed cent change vs. previousPrice."},"priceChangePercent":{"type":"number"},"volume24h":{"type":"number"},"openInterest":{"type":"number"},"closeTime":{"type":"string","format":"date-time"},"direction":{"type":"string","enum":["up","down"]},"kalshiUrl":{"type":"string","format":"uri"}}}},"meta":{"type":"object","required":["fetchedAt","brand"],"properties":{"fetchedAt":{"type":"string","format":"date-time"},"nextCursor":{"type":["string","null"]},"count":{"type":"integer"},"brand":{"type":"object","description":"FlowFrame branding + attribution metadata. Free-tier keys MUST display the attribution label in any UI built on top of this API; paid tiers may suppress it.","required":["source","docs","attribution"],"properties":{"source":{"type":"string","example":"flowframe.xyz"},"docs":{"type":"string","format":"uri"},"attribution":{"type":"object","required":["required","label","url","tier"],"properties":{"required":{"type":"boolean","description":"True for free-tier keys, false for paid tiers."},"label":{"type":"string","example":"Powered by FlowFrame"},"url":{"type":"string","format":"uri"},"terms":{"type":"string","format":"uri"},"tier":{"type":"string","enum":["free","starter","pro","institutional"]}}}}}},"additionalProperties":true}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimitExceeded"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/v1/markets/kalshi/trending":{"get":{"summary":"Kalshi trending markets","description":"Top open Kalshi markets ranked by 24h volume. Sports categories (NFL/NBA/NHL/MLB/NCAA) are excluded; all others (Politics, Economics, Crypto, etc.) are included.","parameters":[{"name":"category","in":"query","schema":{"type":"string"},"description":"Optional case-insensitive category filter (e.g., 'Politics', 'Economics', 'Crypto')."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Kalshi trending items envelope.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"type":"object","properties":{"ticker":{"type":"string"},"title":{"type":"string"},"yesPrice":{"type":"number","description":"Current YES price (0–1)."},"volume24h":{"type":"number"},"openInterest":{"type":"number"},"category":{"type":"string"},"closeTime":{"type":"string","format":"date-time"},"kalshiUrl":{"type":"string","format":"uri"}}}},"meta":{"type":"object","required":["fetchedAt","brand"],"properties":{"fetchedAt":{"type":"string","format":"date-time"},"nextCursor":{"type":["string","null"]},"count":{"type":"integer"},"brand":{"type":"object","description":"FlowFrame branding + attribution metadata. Free-tier keys MUST display the attribution label in any UI built on top of this API; paid tiers may suppress it.","required":["source","docs","attribution"],"properties":{"source":{"type":"string","example":"flowframe.xyz"},"docs":{"type":"string","format":"uri"},"attribution":{"type":"object","required":["required","label","url","tier"],"properties":{"required":{"type":"boolean","description":"True for free-tier keys, false for paid tiers."},"label":{"type":"string","example":"Powered by FlowFrame"},"url":{"type":"string","format":"uri"},"terms":{"type":"string","format":"uri"},"tier":{"type":"string","enum":["free","starter","pro","institutional"]}}}}}},"additionalProperties":true}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimitExceeded"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/v1/trades/recent":{"get":{"summary":"Live whale trade feed","description":"Recent trades (sorted newest first) executed by FlowFrame's tracked top-trader wallets on Polymarket. Filter by minimum USDC size, side (BUY/SELL), and a `since` timestamp.","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"minSize","in":"query","schema":{"type":"number","minimum":0,"maximum":10000000,"default":1000},"description":"Minimum USDC notional. Default $1,000."},{"name":"side","in":"query","schema":{"type":"string","enum":["BUY","SELL"]}},{"name":"since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Only return trades at or after this ISO 8601 timestamp."}],"responses":{"200":{"description":"Trade items envelope.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"type":"object","properties":{"timestamp":{"type":"string","format":"date-time"},"wallet":{"type":"string","description":"Polymarket proxy wallet address of the trader."},"conditionId":{"type":"string"},"marketTitle":{"type":"string"},"marketSlug":{"type":"string"},"outcome":{"type":"string","description":"Outcome name (e.g., 'Yes', 'No', or a multi-outcome label)."},"side":{"type":"string","enum":["BUY","SELL"]},"price":{"type":"number","description":"Execution price (0–1)."},"size":{"type":"number","description":"Share count."},"usdcSize":{"type":"number","description":"USDC notional of the trade."},"transactionHash":{"type":"string"},"polymarketProfileUrl":{"type":"string","format":"uri"},"polymarketMarketUrl":{"type":["string","null"],"format":"uri"}}}},"meta":{"type":"object","required":["fetchedAt","brand"],"properties":{"fetchedAt":{"type":"string","format":"date-time"},"nextCursor":{"type":["string","null"]},"count":{"type":"integer"},"brand":{"type":"object","description":"FlowFrame branding + attribution metadata. Free-tier keys MUST display the attribution label in any UI built on top of this API; paid tiers may suppress it.","required":["source","docs","attribution"],"properties":{"source":{"type":"string","example":"flowframe.xyz"},"docs":{"type":"string","format":"uri"},"attribution":{"type":"object","required":["required","label","url","tier"],"properties":{"required":{"type":"boolean","description":"True for free-tier keys, false for paid tiers."},"label":{"type":"string","example":"Powered by FlowFrame"},"url":{"type":"string","format":"uri"},"terms":{"type":"string","format":"uri"},"tier":{"type":"string","enum":["free","starter","pro","institutional"]}}}}}},"additionalProperties":true}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimitExceeded"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/v1/blog":{"get":{"summary":"List FlowFrame Research articles","description":"Returns published blog articles in reverse chronological order. List view omits the full markdown `content` to keep payloads small — fetch `/v1/blog/{identifier}` (slug or UUID) for the full body. Cursor pagination via `meta.nextCursor`.","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":50,"default":20}},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor returned in `meta.nextCursor`."},{"name":"source","in":"query","schema":{"type":"string","enum":["blog","seo"]},"description":"'blog' = Deep Research; 'seo' = Market Insights."},{"name":"category","in":"query","schema":{"type":"string"},"description":"Case-insensitive exact match on category."},{"name":"since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Only articles published at or after this ISO 8601 timestamp."}],"responses":{"200":{"description":"Blog summary items envelope.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":["string","null"]},"title":{"type":"string"},"summary":{"type":"string"},"coverImage":{"type":["string","null"]},"author":{"type":"string"},"category":{"type":["string","null"]},"readTimeMinutes":{"type":"integer"},"publishedAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"source":{"type":["string","null"],"enum":["blog","seo",null],"description":"'blog' = Deep Research; 'seo' = Market Insights."},"keywords":{"type":"array","items":{"type":"string"}},"polymarketLinks":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"title":{"type":["string","null"]}}}},"permalink":{"type":["string","null"],"format":"uri"}}}},"meta":{"type":"object","required":["fetchedAt","brand"],"properties":{"fetchedAt":{"type":"string","format":"date-time"},"nextCursor":{"type":["string","null"]},"count":{"type":"integer"},"brand":{"type":"object","description":"FlowFrame branding + attribution metadata. Free-tier keys MUST display the attribution label in any UI built on top of this API; paid tiers may suppress it.","required":["source","docs","attribution"],"properties":{"source":{"type":"string","example":"flowframe.xyz"},"docs":{"type":"string","format":"uri"},"attribution":{"type":"object","required":["required","label","url","tier"],"properties":{"required":{"type":"boolean","description":"True for free-tier keys, false for paid tiers."},"label":{"type":"string","example":"Powered by FlowFrame"},"url":{"type":"string","format":"uri"},"terms":{"type":"string","format":"uri"},"tier":{"type":"string","enum":["free","starter","pro","institutional"]}}}}}},"additionalProperties":true}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimitExceeded"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/v1/blog/{identifier}":{"get":{"summary":"Get a single blog article","description":"Identifier is either the article UUID or its slug. Returns the full article including markdown `content`. 404 if not found.","parameters":[{"name":"identifier","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Single blog article envelope.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":["string","null"]},"title":{"type":"string"},"summary":{"type":"string"},"coverImage":{"type":["string","null"]},"author":{"type":"string"},"category":{"type":["string","null"]},"readTimeMinutes":{"type":"integer"},"publishedAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"source":{"type":["string","null"],"enum":["blog","seo",null],"description":"'blog' = Deep Research; 'seo' = Market Insights."},"keywords":{"type":"array","items":{"type":"string"}},"polymarketLinks":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"title":{"type":["string","null"]}}}},"permalink":{"type":["string","null"],"format":"uri"},"content":{"type":"string","description":"Full markdown article body."},"metaDescription":{"type":["string","null"]}}},"meta":{"type":"object","required":["fetchedAt","brand"],"properties":{"fetchedAt":{"type":"string","format":"date-time"},"nextCursor":{"type":["string","null"]},"count":{"type":"integer"},"brand":{"type":"object","description":"FlowFrame branding + attribution metadata. Free-tier keys MUST display the attribution label in any UI built on top of this API; paid tiers may suppress it.","required":["source","docs","attribution"],"properties":{"source":{"type":"string","example":"flowframe.xyz"},"docs":{"type":"string","format":"uri"},"attribution":{"type":"object","required":["required","label","url","tier"],"properties":{"required":{"type":"boolean","description":"True for free-tier keys, false for paid tiers."},"label":{"type":"string","example":"Powered by FlowFrame"},"url":{"type":"string","format":"uri"},"terms":{"type":"string","format":"uri"},"tier":{"type":"string","enum":["free","starter","pro","institutional"]}}}}}},"additionalProperties":true}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimitExceeded"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/v1/smart-money/skew":{"get":{"summary":"Smart Money Skew","description":"Markets where top profitable traders are concentrated on one side, ranked by absolute composite skew score.","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"minScore","in":"query","schema":{"type":"number"},"description":"Filter to markets with `|compositeSkewScore| >= minScore`."}],"responses":{"200":{"description":"Skew items envelope.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"type":"object","properties":{"conditionId":{"type":"string"},"marketTitle":{"type":"string"},"marketPrice":{"type":"number"},"impliedFairValue":{"type":"number"},"edgePct":{"type":"number"},"compositeSkewScore":{"type":"number"},"tiers":{"type":"object","properties":{"sharp":{"$ref":"#/components/schemas/SkewTier"},"profitable":{"$ref":"#/components/schemas/SkewTier"},"recreational":{"$ref":"#/components/schemas/SkewTier"}}},"polymarketUrl":{"type":["string","null"]}}}},"meta":{"type":"object","required":["fetchedAt","brand"],"properties":{"fetchedAt":{"type":"string","format":"date-time"},"nextCursor":{"type":["string","null"]},"count":{"type":"integer"},"brand":{"type":"object","description":"FlowFrame branding + attribution metadata. Free-tier keys MUST display the attribution label in any UI built on top of this API; paid tiers may suppress it.","required":["source","docs","attribution"],"properties":{"source":{"type":"string","example":"flowframe.xyz"},"docs":{"type":"string","format":"uri"},"attribution":{"type":"object","required":["required","label","url","tier"],"properties":{"required":{"type":"boolean","description":"True for free-tier keys, false for paid tiers."},"label":{"type":"string","example":"Powered by FlowFrame"},"url":{"type":"string","format":"uri"},"terms":{"type":"string","format":"uri"},"tier":{"type":"string","enum":["free","starter","pro","institutional"]}}}}}},"additionalProperties":true}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimitExceeded"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/v1/markets/{conditionId}/price-history":{"get":{"summary":"Historical price + volume series for a market (paid)","description":"Returns 30-min snapshots of YES/NO price and trailing-24h volume for the given Polymarket conditionId, downsampled to the requested interval. Backed by the persistent `correlation_market_snapshots` table; coverage depends on when FlowFrame began tracking the market. **Requires a paid tier (Starter, Pro, or Institutional).**","parameters":[{"name":"conditionId","in":"path","required":true,"schema":{"type":"string"}},{"name":"interval","in":"query","schema":{"type":"string","enum":["30m","1h","4h","1d"],"default":"1h"}},{"name":"since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Only snapshots at or after this ISO 8601 timestamp."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":500,"default":200},"description":"Maximum number of bucketed points returned (most recent first-trimmed window)."}],"responses":{"200":{"description":"Price-history envelope.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"type":"object","properties":{"timestamp":{"type":"string","format":"date-time"},"yesPrice":{"type":"number","description":"YES outcome price (0–1)."},"noPrice":{"type":["number","null"]},"volume24h":{"type":["number","null"],"description":"Trailing 24h USDC volume at snapshot time."}}}},"meta":{"type":"object","required":["fetchedAt","brand"],"properties":{"fetchedAt":{"type":"string","format":"date-time"},"nextCursor":{"type":["string","null"]},"count":{"type":"integer"},"brand":{"type":"object","description":"FlowFrame branding + attribution metadata. Free-tier keys MUST display the attribution label in any UI built on top of this API; paid tiers may suppress it.","required":["source","docs","attribution"],"properties":{"source":{"type":"string","example":"flowframe.xyz"},"docs":{"type":"string","format":"uri"},"attribution":{"type":"object","required":["required","label","url","tier"],"properties":{"required":{"type":"boolean","description":"True for free-tier keys, false for paid tiers."},"label":{"type":"string","example":"Powered by FlowFrame"},"url":{"type":"string","format":"uri"},"terms":{"type":"string","format":"uri"},"tier":{"type":"string","enum":["free","starter","pro","institutional"]}}}}}},"additionalProperties":true}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimitExceeded"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/v1/signals/breakout":{"get":{"summary":"Volume-velocity breakout signal (paid)","description":"Polymarket markets ranked by **volume velocity** (24h volume as a fraction of all-time volume). Tiers: `breaking` (>6%), `trending` (3-6%), `heating-up` (1-3%). Excludes already-resolved (>95% / <5%), Bitcoin/Ethereum, and 2028-presidential markets. **Requires a paid tier.**","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"minVelocityPercent","in":"query","schema":{"type":"number","minimum":0,"maximum":100,"default":1},"description":"Minimum velocity (24h vol / total vol × 100). Default 1."},{"name":"minVolume24h","in":"query","schema":{"type":"number","minimum":0,"default":10000},"description":"Minimum 24h USDC volume. Default $10,000."}],"responses":{"200":{"description":"Breakout items envelope.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"type":"object","properties":{"conditionId":{"type":["string","null"]},"marketTitle":{"type":["string","null"]},"velocityPercent":{"type":"number","description":"volume_24h / volume_total × 100."},"tier":{"type":"string","enum":["breaking","trending","heating-up"]},"volume24h":{"type":"number"},"volumeTotal":{"type":"number"},"currentYesPrice":{"type":["number","null"]},"priceChange24hYes":{"type":["number","null"]},"liquidity":{"type":["number","null"]},"polymarketUrl":{"type":["string","null"]}}}},"meta":{"type":"object","required":["fetchedAt","brand"],"properties":{"fetchedAt":{"type":"string","format":"date-time"},"nextCursor":{"type":["string","null"]},"count":{"type":"integer"},"brand":{"type":"object","description":"FlowFrame branding + attribution metadata. Free-tier keys MUST display the attribution label in any UI built on top of this API; paid tiers may suppress it.","required":["source","docs","attribution"],"properties":{"source":{"type":"string","example":"flowframe.xyz"},"docs":{"type":"string","format":"uri"},"attribution":{"type":"object","required":["required","label","url","tier"],"properties":{"required":{"type":"boolean","description":"True for free-tier keys, false for paid tiers."},"label":{"type":"string","example":"Powered by FlowFrame"},"url":{"type":"string","format":"uri"},"terms":{"type":"string","format":"uri"},"tier":{"type":"string","enum":["free","starter","pro","institutional"]}}}}}},"additionalProperties":true}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimitExceeded"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/v1/signals/spread-widening":{"get":{"summary":"Spread-widening fragility signal (paid)","description":"Markets whose current bid-ask spread is `minRatio`× larger than their 7-day baseline (excluding the most recent 6 hours). A precursor to volatility — widening spreads often lead price moves. **Requires a paid tier.**","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"minRatio","in":"query","schema":{"type":"number","minimum":1.05,"default":1.5},"description":"Spread-widening threshold. 1.5 = current spread ≥ 150% of baseline."},{"name":"min24hVolume","in":"query","schema":{"type":"number","minimum":0,"default":5000}},{"name":"minLiquidity","in":"query","schema":{"type":"number","minimum":0,"default":2000}}],"responses":{"200":{"description":"Spread-widening items envelope.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"type":"object","properties":{"conditionId":{"type":"string"},"marketSlug":{"type":["string","null"]},"marketTitle":{"type":"string"},"category":{"type":"string"},"yesPrice":{"type":"number"},"snapshotTime":{"type":"string","format":"date-time"},"currentSpreadPercent":{"type":"number"},"baselineSpreadPercent":{"type":"number","description":"7-day rolling mean spread (excluding the most recent 6 hours)."},"wideningRatio":{"type":"number","description":"currentSpreadPercent / baselineSpreadPercent."},"liquidity":{"type":"number"},"volume24h":{"type":"number"},"polymarketUrl":{"type":["string","null"]}}}},"meta":{"type":"object","required":["fetchedAt","brand"],"properties":{"fetchedAt":{"type":"string","format":"date-time"},"nextCursor":{"type":["string","null"]},"count":{"type":"integer"},"brand":{"type":"object","description":"FlowFrame branding + attribution metadata. Free-tier keys MUST display the attribution label in any UI built on top of this API; paid tiers may suppress it.","required":["source","docs","attribution"],"properties":{"source":{"type":"string","example":"flowframe.xyz"},"docs":{"type":"string","format":"uri"},"attribution":{"type":"object","required":["required","label","url","tier"],"properties":{"required":{"type":"boolean","description":"True for free-tier keys, false for paid tiers."},"label":{"type":"string","example":"Powered by FlowFrame"},"url":{"type":"string","format":"uri"},"terms":{"type":"string","format":"uri"},"tier":{"type":"string","enum":["free","starter","pro","institutional"]}}}}}},"additionalProperties":true}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimitExceeded"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/v1/mentions/speakers":{"get":{"summary":"List speakers covered by Mentions Hub","description":"Curated whitelist of public-domain political speakers, with transcript counts and date ranges. TV-host transcripts (cable news, podcasts) are excluded from the public API for licensing reasons.","responses":{"200":{"description":"Speakers envelope.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"title":{"type":["string","null"]},"party":{"type":["string","null"]},"transcriptCount":{"type":"integer"},"earliestDate":{"type":["string","null"],"description":"Earliest transcript date (YYYY-MM-DD)."},"latestDate":{"type":["string","null"],"description":"Most recent transcript date (YYYY-MM-DD)."},"mentionsUrl":{"type":"string","format":"uri"}}}},"meta":{"type":"object","required":["fetchedAt","brand"],"properties":{"fetchedAt":{"type":"string","format":"date-time"},"nextCursor":{"type":["string","null"]},"count":{"type":"integer"},"brand":{"type":"object","description":"FlowFrame branding + attribution metadata. Free-tier keys MUST display the attribution label in any UI built on top of this API; paid tiers may suppress it.","required":["source","docs","attribution"],"properties":{"source":{"type":"string","example":"flowframe.xyz"},"docs":{"type":"string","format":"uri"},"attribution":{"type":"object","required":["required","label","url","tier"],"properties":{"required":{"type":"boolean","description":"True for free-tier keys, false for paid tiers."},"label":{"type":"string","example":"Powered by FlowFrame"},"url":{"type":"string","format":"uri"},"terms":{"type":"string","format":"uri"},"tier":{"type":"string","enum":["free","starter","pro","institutional"]}}}}}},"additionalProperties":true}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimitExceeded"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/v1/mentions/search":{"get":{"summary":"Keyword search across speech transcripts","description":"Returns transcripts that mention the keyword `q`, each with up to several ±250-character snippets centered on the match. Slash-separated terms (e.g., `tariff / tariffs`) are treated as alternation. Cross-transcript snippet dedup hides repeated talking points. Use `offset` for pagination — counts in `meta.totalDocuments`/`totalMentions` reflect the full unpaginated result.","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":80},"description":"Keyword (2-80 chars). Slash means OR (e.g., `recession / depression`)."},{"name":"speaker","in":"query","schema":{"type":"string","enum":["donald-trump","jd-vance","karoline-leavitt","pete-hegseth","marco-rubio","jerome-powell"]},"description":"Optional speaker slug. Omit to search all whitelisted speakers."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":50,"default":20}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"maximum":1000,"default":0}}],"responses":{"200":{"description":"Mentions search envelope.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"type":"object","properties":{"transcriptId":{"type":"string"},"speakerSlug":{"type":"string"},"speakerName":{"type":"string"},"date":{"type":"string","description":"YYYY-MM-DD."},"title":{"type":"string"},"source":{"type":"string"},"eventFormat":{"type":["string","null"],"description":"Inferred event format (rally, press_conference, formal_address, etc.)."},"url":{"type":["string","null"]},"mentionCount":{"type":"integer","description":"Distinct snippets returned for this transcript."},"snippets":{"type":"array","items":{"type":"string"},"description":"±250 character context windows around each match."}}}},"meta":{"type":"object","required":["fetchedAt","brand"],"properties":{"fetchedAt":{"type":"string","format":"date-time"},"nextCursor":{"type":["string","null"]},"count":{"type":"integer"},"brand":{"type":"object","description":"FlowFrame branding + attribution metadata. Free-tier keys MUST display the attribution label in any UI built on top of this API; paid tiers may suppress it.","required":["source","docs","attribution"],"properties":{"source":{"type":"string","example":"flowframe.xyz"},"docs":{"type":"string","format":"uri"},"attribution":{"type":"object","required":["required","label","url","tier"],"properties":{"required":{"type":"boolean","description":"True for free-tier keys, false for paid tiers."},"label":{"type":"string","example":"Powered by FlowFrame"},"url":{"type":"string","format":"uri"},"terms":{"type":"string","format":"uri"},"tier":{"type":"string","enum":["free","starter","pro","institutional"]}}}}}},"additionalProperties":true}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimitExceeded"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/v1/mentions/frequency":{"get":{"summary":"Mention frequency time series","description":"Returns the count of times `q` appears across speech transcripts, bucketed by `granularity`. Use this to track how often a topic is discussed over time and correlate it with prediction-market price moves.","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":80}},{"name":"speaker","in":"query","schema":{"type":"string","enum":["donald-trump","jd-vance","karoline-leavitt","pete-hegseth","marco-rubio","jerome-powell"]}},{"name":"granularity","in":"query","schema":{"type":"string","enum":["day","week","month","year"],"default":"month"}}],"responses":{"200":{"description":"Mention frequency envelope.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"type":"object","properties":{"period":{"type":"string","description":"Bucket label. Format depends on granularity: day=YYYY-MM-DD, week=YYYY-MM-DD (Sunday), month=YYYY-MM, year=YYYY."},"mentionCount":{"type":"integer","description":"Total occurrences of `q` across all transcripts in this period."},"transcriptCount":{"type":"integer","description":"Number of distinct transcripts containing `q` in this period."}}}},"meta":{"type":"object","required":["fetchedAt","brand"],"properties":{"fetchedAt":{"type":"string","format":"date-time"},"nextCursor":{"type":["string","null"]},"count":{"type":"integer"},"brand":{"type":"object","description":"FlowFrame branding + attribution metadata. Free-tier keys MUST display the attribution label in any UI built on top of this API; paid tiers may suppress it.","required":["source","docs","attribution"],"properties":{"source":{"type":"string","example":"flowframe.xyz"},"docs":{"type":"string","format":"uri"},"attribution":{"type":"object","required":["required","label","url","tier"],"properties":{"required":{"type":"boolean","description":"True for free-tier keys, false for paid tiers."},"label":{"type":"string","example":"Powered by FlowFrame"},"url":{"type":"string","format":"uri"},"terms":{"type":"string","format":"uri"},"tier":{"type":"string","enum":["free","starter","pro","institutional"]}}}}}},"additionalProperties":true}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimitExceeded"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/v1/smart-money/skew/{conditionId}":{"get":{"summary":"Smart Money Skew for a single market","parameters":[{"name":"conditionId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Single skew item envelope.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"object","properties":{"conditionId":{"type":"string"},"marketTitle":{"type":"string"},"marketPrice":{"type":"number"},"impliedFairValue":{"type":"number"},"edgePct":{"type":"number"},"compositeSkewScore":{"type":"number"},"tiers":{"type":"object","properties":{"sharp":{"$ref":"#/components/schemas/SkewTier"},"profitable":{"$ref":"#/components/schemas/SkewTier"},"recreational":{"$ref":"#/components/schemas/SkewTier"}}},"polymarketUrl":{"type":["string","null"]}}},"meta":{"type":"object","required":["fetchedAt","brand"],"properties":{"fetchedAt":{"type":"string","format":"date-time"},"nextCursor":{"type":["string","null"]},"count":{"type":"integer"},"brand":{"type":"object","description":"FlowFrame branding + attribution metadata. Free-tier keys MUST display the attribution label in any UI built on top of this API; paid tiers may suppress it.","required":["source","docs","attribution"],"properties":{"source":{"type":"string","example":"flowframe.xyz"},"docs":{"type":"string","format":"uri"},"attribution":{"type":"object","required":["required","label","url","tier"],"properties":{"required":{"type":"boolean","description":"True for free-tier keys, false for paid tiers."},"label":{"type":"string","example":"Powered by FlowFrame"},"url":{"type":"string","format":"uri"},"terms":{"type":"string","format":"uri"},"tier":{"type":"string","enum":["free","starter","pro","institutional"]}}}}}},"additionalProperties":true}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimitExceeded"},"500":{"$ref":"#/components/responses/InternalError"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"API key in the form `flowframe_live_*` or `flowframe_test_*`."}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"string","enum":["unauthorized","forbidden","rate_limit_exceeded","not_found","validation_error","internal_error"]},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}}}},"retryAfterSeconds":{"type":"integer"}}},"SkewTier":{"type":"object","properties":{"yesDollars":{"type":"number"},"noDollars":{"type":"number"},"yesCount":{"type":"integer"},"noCount":{"type":"integer"},"skew":{"type":"number"}}}},"headers":{"RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests permitted per hour for this key."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Remaining requests in the current hour."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the current window resets."},"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the client may retry (sent on 429)."}},"responses":{"Unauthorized":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","enum":["unauthorized","forbidden","rate_limit_exceeded","not_found","validation_error","internal_error"]},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}}}},"retryAfterSeconds":{"type":"integer"}}},"example":{"error":"unauthorized"}}}},"Forbidden":{"description":"API key valid but lacks permission.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","enum":["unauthorized","forbidden","rate_limit_exceeded","not_found","validation_error","internal_error"]},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}}}},"retryAfterSeconds":{"type":"integer"}}},"example":{"error":"forbidden"}}}},"NotFound":{"description":"Resource not found.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","enum":["unauthorized","forbidden","rate_limit_exceeded","not_found","validation_error","internal_error"]},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}}}},"retryAfterSeconds":{"type":"integer"}}},"example":{"error":"not_found"}}}},"ValidationError":{"description":"Request parameters failed validation.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","enum":["unauthorized","forbidden","rate_limit_exceeded","not_found","validation_error","internal_error"]},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}}}},"retryAfterSeconds":{"type":"integer"}}},"example":{"error":"validation_error","details":[{"message":"limit must be integer between 1 and 100"}]}}}},"RateLimitExceeded":{"description":"Per-key rate limit exceeded for the current 1-hour window.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","enum":["unauthorized","forbidden","rate_limit_exceeded","not_found","validation_error","internal_error"]},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}}}},"retryAfterSeconds":{"type":"integer"}}},"example":{"error":"rate_limit_exceeded","retryAfterSeconds":1234}}}},"InternalError":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","enum":["unauthorized","forbidden","rate_limit_exceeded","not_found","validation_error","internal_error"]},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}}}},"retryAfterSeconds":{"type":"integer"}}},"example":{"error":"internal_error"}}}}}}}