{"openapi":"3.0.3","info":{"title":"Nabz Market API","version":"1.0.0","description":"Financial market data for Iran and the world.\n\n**Authentication:** send `Authorization: Bearer <TOKEN>` where the token is a JWT from `POST /api/v1/auth/login` or an API key (`nbz_…`). Requests without valid credentials receive `401`."},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT or API key"}},"schemas":{"def-0":{"type":"object","properties":{"symbol":{"type":"string","example":"USD"},"slug":{"type":"string","example":"usd"},"name":{"type":"string","description":"Persian name"},"nameEn":{"type":"string"},"category":{"type":"string","enum":["gold","currency","crypto","domestic","global","commodity","stock","fund","exchange"]},"currency":{"type":"string","example":"IRT"},"unit":{"type":"string","example":"toman"},"price":{"type":"number","nullable":true},"change":{"type":"number","nullable":true},"changePercent":{"type":"number","nullable":true},"high":{"type":"number","nullable":true},"low":{"type":"number","nullable":true},"open":{"type":"number","nullable":true},"previousClose":{"type":"number","nullable":true},"volume":{"type":"number","nullable":true},"marketCap":{"type":"number","nullable":true},"priceIrt":{"type":"number","description":"USD-quoted assets converted to toman using the USD/IRT quote, when available","nullable":true},"intrinsic":{"type":"number","description":"Coins: gold value of the coin (24K gold price x pure gold grams)","nullable":true},"bubble":{"type":"number","description":"Coins: price minus intrinsic value","nullable":true},"bubblePercent":{"type":"number","description":"Coins: bubble as % of intrinsic value","nullable":true},"source":{"type":"string","description":"Attribution credit when the upstream terms require one (e.g. CoinGecko); otherwise null","nullable":true},"updatedAt":{"type":"string","description":"Time this system last stored a valid quote","nullable":true},"dataStatus":{"type":"string","enum":["fresh","stale","unavailable"]},"providerStatus":{"type":"string","enum":["healthy","degraded","down"]},"marketStatus":{"type":"string","enum":["OPEN","CLOSED","PRE_MARKET","AFTER_HOURS","UNKNOWN"]},"suspicious":{"type":"boolean","description":"A recent provider reading was held back by the deviation guard"},"sparkline":{"type":"array","items":{"type":"number"}}},"required":["symbol","slug","name","nameEn","category","currency","unit","price","dataStatus","providerStatus","marketStatus"],"title":"Market"},"def-1":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{},"requestId":{"type":"string"}},"required":["code","message"]}},"required":["success","error"],"title":"ErrorResponse"}}},"paths":{"/api/v1/auth/login":{"post":{"summary":"Exchange email + password for a JWT","tags":["Auth"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email","password"],"additionalProperties":false,"properties":{"email":{"type":"string","minLength":3,"maxLength":254},"password":{"type":"string","minLength":1,"maxLength":200}}}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"token":{"type":"string"},"expiresIn":{"type":"integer"},"user":{"type":"object","properties":{"id":{"type":"integer"},"email":{"type":"string"},"role":{"type":"string"}}}}}},"required":["success","data"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}}}}},"/api/v1/auth/me":{"get":{"summary":"Current principal","tags":["Auth"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"type":{"type":"string"},"role":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"email":{"type":"string","nullable":true}}}},"required":["success","data"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}}}}},"/api/v1/markets":{"get":{"summary":"List markets","tags":["Markets"],"parameters":[{"schema":{"type":"string","enum":["gold","currency","crypto","domestic","global","commodity","stock","fund","exchange"]},"in":"query","name":"category","required":false},{"schema":{"type":"string","maxLength":2000},"in":"query","name":"symbols","required":false,"description":"Comma separated symbols or slugs"},{"schema":{"type":"boolean","default":false},"in":"query","name":"sparkline","required":false},{"schema":{"type":"integer","minimum":1,"default":1},"in":"query","name":"page","required":false},{"schema":{"type":"integer","minimum":1,"maximum":1000,"default":100},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":1,"maximum":50},"in":"query","name":"perCategory","required":false,"description":"Return only the first N assets of each category (dashboards); meta.counts holds the full per-category totals"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/def-0"}},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}}}}},"/api/v1/markets/gold":{"get":{"summary":"List gold markets","tags":["Markets"],"parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"sparkline","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/def-0"}},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}}}}},"/api/v1/markets/currencies":{"get":{"summary":"List currencies markets","tags":["Markets"],"parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"sparkline","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/def-0"}},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}}}}},"/api/v1/markets/crypto":{"get":{"summary":"List crypto markets","tags":["Markets"],"parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"sparkline","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/def-0"}},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}}}}},"/api/v1/markets/domestic":{"get":{"summary":"List domestic markets","tags":["Markets"],"parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"sparkline","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/def-0"}},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}}}}},"/api/v1/markets/global":{"get":{"summary":"List global markets","tags":["Markets"],"parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"sparkline","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/def-0"}},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}}}}},"/api/v1/markets/commodity":{"get":{"summary":"List commodity markets","tags":["Markets"],"parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"sparkline","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/def-0"}},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}}}}},"/api/v1/markets/movers":{"get":{"summary":"Biggest daily gainers and losers (fresh data only)","tags":["Markets"],"parameters":[{"schema":{"type":"string","enum":["gold","currency","crypto","domestic","global","commodity","stock","fund","exchange"]},"in":"query","name":"category","required":false},{"schema":{"type":"integer","minimum":1,"maximum":50,"default":10},"in":"query","name":"limit","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"gainers":{"type":"array","items":{"$ref":"#/components/schemas/def-0"}},"losers":{"type":"array","items":{"$ref":"#/components/schemas/def-0"}}}}},"required":["success","data"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}}}}},"/api/v1/markets/overview":{"get":{"summary":"Dashboard overview (key markets with sparklines)","tags":["Markets"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/def-0"}},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}}}}},"/api/v1/markets/{id}":{"get":{"summary":"Market detail by symbol or slug","tags":["Markets"],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[A-Za-z0-9_-]+$"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/def-0"}},"required":["success","data"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}}}}},"/api/v1/markets/{id}/history":{"get":{"summary":"OHLC history","tags":["Markets"],"description":"Served from the local database; providers are only consulted to backfill missing data. `volume` is null when the source has none.","parameters":[{"schema":{"type":"string","enum":["1H","4H","1D","1W","1M","3M","1Y","ALL"],"default":"1D"},"in":"query","name":"range","required":false},{"schema":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[A-Za-z0-9_-]+$"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"symbol":{"type":"string"},"range":{"type":"string"},"source":{"type":"string","nullable":true},"candles":{"type":"array","items":{"type":"object","properties":{"time":{"type":"string"},"open":{"type":"number"},"high":{"type":"number"},"low":{"type":"number"},"close":{"type":"number"},"volume":{"type":"number","nullable":true}}}}}}},"required":["success","data"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}}}}},"/api/v1/markets/{id}/stats":{"get":{"summary":"Detail statistics: day range, performance, SMA/EMA","tags":["Markets"],"description":"Values that cannot be computed from the history available so far are null.","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[A-Za-z0-9_-]+$"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"symbol":{"type":"string"},"price":{"type":"number","nullable":true},"dayOpen":{"type":"number","nullable":true},"dayHigh":{"type":"number","nullable":true},"dayLow":{"type":"number","nullable":true},"amplitude":{"type":"number","nullable":true},"amplitudePercent":{"type":"number","nullable":true},"dayRangeSource":{"type":"string","nullable":true},"previousClose":{"type":"number","nullable":true},"change":{"type":"number","nullable":true},"changePercent":{"type":"number","nullable":true},"updatedAt":{"type":"string","nullable":true},"dailyPoints":{"type":"integer"},"historySince":{"type":"string","nullable":true},"performance":{"type":"array","items":{"type":"object","properties":{"period":{"type":"string"},"refPrice":{"type":"number","nullable":true},"refDate":{"type":"string","nullable":true},"change":{"type":"number","nullable":true},"changePercent":{"type":"number","nullable":true}}}},"sma":{"type":"array","items":{"type":"object","properties":{"period":{"type":"integer"},"value":{"type":"number","nullable":true}}}},"ema":{"type":"array","items":{"type":"object","properties":{"period":{"type":"integer"},"value":{"type":"number","nullable":true}}}}}}},"required":["success","data"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}}}}},"/api/v1/search":{"get":{"summary":"Search markets (Persian / English / symbol)","tags":["Markets"],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":60},"in":"query","name":"q","required":true},{"schema":{"type":"integer","minimum":1,"maximum":30,"default":12},"in":"query","name":"limit","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/def-0"}},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}}}}},"/api/v1/favorites":{"get":{"summary":"My favorite markets","tags":["User"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"type":"string"}}},"required":["success","data"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}}}}},"/api/v1/favorites/{id}":{"put":{"summary":"Add a favorite","tags":["User"],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[A-Za-z0-9_-]+$"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"type":"string"}}},"required":["success","data"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}}}},"delete":{"summary":"Remove a favorite","tags":["User"],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[A-Za-z0-9_-]+$"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"type":"string"}}},"required":["success","data"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}}}}},"/api/v1/admin/overview":{"get":{"summary":"System overview: traffic, errors, data freshness, accounts, providers","tags":["Admin"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}}}}},"/api/v1/admin/users":{"get":{"summary":"List users","tags":["Admin"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"type":"object","additionalProperties":true}},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}}}},"post":{"summary":"Create a user","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email","password"],"additionalProperties":false,"properties":{"email":{"type":"string","maxLength":254},"password":{"type":"string","minLength":10,"maxLength":200},"role":{"type":"string","enum":["user","admin"],"default":"user"}}}}}},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}}}}},"/api/v1/admin/users/{id}":{"patch":{"summary":"Change role, activation or password (invalidates the user's existing tokens)","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"role":{"type":"string","enum":["user","admin"]},"isActive":{"type":"boolean"},"password":{"type":"string","minLength":10,"maxLength":200}}}}}},"parameters":[{"schema":{"type":"integer","minimum":1},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}}}}},"/api/v1/admin/keys":{"get":{"summary":"List API keys (hashes are never returned)","tags":["Admin"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"type":"object","additionalProperties":true}},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}}}},"post":{"summary":"Create an API key (the secret is shown once)","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"additionalProperties":false,"properties":{"name":{"type":"string","minLength":1,"maxLength":80},"expiresInDays":{"type":"integer","minimum":1,"maximum":3650}}}}}},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"apiKey":{"type":"string"},"prefix":{"type":"string"}}}},"required":["success","data"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}}}}},"/api/v1/admin/keys/{id}":{"delete":{"summary":"Revoke an API key","tags":["Admin"],"parameters":[{"schema":{"type":"integer","minimum":1},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"revoked":{"type":"boolean"}}}},"required":["success","data"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}}}}},"/api/v1/admin/audit":{"get":{"summary":"Search the API audit log (no credentials are ever stored)","tags":["Admin"],"parameters":[{"schema":{"type":"string","enum":["2xx","3xx","4xx","5xx"]},"in":"query","name":"status","required":false},{"schema":{"type":"string","maxLength":80},"in":"query","name":"q","required":false},{"schema":{"type":"string","maxLength":40,"pattern":"^(user|key):\\d+$"},"in":"query","name":"principal","required":false},{"schema":{"type":"string","enum":["GET","POST","PUT","PATCH","DELETE"]},"in":"query","name":"method","required":false},{"schema":{"type":"integer","minimum":1,"maximum":720},"in":"query","name":"sinceHours","required":false},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"default":0},"in":"query","name":"offset","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"type":"object","additionalProperties":true}},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}}}}},"/api/v1/admin/providers":{"get":{"summary":"Provider health","tags":["Admin"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"type":"object","additionalProperties":true}},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}}}}},"/api/v1/admin/assets":{"get":{"summary":"Every asset with its data status, source and freshness","tags":["Admin"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"type":"object","additionalProperties":true}},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}}}}}}}},"tags":[{"name":"Auth"},{"name":"Markets"},{"name":"User"},{"name":"Admin"},{"name":"System"}]}