{"openapi":"3.1.0","info":{"title":"CryptWatch API","description":"Open, read-only data about every coin CoinMarketCap has listed since 28 April 2013: rank history, movers,\ndelisted coins, year-end prices and icons. No key, no registration.\n\n**Every JSON response** is an envelope `{\"as_of\": \"2026-10-06\", \"source\": \"CoinMarketCap via CryptWatch\",\n\"data\": …, \"page\": {…}}` (`page` only on paged endpoints). Tables are also available as CSV: append `.csv` to the path.\n\n**Caching.** Responses carry `ETag`, `Last-Modified` and `Cache-Control`. Send `If-None-Match` to get `304`.\nData changes after each import (four times a day).\n\n**Fair use.** 60 requests per minute per IP (burst 30), otherwise `429` with `Retry-After`. Send a User-Agent\nwith a contact address. For complete dumps use the bulk files and `/icons/all.zip`, not the API.\nName the source: “Data: CryptWatch, based on CoinMarketCap”. Reselling the raw data as a service is not allowed.\n\n**MCP.** The same data for AI assistants over Streamable HTTP at `/mcp`\n(`{\"mcpServers\": {\"cryptwatch\": {\"url\": \"https://cryptwat.ch/mcp\"}}}`).\n\nErrors are `{\"error\": {\"status\": 404, \"code\": \"not_found\", \"message\": \"…\"}}`.","contact":{"name":"CryptWatch","email":"api@cryptwat.ch"},"version":"1.0.0"},"paths":{"/api/v1/coins":{"get":{"tags":["Coins"],"summary":"Search coins","description":"Search by name, symbol, slug or former name. Without `q`, returns coins by current rank.","operationId":"search_coins","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":100,"description":"Search text","examples":["bit"],"default":"","title":"Q"},"description":"Search text"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"},"example":{"as_of":"2026-10-06","source":"CoinMarketCap via CryptWatch","data":[{"slug":"bitcoin","symbol":"BTC","name":"Bitcoin","status":"active","rank":1},{"slug":"bitcoin-cash","symbol":"BCH","name":"Bitcoin Cash","status":"active","rank":17}]}}}},"304":{"description":"Not modified (send `If-None-Match` with the last `ETag`)."},"422":{"description":"Invalid parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. Limits are per IP (60/min, burst 30), enforced by nginx.","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/coins/{slug}":{"get":{"tags":["Coins"],"summary":"Coin detail","description":"Master data, current rank, key figures, timeline (renames, best rank, delisting) and year-end prices.","operationId":"get_coin","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,99}$","description":"CoinMarketCap slug","examples":["bitcoin"],"title":"Slug"},"description":"CoinMarketCap slug"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CoinResponse"}}}},"304":{"description":"Not modified (send `If-None-Match` with the last `ETag`)."},"422":{"description":"Invalid parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. Limits are per IP (60/min, burst 30), enforced by nginx.","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/coins/{slug}/history.csv":{"get":{"tags":["Coins"],"summary":"Coin history as CSV","description":"Same as the JSON history, one row per snapshot: `date` plus one column per metric.","operationId":"coin_history_csv","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,99}$","description":"CoinMarketCap slug","examples":["bitcoin"],"title":"Slug"},"description":"CoinMarketCap slug"},{"name":"metric","in":"query","required":false,"schema":{"type":"string","description":"Comma-separated: rank, price, market_cap, volume_24h","examples":["rank,price"],"default":"rank,price,market_cap","title":"Metric"},"description":"Comma-separated: rank, price, market_cap, volume_24h"},{"name":"range","in":"query","required":false,"schema":{"$ref":"#/components/schemas/Range","description":"Ignored when `from` is given","default":"max"},"description":"Ignored when `from` is given"},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"To"}}],"responses":{"200":{"description":"CSV with header row","content":{"text/csv":{}}},"304":{"description":"Not modified (send `If-None-Match` with the last `ETag`)."},"422":{"description":"Invalid parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. Limits are per IP (60/min, burst 30), enforced by nginx.","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/coins/{slug}/history":{"get":{"tags":["Coins"],"summary":"Coin history","description":"Time series per snapshot: weekly before 18 Dec 2021, daily after; long ranges may be downsampled (see `resolution_days`). `from`/`to` override `range`. Also as CSV at `/coins/{slug}/history.csv`.","operationId":"coin_history","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,99}$","description":"CoinMarketCap slug","examples":["bitcoin"],"title":"Slug"},"description":"CoinMarketCap slug"},{"name":"metric","in":"query","required":false,"schema":{"type":"string","description":"Comma-separated: rank, price, market_cap, volume_24h","examples":["rank,price"],"default":"rank,price","title":"Metric"},"description":"Comma-separated: rank, price, market_cap, volume_24h"},{"name":"range","in":"query","required":false,"schema":{"$ref":"#/components/schemas/Range","description":"Ignored when `from` is given","default":"max"},"description":"Ignored when `from` is given"},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"examples":["2020-01-01"],"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryResponse"},"example":{"as_of":"2026-10-06","source":"CoinMarketCap via CryptWatch","data":{"slug":"avalanche","metric":["rank","price"],"range":"max","resolution_days":7,"as_of":"2026-10-06","source":"CoinMarketCap via CryptWatch","points":[{"date":"2024-01-01","rank":11,"price":38.92},{"date":"2024-01-08","rank":10,"price":35.17}]}}}}},"304":{"description":"Not modified (send `If-None-Match` with the last `ETag`)."},"422":{"description":"Invalid parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. Limits are per IP (60/min, burst 30), enforced by nginx.","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/overview.csv":{"get":{"tags":["Tables"],"summary":"Overview as CSV","operationId":"overview_csv","parameters":[{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date"}},{"name":"range","in":"query","required":false,"schema":{"$ref":"#/components/schemas/Range","default":"1w"}},{"name":"top","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"Limit to coins ranked within the top N","default":100,"title":"Top"},"description":"Limit to coins ranked within the top N"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":1,"description":"1-based page","default":1,"title":"Page"},"description":"1-based page"},{"name":"per_page","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":10000,"minimum":1},{"type":"null"}],"description":"Rows per page (JSON max 1000)","title":"Per Page"},"description":"Rows per page (JSON max 1000)"}],"responses":{"200":{"description":"CSV with header row","content":{"text/csv":{}}},"304":{"description":"Not modified (send `If-None-Match` with the last `ETag`)."},"422":{"description":"Invalid parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. Limits are per IP (60/min, burst 30), enforced by nginx.","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/overview":{"get":{"tags":["Tables"],"summary":"Overview","description":"The comparison table: every coin within the top N on `date` (default: latest snapshot) with rank and price then (`range` earlier) and now, rank change (positive = climbed) and a price sparkline.","operationId":"overview","parameters":[{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Snapshot date, default latest","title":"Date"},"description":"Snapshot date, default latest"},{"name":"range","in":"query","required":false,"schema":{"$ref":"#/components/schemas/Range","description":"Compare with this long ago","default":"1w"},"description":"Compare with this long ago"},{"name":"top","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"Limit to coins ranked within the top N","default":100,"title":"Top"},"description":"Limit to coins ranked within the top N"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":1,"description":"1-based page","default":1,"title":"Page"},"description":"1-based page"},{"name":"per_page","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":10000,"minimum":1},{"type":"null"}],"description":"Rows per page (JSON max 1000)","title":"Per Page"},"description":"Rows per page (JSON max 1000)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableResponse"}}}},"304":{"description":"Not modified (send `If-None-Match` with the last `ETag`)."},"422":{"description":"Invalid parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. Limits are per IP (60/min, burst 30), enforced by nginx.","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/movers.csv":{"get":{"tags":["Tables"],"summary":"Movers as CSV","operationId":"movers_csv","parameters":[{"name":"preset","in":"query","required":false,"schema":{"$ref":"#/components/schemas/MoverPreset","default":"risers"}},{"name":"range","in":"query","required":false,"schema":{"$ref":"#/components/schemas/Range","default":"1m"}},{"name":"top","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"Limit to coins ranked within the top N","default":500,"title":"Top"},"description":"Limit to coins ranked within the top N"},{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":1,"description":"1-based page","default":1,"title":"Page"},"description":"1-based page"},{"name":"per_page","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":10000,"minimum":1},{"type":"null"}],"description":"Rows per page (JSON max 1000)","title":"Per Page"},"description":"Rows per page (JSON max 1000)"}],"responses":{"200":{"description":"CSV with header row","content":{"text/csv":{}}},"304":{"description":"Not modified (send `If-None-Match` with the last `ETag`)."},"422":{"description":"Invalid parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. Limits are per IP (60/min, burst 30), enforced by nginx.","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/movers":{"get":{"tags":["Tables"],"summary":"Movers","description":"Preset tables across the market. `risers`/`fallers`: biggest rank change among coins within the top N; `new`: listed within the range; `delisted`: disappeared within the range (missing from two snapshots); `comebacks`: listed again after a delisting; `renamed`: name or symbol changed (old name in `note`).","operationId":"movers","parameters":[{"name":"preset","in":"query","required":false,"schema":{"$ref":"#/components/schemas/MoverPreset","description":"Which table","default":"risers"},"description":"Which table"},{"name":"range","in":"query","required":false,"schema":{"$ref":"#/components/schemas/Range","default":"1m"}},{"name":"top","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"Limit to coins ranked within the top N","default":500,"title":"Top"},"description":"Limit to coins ranked within the top N"},{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Snapshot date, default latest","title":"Date"},"description":"Snapshot date, default latest"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":1,"description":"1-based page","default":1,"title":"Page"},"description":"1-based page"},{"name":"per_page","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":10000,"minimum":1},{"type":"null"}],"description":"Rows per page (JSON max 1000)","title":"Per Page"},"description":"Rows per page (JSON max 1000)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableResponse"}}}},"304":{"description":"Not modified (send `If-None-Match` with the last `ETag`)."},"422":{"description":"Invalid parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. Limits are per IP (60/min, burst 30), enforced by nginx.","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/snapshots":{"get":{"tags":["Snapshots"],"summary":"All snapshot dates","description":"Every stored snapshot with its coin count. Weekly (604800 s) until Dec 2021, daily since.","operationId":"snapshots","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SnapshotsResponse"}}}},"304":{"description":"Not modified (send `If-None-Match` with the last `ETag`)."},"422":{"description":"Invalid parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. Limits are per IP (60/min, burst 30), enforced by nginx.","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/snapshots/{date}.csv":{"get":{"tags":["Snapshots"],"summary":"Ranking of one snapshot as CSV","operationId":"snapshot_csv","parameters":[{"name":"date","in":"path","required":true,"schema":{"type":"string","format":"date","title":"Date"}},{"name":"top","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"Limit to coins ranked within the top N","default":100,"title":"Top"},"description":"Limit to coins ranked within the top N"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":1,"description":"1-based page","default":1,"title":"Page"},"description":"1-based page"},{"name":"per_page","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":10000,"minimum":1},{"type":"null"}],"description":"Rows per page (JSON max 1000)","title":"Per Page"},"description":"Rows per page (JSON max 1000)"}],"responses":{"200":{"description":"CSV with header row","content":{"text/csv":{}}},"304":{"description":"Not modified (send `If-None-Match` with the last `ETag`)."},"422":{"description":"Invalid parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. Limits are per IP (60/min, burst 30), enforced by nginx.","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/snapshots/{date}":{"get":{"tags":["Snapshots"],"summary":"Ranking of one snapshot","description":"The top N on that date (the closest earlier snapshot if none ran that day; see `data.date`).","operationId":"snapshot","parameters":[{"name":"date","in":"path","required":true,"schema":{"type":"string","format":"date","title":"Date"}},{"name":"top","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"Limit to coins ranked within the top N","default":100,"title":"Top"},"description":"Limit to coins ranked within the top N"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":1,"description":"1-based page","default":1,"title":"Page"},"description":"1-based page"},{"name":"per_page","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":10000,"minimum":1},{"type":"null"}],"description":"Rows per page (JSON max 1000)","title":"Per Page"},"description":"Rows per page (JSON max 1000)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableResponse"}}}},"304":{"description":"Not modified (send `If-None-Match` with the last `ETag`)."},"422":{"description":"Invalid parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. Limits are per IP (60/min, burst 30), enforced by nginx.","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/graveyard.csv":{"get":{"tags":["Graveyard"],"summary":"Graveyard as CSV","operationId":"graveyard_csv","parameters":[{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2100,"minimum":2013},{"type":"null"}],"description":"Delisted in this calendar year","title":"Year"},"description":"Delisted in this calendar year"},{"name":"range","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/Range"},{"type":"null"}],"title":"Range"}},{"name":"max_last_rank","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":100000,"minimum":1},{"type":"null"}],"description":"Last rank at or better than","title":"Max Last Rank"},"description":"Last rank at or better than"},{"name":"listed_year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2100,"minimum":2013},{"type":"null"}],"description":"First listed in this year","title":"Listed Year"},"description":"First listed in this year"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":1,"description":"1-based page","default":1,"title":"Page"},"description":"1-based page"},{"name":"per_page","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":10000,"minimum":1},{"type":"null"}],"description":"Rows per page (JSON max 1000)","title":"Per Page"},"description":"Rows per page (JSON max 1000)"}],"responses":{"200":{"description":"CSV with header row","content":{"text/csv":{}}},"304":{"description":"Not modified (send `If-None-Match` with the last `ETag`)."},"422":{"description":"Invalid parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. Limits are per IP (60/min, burst 30), enforced by nginx.","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/graveyard":{"get":{"tags":["Graveyard"],"summary":"Delisted coins","description":"Delisted coins (missing from two consecutive snapshots), newest first, with last and best rank, lifespan and last price, plus summary statistics for the filter.","operationId":"graveyard","parameters":[{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2100,"minimum":2013},{"type":"null"}],"description":"Delisted in this calendar year","title":"Year"},"description":"Delisted in this calendar year"},{"name":"range","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/Range"},{"type":"null"}],"description":"Delisted within this range","title":"Range"},"description":"Delisted within this range"},{"name":"max_last_rank","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":100000,"minimum":1},{"type":"null"}],"description":"Last rank at or better than","title":"Max Last Rank"},"description":"Last rank at or better than"},{"name":"listed_year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2100,"minimum":2013},{"type":"null"}],"description":"First listed in this year","title":"Listed Year"},"description":"First listed in this year"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":1,"description":"1-based page","default":1,"title":"Page"},"description":"1-based page"},{"name":"per_page","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":10000,"minimum":1},{"type":"null"}],"description":"Rows per page (JSON max 1000)","title":"Per Page"},"description":"Rows per page (JSON max 1000)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraveyardResponse"}}}},"304":{"description":"Not modified (send `If-None-Match` with the last `ETag`)."},"422":{"description":"Invalid parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. Limits are per IP (60/min, burst 30), enforced by nginx.","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/year-end/{year}.csv":{"get":{"tags":["Year-end prices"],"summary":"Year-end prices as CSV","operationId":"year_end_csv","parameters":[{"name":"year","in":"path","required":true,"schema":{"type":"integer","title":"Year"}},{"name":"currency","in":"query","required":false,"schema":{"$ref":"#/components/schemas/Currency","default":"usd"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":100,"default":"","title":"Q"}},{"name":"top","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":100000,"minimum":1},{"type":"null"}],"title":"Top"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":1,"description":"1-based page","default":1,"title":"Page"},"description":"1-based page"},{"name":"per_page","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":10000,"minimum":1},{"type":"null"}],"description":"Rows per page (JSON max 1000)","title":"Per Page"},"description":"Rows per page (JSON max 1000)"}],"responses":{"200":{"description":"CSV with header row","content":{"text/csv":{}}},"304":{"description":"Not modified (send `If-None-Match` with the last `ETag`)."},"422":{"description":"Invalid parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. Limits are per IP (60/min, burst 30), enforced by nginx.","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/year-end/{year}":{"get":{"tags":["Year-end prices"],"summary":"Year-end prices","description":"Close on 31 December (or the closest earlier snapshot, see `date_used`) for every coin, in USD and CHF. CHF uses the ESTV year-end FX rate. `source` says whether the value is the official ESTV value, our own snapshot close, or the last known price of a coin delisted before the date. Not tax advice.","operationId":"year_end","parameters":[{"name":"year","in":"path","required":true,"schema":{"type":"integer","title":"Year"}},{"name":"currency","in":"query","required":false,"schema":{"$ref":"#/components/schemas/Currency","description":"Sort/display currency; both prices are always included","default":"usd"},"description":"Sort/display currency; both prices are always included"},{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":100,"description":"Filter by name or symbol","default":"","title":"Q"},"description":"Filter by name or symbol"},{"name":"top","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":100000,"minimum":1},{"type":"null"}],"description":"Only coins ranked within the top N","default":500,"title":"Top"},"description":"Only coins ranked within the top N"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":1,"description":"1-based page","default":1,"title":"Page"},"description":"1-based page"},{"name":"per_page","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":10000,"minimum":1},{"type":"null"}],"description":"Rows per page (JSON max 1000)","title":"Per Page"},"description":"Rows per page (JSON max 1000)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YearEndResponse"}}}},"304":{"description":"Not modified (send `If-None-Match` with the last `ETag`)."},"422":{"description":"Invalid parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. Limits are per IP (60/min, burst 30), enforced by nginx.","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/health":{"get":{"tags":["Meta"],"summary":"Status and last import","description":"Liveness plus the date of the latest snapshot and when the last import finished. Not cached.","operationId":"health","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health"}}}},"304":{"description":"Not modified (send `If-None-Match` with the last `ETag`)."},"422":{"description":"Invalid parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. Limits are per IP (60/min, burst 30), enforced by nginx.","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/meta":{"get":{"tags":["Meta"],"summary":"Dataset facts","description":"First and latest snapshot, number of snapshots, coins listed now, ever listed and delisted.","operationId":"meta","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaResponse"}}}},"304":{"description":"Not modified (send `If-None-Match` with the last `ETag`)."},"422":{"description":"Invalid parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. Limits are per IP (60/min, burst 30), enforced by nginx.","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/icons/{slug}":{"get":{"tags":["Icons"],"summary":"Icon URLs for a coin","description":"Available sizes (32, 64, 128 px) and formats (WebP, PNG) with absolute URLs.","operationId":"icon_info","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,99}$","examples":["bitcoin"],"title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IconResponse"}}}},"304":{"description":"Not modified (send `If-None-Match` with the last `ETag`)."},"422":{"description":"Invalid parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. Limits are per IP (60/min, burst 30), enforced by nginx.","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/embed/og/default.png":{"get":{"tags":["Embeds"],"summary":"Site Open Graph image","description":"1200x630 PNG with wordmark, tagline and dataset counts.","operationId":"og_default","parameters":[{"name":"lang","in":"query","required":false,"schema":{"enum":["en","de"],"type":"string","default":"en","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"image/png":{}}},"304":{"description":"Not modified (send `If-None-Match` with the last `ETag`)."},"422":{"description":"Invalid parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. Limits are per IP (60/min, burst 30), enforced by nginx.","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/embed/{slug}/og.png":{"get":{"tags":["Embeds"],"summary":"Coin Open Graph image","description":"1200x630 PNG: name, rank today, best rank, days in top 20 and the rank chart since listing.","operationId":"og_coin","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,99}$","examples":["bitcoin"],"title":"Slug"}},{"name":"theme","in":"query","required":false,"schema":{"enum":["light","dark"],"type":"string","default":"light","title":"Theme"}},{"name":"lang","in":"query","required":false,"schema":{"enum":["en","de"],"type":"string","default":"en","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"image/png":{}}},"304":{"description":"Not modified (send `If-None-Match` with the last `ETag`)."},"422":{"description":"Invalid parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. Limits are per IP (60/min, burst 30), enforced by nginx.","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/embed/{slug}/card":{"get":{"tags":["Embeds"],"summary":"Embeddable card (iframe)","description":"Self-contained HTML (inline CSS, no script, no third-party requests) with mini rank chart, rank and key figures, linking back to the coin page. Use: `<iframe src=\"https://cryptwat.ch/embed/bitcoin/card\" width=\"100%\" height=\"200\" style=\"border:0\" loading=\"lazy\" title=\"Bitcoin on CryptWatch\"></iframe>`.","operationId":"card","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,99}$","examples":["bitcoin"],"title":"Slug"}},{"name":"theme","in":"query","required":false,"schema":{"enum":["light","dark"],"type":"string","default":"light","title":"Theme"}},{"name":"range","in":"query","required":false,"schema":{"$ref":"#/components/schemas/Range","default":"max"}},{"name":"lang","in":"query","required":false,"schema":{"enum":["en","de"],"type":"string","default":"en","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{}}},"304":{"description":"Not modified (send `If-None-Match` with the last `ETag`)."},"422":{"description":"Invalid parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. Limits are per IP (60/min, burst 30), enforced by nginx.","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/embed/{slug}/{metric}.{ext}":{"get":{"tags":["Embeds"],"summary":"Chart as SVG or PNG","description":"Rank (inverted log axis with the top-20 band), price or market cap, with title, data date and source in the image. `width` sets the PNG size (default 760, max 2400); the SVG is 760x240 and scales. Example: `<img src=\"https://cryptwat.ch/embed/bitcoin/rank.svg?range=max\" width=\"760\" height=\"240\" alt=\"Bitcoin rank history, CryptWatch\">`.","operationId":"chart","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,99}$","examples":["bitcoin"],"title":"Slug"}},{"name":"metric","in":"path","required":true,"schema":{"enum":["rank","price","market_cap"],"type":"string","description":"rank, price or market_cap","title":"Metric"},"description":"rank, price or market_cap"},{"name":"ext","in":"path","required":true,"schema":{"enum":["svg","png"],"type":"string","description":"svg or png","title":"Ext"},"description":"svg or png"},{"name":"range","in":"query","required":false,"schema":{"$ref":"#/components/schemas/Range","default":"max"}},{"name":"theme","in":"query","required":false,"schema":{"enum":["light","dark"],"type":"string","default":"light","title":"Theme"}},{"name":"width","in":"query","required":false,"schema":{"type":"integer","maximum":2400,"minimum":200,"description":"PNG width in px","default":760,"title":"Width"},"description":"PNG width in px"},{"name":"log","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Log scale for price/market cap; default: auto","title":"Log"},"description":"Log scale for price/market cap; default: auto"},{"name":"lang","in":"query","required":false,"schema":{"enum":["en","de"],"type":"string","default":"en","title":"Lang"}}],"responses":{"200":{"description":"Chart image","content":{"image/svg+xml":{},"image/png":{}}},"304":{"description":"Not modified (send `If-None-Match` with the last `ETag`)."},"422":{"description":"Invalid parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. Limits are per IP (60/min, burst 30), enforced by nginx.","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/icons/all-webp.zip":{"get":{"tags":["Icons"],"summary":"All icons as ZIP","description":"Every icon in 32, 64 and 128 px as WebP, plus index.json. About 135 MB. Rebuilt after imports.","operationId":"all_webp_zip","responses":{"200":{"description":"Successful Response","content":{"application/zip":{}}},"304":{"description":"Not modified (send `If-None-Match` with the last `ETag`)."},"422":{"description":"Invalid parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. Limits are per IP (60/min, burst 30), enforced by nginx.","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/icons/all.zip":{"get":{"tags":["Icons"],"summary":"All icons as ZIP","description":"Every icon in 32, 64 and 128 px as WebP and PNG, plus index.json. Rebuilt after imports.","operationId":"all_zip","responses":{"200":{"description":"Successful Response","content":{"application/zip":{}}},"304":{"description":"Not modified (send `If-None-Match` with the last `ETag`)."},"422":{"description":"Invalid parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. Limits are per IP (60/min, burst 30), enforced by nginx.","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/icons/index.json":{"get":{"tags":["Icons"],"summary":"Icon index","description":"Slug, name, symbol and available files for every icon.","operationId":"index_json","responses":{"200":{"description":"Successful Response","content":{"application/json":{}}},"304":{"description":"Not modified (send `If-None-Match` with the last `ETag`)."},"422":{"description":"Invalid parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. Limits are per IP (60/min, burst 30), enforced by nginx.","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/icons/{size}/{slug}.{ext}":{"get":{"tags":["Icons"],"summary":"Icon file","description":"Coin icon in 32, 64 or 128 px as WebP or PNG, cached for a year (immutable). If no icon exists, an SVG placeholder with the coin's initials is returned instead (status 200, `X-Icon-Placeholder: 1`).","operationId":"icon_file","parameters":[{"name":"size","in":"path","required":true,"schema":{"type":"integer","description":"32, 64 or 128","examples":[64],"title":"Size"},"description":"32, 64 or 128"},{"name":"slug","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9._-]{0,119}$","examples":["bitcoin"],"title":"Slug"}},{"name":"ext","in":"path","required":true,"schema":{"enum":["webp","png"],"type":"string","title":"Ext"}}],"responses":{"200":{"description":"Successful Response","content":{"image/webp":{},"image/png":{},"image/svg+xml":{}}},"304":{"description":"Not modified (send `If-None-Match` with the last `ETag`)."},"422":{"description":"Invalid parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. Limits are per IP (60/min, burst 30), enforced by nginx.","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}},"components":{"schemas":{"Coin":{"properties":{"id":{"type":"integer","title":"Id"},"slug":{"type":"string","title":"Slug"},"symbol":{"type":"string","title":"Symbol"},"name":{"type":"string","title":"Name"},"status":{"$ref":"#/components/schemas/CoinStatus"},"date_added":{"type":"string","format":"date","title":"Date Added"},"first_seen":{"type":"string","format":"date","title":"First Seen"},"last_seen":{"type":"string","format":"date","title":"Last Seen"},"delisted_at":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Delisted At"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"platform_symbol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform Symbol"},"aliases":{"items":{"$ref":"#/components/schemas/CoinAlias"},"type":"array","title":"Aliases"}},"type":"object","required":["id","slug","symbol","name","status","date_added","first_seen","last_seen"],"title":"Coin"},"CoinAlias":{"properties":{"name":{"type":"string","title":"Name"},"symbol":{"type":"string","title":"Symbol"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"valid_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Valid From"},"valid_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Valid To"}},"type":"object","required":["name","symbol"],"title":"CoinAlias"},"CoinDetail":{"properties":{"coin":{"$ref":"#/components/schemas/Coin"},"stats":{"anyOf":[{"$ref":"#/components/schemas/CoinStats"},{"type":"null"}]},"timeline":{"items":{"$ref":"#/components/schemas/TimelineEvent"},"type":"array","title":"Timeline"},"year_end":{"items":{"$ref":"#/components/schemas/YearEndPrice"},"type":"array","title":"Year End","description":"Close on 31 December per year, newest first"},"links":{"$ref":"#/components/schemas/CoinLinks"}},"type":"object","required":["coin","stats","timeline","year_end","links"],"title":"CoinDetail"},"CoinHistory":{"properties":{"slug":{"type":"string","title":"Slug"},"metric":{"items":{"$ref":"#/components/schemas/Metric"},"type":"array","title":"Metric"},"range":{"$ref":"#/components/schemas/Range"},"resolution_days":{"type":"integer","title":"Resolution Days"},"points":{"items":{"$ref":"#/components/schemas/Tick"},"type":"array","title":"Points"},"as_of":{"type":"string","format":"date","title":"As Of"},"source":{"type":"string","title":"Source","default":"CoinMarketCap via CryptWatch"}},"type":"object","required":["slug","metric","range","resolution_days","points","as_of"],"title":"CoinHistory"},"CoinLinks":{"properties":{"page":{"type":"string","title":"Page","examples":["https://cryptwat.ch/coin/bitcoin"]},"history_json":{"type":"string","title":"History Json"},"history_csv":{"type":"string","title":"History Csv"},"chart_svg":{"type":"string","title":"Chart Svg"},"chart_png":{"type":"string","title":"Chart Png"},"card":{"type":"string","title":"Card"},"icon":{"type":"string","title":"Icon"}},"type":"object","required":["page","history_json","history_csv","chart_svg","chart_png","card","icon"],"title":"CoinLinks"},"CoinResponse":{"properties":{"as_of":{"type":"string","format":"date","title":"As Of","description":"Date of the latest snapshot the data is based on","examples":["2026-10-06"]},"source":{"type":"string","title":"Source","default":"CoinMarketCap via CryptWatch","examples":["CoinMarketCap via CryptWatch"]},"data":{"$ref":"#/components/schemas/CoinDetail"},"page":{"anyOf":[{"$ref":"#/components/schemas/Page"},{"type":"null"}],"description":"Only on paged endpoints"}},"type":"object","required":["as_of","data"],"title":"CoinResponse"},"CoinRow":{"properties":{"slug":{"type":"string","title":"Slug"},"symbol":{"type":"string","title":"Symbol"},"name":{"type":"string","title":"Name"},"status":{"$ref":"#/components/schemas/CoinStatus"},"rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank"},"rank_then":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank Then"},"rank_change":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank Change"},"price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price"},"price_then":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Then"},"pct_change":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pct Change"},"market_cap":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Market Cap"},"market_cap_then":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Market Cap Then"},"date_added":{"type":"string","format":"date","title":"Date Added"},"delisted_at":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Delisted At"},"sparkline":{"items":{"type":"number"},"type":"array","title":"Sparkline"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["slug","symbol","name","status","rank","rank_then","rank_change","price","price_then","pct_change","market_cap","market_cap_then","date_added"],"title":"CoinRow","description":"One row of Overview / Movers tables: now vs. then."},"CoinSearchHit":{"properties":{"slug":{"type":"string","title":"Slug"},"symbol":{"type":"string","title":"Symbol"},"name":{"type":"string","title":"Name"},"status":{"$ref":"#/components/schemas/CoinStatus"},"rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank"},"matched_alias":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Matched Alias"}},"type":"object","required":["slug","symbol","name","status"],"title":"CoinSearchHit"},"CoinStats":{"properties":{"slug":{"type":"string","title":"Slug"},"current_rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current Rank"},"price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price"},"market_cap":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Market Cap"},"volume_24h":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Volume 24H"},"best_rank":{"type":"integer","title":"Best Rank"},"best_rank_date":{"type":"string","format":"date","title":"Best Rank Date"},"worst_rank":{"type":"integer","title":"Worst Rank"},"worst_rank_date":{"type":"string","format":"date","title":"Worst Rank Date"},"days_listed":{"type":"integer","title":"Days Listed"},"days_top20":{"type":"integer","title":"Days Top20"},"days_top100":{"type":"integer","title":"Days Top100"},"first_seen":{"type":"string","format":"date","title":"First Seen"},"last_seen":{"type":"string","format":"date","title":"Last Seen"},"delisted_at":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Delisted At"},"comebacks":{"type":"integer","title":"Comebacks","default":0}},"type":"object","required":["slug","current_rank","price","market_cap","volume_24h","best_rank","best_rank_date","worst_rank","worst_rank_date","days_listed","days_top20","days_top100","first_seen","last_seen"],"title":"CoinStats"},"CoinStatus":{"type":"string","enum":["active","delisted"],"title":"CoinStatus"},"Currency":{"type":"string","enum":["usd","chf"],"title":"Currency"},"ErrorBody":{"properties":{"status":{"type":"integer","title":"Status","examples":[404]},"code":{"type":"string","title":"Code","examples":["not_found"]},"message":{"type":"string","title":"Message","examples":["No coin with slug 'foo'."]},"details":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Details"}},"type":"object","required":["status","code","message"],"title":"ErrorBody"},"ErrorResponse":{"properties":{"error":{"$ref":"#/components/schemas/ErrorBody"}},"type":"object","required":["error"],"title":"ErrorResponse"},"EventKind":{"type":"string","enum":["listed","renamed","symbol_changed","tags_changed","platform_changed","best_rank","top20_first","top100_first","delisted","relisted"],"title":"EventKind"},"FxRate":{"properties":{"year":{"type":"integer","title":"Year"},"usd_chf":{"type":"number","title":"Usd Chf"},"source":{"type":"string","title":"Source"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"}},"type":"object","required":["year","usd_chf","source"],"title":"FxRate"},"Graveyard":{"properties":{"stats":{"$ref":"#/components/schemas/GraveyardStats"},"rows":{"items":{"$ref":"#/components/schemas/GraveyardEntry"},"type":"array","title":"Rows"}},"type":"object","required":["stats","rows"],"title":"Graveyard"},"GraveyardEntry":{"properties":{"slug":{"type":"string","title":"Slug"},"symbol":{"type":"string","title":"Symbol"},"name":{"type":"string","title":"Name"},"first_seen":{"type":"string","format":"date","title":"First Seen"},"last_seen":{"type":"string","format":"date","title":"Last Seen"},"delisted_at":{"type":"string","format":"date","title":"Delisted At"},"last_rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Rank"},"best_rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Best Rank"},"days_listed":{"type":"integer","title":"Days Listed"},"last_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Last Price"},"comebacks":{"type":"integer","title":"Comebacks","default":0},"sparkline":{"items":{"type":"number"},"type":"array","title":"Sparkline"}},"type":"object","required":["slug","symbol","name","first_seen","last_seen","delisted_at","last_rank","best_rank","days_listed","last_price"],"title":"GraveyardEntry"},"GraveyardResponse":{"properties":{"as_of":{"type":"string","format":"date","title":"As Of","description":"Date of the latest snapshot the data is based on","examples":["2026-10-06"]},"source":{"type":"string","title":"Source","default":"CoinMarketCap via CryptWatch","examples":["CoinMarketCap via CryptWatch"]},"data":{"$ref":"#/components/schemas/Graveyard"},"page":{"anyOf":[{"$ref":"#/components/schemas/Page"},{"type":"null"}],"description":"Only on paged endpoints"}},"type":"object","required":["as_of","data"],"title":"GraveyardResponse"},"GraveyardStats":{"properties":{"delisted_in_range":{"type":"integer","title":"Delisted In Range"},"ever_listed":{"type":"integer","title":"Ever Listed"},"median_lifespan_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Median Lifespan Days"},"once_top100":{"type":"integer","title":"Once Top100"},"best_rank_ever":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Best Rank Ever"},"survival_5y_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Survival 5Y Pct"}},"type":"object","required":["delisted_in_range","ever_listed","median_lifespan_days","once_top100","best_rank_ever","survival_5y_pct"],"title":"GraveyardStats"},"HistoryResponse":{"properties":{"as_of":{"type":"string","format":"date","title":"As Of","description":"Date of the latest snapshot the data is based on","examples":["2026-10-06"]},"source":{"type":"string","title":"Source","default":"CoinMarketCap via CryptWatch","examples":["CoinMarketCap via CryptWatch"]},"data":{"$ref":"#/components/schemas/CoinHistory"},"page":{"anyOf":[{"$ref":"#/components/schemas/Page"},{"type":"null"}],"description":"Only on paged endpoints"}},"type":"object","required":["as_of","data"],"title":"HistoryResponse"},"IconInfo":{"properties":{"slug":{"type":"string","title":"Slug"},"sizes":{"items":{"type":"integer"},"type":"array","title":"Sizes"},"formats":{"items":{"type":"string"},"type":"array","title":"Formats"},"urls":{"additionalProperties":{"type":"string"},"type":"object","title":"Urls"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["slug","sizes","formats","urls"],"title":"IconInfo"},"IconResponse":{"properties":{"as_of":{"type":"string","format":"date","title":"As Of","description":"Date of the latest snapshot the data is based on","examples":["2026-10-06"]},"source":{"type":"string","title":"Source","default":"CoinMarketCap via CryptWatch","examples":["CoinMarketCap via CryptWatch"]},"data":{"$ref":"#/components/schemas/IconInfo"},"page":{"anyOf":[{"$ref":"#/components/schemas/Page"},{"type":"null"}],"description":"Only on paged endpoints"}},"type":"object","required":["as_of","data"],"title":"IconResponse"},"Meta":{"properties":{"latest_snapshot":{"type":"string","format":"date","title":"Latest Snapshot"},"first_snapshot":{"type":"string","format":"date","title":"First Snapshot"},"snapshot_count":{"type":"integer","title":"Snapshot Count"},"coin_count":{"type":"integer","title":"Coin Count"},"ever_listed":{"type":"integer","title":"Ever Listed"},"delisted_count":{"type":"integer","title":"Delisted Count"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"source":{"type":"string","title":"Source","default":"CoinMarketCap"}},"type":"object","required":["latest_snapshot","first_snapshot","snapshot_count","coin_count","ever_listed","delisted_count","updated_at"],"title":"Meta","description":"Site-wide facts shown in headers/footers and used for ETag/Last-Modified."},"MetaResponse":{"properties":{"as_of":{"type":"string","format":"date","title":"As Of","description":"Date of the latest snapshot the data is based on","examples":["2026-10-06"]},"source":{"type":"string","title":"Source","default":"CoinMarketCap via CryptWatch","examples":["CoinMarketCap via CryptWatch"]},"data":{"$ref":"#/components/schemas/Meta"},"page":{"anyOf":[{"$ref":"#/components/schemas/Page"},{"type":"null"}],"description":"Only on paged endpoints"}},"type":"object","required":["as_of","data"],"title":"MetaResponse"},"Metric":{"type":"string","enum":["rank","price","market_cap","volume_24h"],"title":"Metric"},"MoverPreset":{"type":"string","enum":["risers","fallers","new","delisted","comebacks","renamed"],"title":"MoverPreset"},"Page":{"properties":{"page":{"type":"integer","title":"Page","description":"1-based page number","examples":[1]},"per_page":{"type":"integer","title":"Per Page","examples":[100]},"total":{"type":"integer","title":"Total","description":"Rows across all pages","examples":[500]},"pages":{"type":"integer","title":"Pages","examples":[5]},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next","description":"Relative URL of the next page, if any"},"prev":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prev","description":"Relative URL of the previous page, if any"}},"type":"object","required":["page","per_page","total","pages"],"title":"Page"},"PriceSource":{"type":"string","enum":["estv","cryptwatch","last_known"],"title":"PriceSource"},"Range":{"type":"string","enum":["1w","1m","3m","6m","1y","2y","3y","5y","max"],"title":"Range","description":"Comparison / chart ranges. Keys are used in URLs (?range=1m)."},"SearchResponse":{"properties":{"as_of":{"type":"string","format":"date","title":"As Of","description":"Date of the latest snapshot the data is based on","examples":["2026-10-06"]},"source":{"type":"string","title":"Source","default":"CoinMarketCap via CryptWatch","examples":["CoinMarketCap via CryptWatch"]},"data":{"items":{"$ref":"#/components/schemas/CoinSearchHit"},"type":"array","title":"Data"},"page":{"anyOf":[{"$ref":"#/components/schemas/Page"},{"type":"null"}],"description":"Only on paged endpoints"}},"type":"object","required":["as_of","data"],"title":"SearchResponse"},"Snapshot":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"coin_count":{"type":"integer","title":"Coin Count"},"period_seconds":{"type":"integer","title":"Period Seconds"}},"type":"object","required":["date","coin_count","period_seconds"],"title":"Snapshot"},"SnapshotsResponse":{"properties":{"as_of":{"type":"string","format":"date","title":"As Of","description":"Date of the latest snapshot the data is based on","examples":["2026-10-06"]},"source":{"type":"string","title":"Source","default":"CoinMarketCap via CryptWatch","examples":["CoinMarketCap via CryptWatch"]},"data":{"items":{"$ref":"#/components/schemas/Snapshot"},"type":"array","title":"Data"},"page":{"anyOf":[{"$ref":"#/components/schemas/Page"},{"type":"null"}],"description":"Only on paged endpoints"}},"type":"object","required":["as_of","data"],"title":"SnapshotsResponse"},"Table":{"properties":{"date":{"type":"string","format":"date","title":"Date","description":"The 'now' snapshot"},"date_then":{"type":"string","format":"date","title":"Date Then","description":"The comparison snapshot actually used"},"range":{"$ref":"#/components/schemas/Range"},"top":{"type":"integer","title":"Top"},"rows":{"items":{"$ref":"#/components/schemas/CoinRow"},"type":"array","title":"Rows"}},"type":"object","required":["date","date_then","range","top","rows"],"title":"Table","description":"Overview / movers / snapshot ranking: rows of now-vs-then."},"TableResponse":{"properties":{"as_of":{"type":"string","format":"date","title":"As Of","description":"Date of the latest snapshot the data is based on","examples":["2026-10-06"]},"source":{"type":"string","title":"Source","default":"CoinMarketCap via CryptWatch","examples":["CoinMarketCap via CryptWatch"]},"data":{"$ref":"#/components/schemas/Table"},"page":{"anyOf":[{"$ref":"#/components/schemas/Page"},{"type":"null"}],"description":"Only on paged endpoints"}},"type":"object","required":["as_of","data"],"title":"TableResponse"},"Tick":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank"},"price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price"},"market_cap":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Market Cap"},"volume_24h":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Volume 24H"}},"type":"object","required":["date"],"title":"Tick"},"TimelineEvent":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"kind":{"$ref":"#/components/schemas/EventKind"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail"},"rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank"}},"type":"object","required":["date","kind"],"title":"TimelineEvent"},"YearEnd":{"properties":{"year":{"type":"integer","title":"Year"},"date_used":{"type":"string","format":"date","title":"Date Used"},"currency":{"type":"string","title":"Currency","examples":["usd"]},"fx":{"anyOf":[{"$ref":"#/components/schemas/FxRate"},{"type":"null"}]},"rows":{"items":{"$ref":"#/components/schemas/YearEndPrice"},"type":"array","title":"Rows"}},"type":"object","required":["year","date_used","currency","fx","rows"],"title":"YearEnd"},"YearEndPrice":{"properties":{"slug":{"type":"string","title":"Slug"},"symbol":{"type":"string","title":"Symbol"},"name":{"type":"string","title":"Name"},"year":{"type":"integer","title":"Year"},"date_used":{"type":"string","format":"date","title":"Date Used"},"snapshot_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Snapshot Time"},"rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank"},"price_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Usd"},"price_chf":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Chf"},"source":{"$ref":"#/components/schemas/PriceSource"},"delisted_at":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Delisted At"}},"type":"object","required":["slug","symbol","name","year","date_used","rank","price_usd","price_chf","source"],"title":"YearEndPrice"},"YearEndResponse":{"properties":{"as_of":{"type":"string","format":"date","title":"As Of","description":"Date of the latest snapshot the data is based on","examples":["2026-10-06"]},"source":{"type":"string","title":"Source","default":"CoinMarketCap via CryptWatch","examples":["CoinMarketCap via CryptWatch"]},"data":{"$ref":"#/components/schemas/YearEnd"},"page":{"anyOf":[{"$ref":"#/components/schemas/Page"},{"type":"null"}],"description":"Only on paged endpoints"}},"type":"object","required":["as_of","data"],"title":"YearEndResponse"}}},"tags":[{"name":"Coins","description":"Search, coin detail with key figures and timeline, time series."},{"name":"Tables","description":"The overview table and market-wide movers (risers, fallers, new, delisted…)."},{"name":"Snapshots","description":"Every stored snapshot date and the ranking on one date."},{"name":"Graveyard","description":"Delisted coins: missing from two consecutive snapshots."},{"name":"Year-end prices","description":"Close on 31 December in USD and CHF (ESTV FX rate). Not tax advice."},{"name":"Icons","description":"Coin icons in 32, 64 and 128 px as WebP and PNG."},{"name":"Embeds","description":"Charts as SVG/PNG, Open Graph images and an iframe card. Not under /api."},{"name":"Meta","description":"Health and dataset facts."}]}