{"openapi":"3.1.0","jsonSchemaDialect":"https://json-schema.org/draft/2020-12/schema","info":{"title":"Kevin Canlas public data previews","version":"1.0.0","description":"Machine-readable contract for two public, read-only JSON previews on Kevin Canlas's portfolio. No authentication is required. Responses can be temporarily unavailable when their documented external data sources are unavailable. Version policy: v1 field names, types, units, and meaning are stable; the unversioned paths are stable v1 aliases and do not silently change version; incompatible future versions use a new major path. No deprecation or sunset is active."},"servers":[{"url":"https://www.kevincanlas.com"}],"security":[],"tags":[{"name":"public-previews","description":"Read-only data used by public portfolio previews."}],"paths":{"/api/mon-price":{"get":{"tags":["public-previews"],"summary":"Read the MON-USD market preview","description":"Returns the latest MON-USD ticker together with the seven-day series used by the portfolio's Monad price preview.\n\nThe product, currency, and window are fixed: Coinbase Exchange product MON-USD, USD, and 604800 seconds. This operation accepts no parameters, requires no authentication, and does not provide trading recommendations or financial advice.\n\nData source: Coinbase Exchange REST API, including the public MON-USD ticker and hourly candle endpoints (https://api.exchange.coinbase.com/products/MON-USD/ticker and https://api.exchange.coinbase.com/products/MON-USD/candles).\n\nCaching: the HTTP response is private and no-store. The server may reuse fetched candle history in memory for up to five minutes, while the ticker is fetched without a framework or upstream cache.\n\nThe unversioned path is a stable alias of /api/v1/mon-price and follows the v1 field names, types, units, and meaning.","operationId":"getMonPrice","parameters":[],"security":[],"responses":{"200":{"description":"Current MON-USD market preview data.","headers":{"Cache-Control":{"description":"This response is not stored by browsers or shared caches.","schema":{"type":"string","const":"private, no-store"},"example":"private, no-store"},"RateLimit":{"description":"Current service limit as a Structured Field List of Service Limit Items defined by draft-ietf-httpapi-ratelimit-headers-11. This header is emitted only when shared quota enforcement succeeds; it is absent when enforcement is inactive or unavailable.","schema":{"type":"string","description":"For example, \"public-api\";r=0;t=60, with configured values varying by deployment.","examples":["\"public-api\";r=0;t=60"]},"example":"\"public-api\";r=0;t=60"},"RateLimit-Policy":{"description":"Quota policy as a Structured Field List of Quota Policy Items defined by draft-ietf-httpapi-ratelimit-headers-11. This header is emitted only when shared quota enforcement succeeds; it is absent when enforcement is inactive or unavailable.","schema":{"type":"string","description":"For example, \"public-api\";q=60;w=60, with configured values varying by deployment.","examples":["\"public-api\";q=60;w=60"]},"example":"\"public-api\";q=60;w=60"}},"content":{"application/json":{"schema":{"type":"object","title":"MON market data","description":"The fixed MON-USD, USD-denominated market preview returned from Coinbase data.","required":["product","currency","source","windowSeconds","points","value","changePercent","low","high","asOf"],"additionalProperties":false,"properties":{"product":{"type":"string","const":"MON-USD","description":"Fixed Coinbase Exchange product identifier."},"currency":{"type":"string","const":"USD","description":"Fixed quote currency."},"source":{"type":"string","const":"Coinbase","description":"Fixed public data source."},"windowSeconds":{"type":"integer","const":604800,"description":"Fixed seven-day window length in seconds."},"points":{"type":"array","minItems":2,"description":"Chronologically ordered hourly candle closes for the window, followed by the current ticker point when it is newer.","items":{"$ref":"#/components/schemas/MarketPoint"}},"value":{"type":"number","description":"Latest MON value in USD.","examples":[0.04567]},"changePercent":{"type":"number","description":"Percentage change from the first historical point in the seven-day window.","examples":[10.85]},"low":{"type":"number","description":"Lowest observed value across the returned window and current ticker.","examples":[0.0381]},"high":{"type":"number","description":"Highest observed value across the returned window and current ticker.","examples":[0.0462]},"asOf":{"type":"string","format":"date-time","description":"ISO 8601 timestamp supplied by Coinbase for the latest ticker value.","examples":["2026-09-07T17:00:00.000Z"]}}},"examples":{"marketData":{"summary":"Illustrative MON-USD response","description":"Illustrative values showing the complete response shape; market values and timestamps change over time.","value":{"product":"MON-USD","currency":"USD","source":"Coinbase","windowSeconds":604800,"points":[{"time":1788685200,"value":0.0412},{"time":1788768000,"value":0.04438},{"time":1788771600,"value":0.04567}],"value":0.04567,"changePercent":10.85,"low":0.0381,"high":0.0462,"asOf":"2026-09-07T17:00:00.000Z"}}}}}},"405":{"description":"The API route exists, but the requested HTTP method is not supported.","headers":{"Allow":{"description":"Methods supported by this route.","schema":{"type":"string","examples":["GET, HEAD"]},"example":"GET, HEAD"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"},"examples":{"methodNotAllowed":{"summary":"Unsupported method","value":{"type":"https://www.kevincanlas.com/developers#method-not-allowed","title":"Method not allowed","status":405,"detail":"This public API route supports GET and HEAD requests.","code":"method_not_allowed","resolution":"Use GET to read this resource."}}}}}},"429":{"description":"The request exceeded the shared quota while distributed enforcement was active. Rate-limit headers are omitted when shared enforcement is inactive or unavailable.","headers":{"Retry-After":{"description":"Retry delay in seconds. This header is emitted only when shared quota enforcement succeeds and rejects the request.","schema":{"type":"integer","minimum":0,"description":"Number of seconds the client should wait before retrying.","examples":[60]},"example":60},"RateLimit":{"description":"Current service limit as a Structured Field List of Service Limit Items defined by draft-ietf-httpapi-ratelimit-headers-11. This header is emitted only when shared quota enforcement succeeds; it is absent when enforcement is inactive or unavailable.","schema":{"type":"string","description":"For example, \"public-api\";r=0;t=60, with configured values varying by deployment.","examples":["\"public-api\";r=0;t=60"]},"example":"\"public-api\";r=0;t=60"},"RateLimit-Policy":{"description":"Quota policy as a Structured Field List of Quota Policy Items defined by draft-ietf-httpapi-ratelimit-headers-11. This header is emitted only when shared quota enforcement succeeds; it is absent when enforcement is inactive or unavailable.","schema":{"type":"string","description":"For example, \"public-api\";q=60;w=60, with configured values varying by deployment.","examples":["\"public-api\";q=60;w=60"]},"example":"\"public-api\";q=60;w=60"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"},"examples":{"rateLimitExceeded":{"summary":"Shared quota exceeded","value":{"type":"https://www.kevincanlas.com/developers#rate-limit-exceeded","title":"Rate limit exceeded","status":429,"detail":"The shared request quota is temporarily exhausted.","code":"rate_limit_exceeded","resolution":"Wait for the Retry-After interval before retrying this resource."}}}}}},"502":{"description":"The external data source did not provide a usable response.","headers":{"RateLimit":{"description":"Current service limit as a Structured Field List of Service Limit Items defined by draft-ietf-httpapi-ratelimit-headers-11. This header is emitted only when shared quota enforcement succeeds; it is absent when enforcement is inactive or unavailable.","schema":{"type":"string","description":"For example, \"public-api\";r=0;t=60, with configured values varying by deployment.","examples":["\"public-api\";r=0;t=60"]},"example":"\"public-api\";r=0;t=60"},"RateLimit-Policy":{"description":"Quota policy as a Structured Field List of Quota Policy Items defined by draft-ietf-httpapi-ratelimit-headers-11. This header is emitted only when shared quota enforcement succeeds; it is absent when enforcement is inactive or unavailable.","schema":{"type":"string","description":"For example, \"public-api\";q=60;w=60, with configured values varying by deployment.","examples":["\"public-api\";q=60;w=60"]},"example":"\"public-api\";q=60;w=60"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"},"examples":{"upstreamUnavailable":{"summary":"External data source unavailable","value":{"type":"https://www.kevincanlas.com/developers#upstream-unavailable","title":"Upstream data unavailable","status":502,"detail":"The external data source did not return usable data.","code":"upstream_unavailable","resolution":"Retry later; the external data source may be temporarily unavailable.","error":"Market data is unavailable"}}}}}}}}},"/api/v1/mon-price":{"get":{"tags":["public-previews"],"summary":"Read the version 1 MON-USD market preview","description":"Returns the latest MON-USD ticker together with the seven-day series used by the portfolio's Monad price preview.\n\nThe product, currency, and window are fixed: Coinbase Exchange product MON-USD, USD, and 604800 seconds. This operation accepts no parameters, requires no authentication, and does not provide trading recommendations or financial advice.\n\nData source: Coinbase Exchange REST API, including the public MON-USD ticker and hourly candle endpoints (https://api.exchange.coinbase.com/products/MON-USD/ticker and https://api.exchange.coinbase.com/products/MON-USD/candles).\n\nCaching: the HTTP response is private and no-store. The server may reuse fetched candle history in memory for up to five minutes, while the ticker is fetched without a framework or upstream cache.\n\nThis is the stable v1 path. Its field names, types, units, and meaning are stable; incompatible future versions use a new major path.","operationId":"getV1MonPrice","parameters":[],"security":[],"responses":{"200":{"description":"Current MON-USD market preview data.","headers":{"Cache-Control":{"description":"This response is not stored by browsers or shared caches.","schema":{"type":"string","const":"private, no-store"},"example":"private, no-store"},"RateLimit":{"description":"Current service limit as a Structured Field List of Service Limit Items defined by draft-ietf-httpapi-ratelimit-headers-11. This header is emitted only when shared quota enforcement succeeds; it is absent when enforcement is inactive or unavailable.","schema":{"type":"string","description":"For example, \"public-api\";r=0;t=60, with configured values varying by deployment.","examples":["\"public-api\";r=0;t=60"]},"example":"\"public-api\";r=0;t=60"},"RateLimit-Policy":{"description":"Quota policy as a Structured Field List of Quota Policy Items defined by draft-ietf-httpapi-ratelimit-headers-11. This header is emitted only when shared quota enforcement succeeds; it is absent when enforcement is inactive or unavailable.","schema":{"type":"string","description":"For example, \"public-api\";q=60;w=60, with configured values varying by deployment.","examples":["\"public-api\";q=60;w=60"]},"example":"\"public-api\";q=60;w=60"}},"content":{"application/json":{"schema":{"type":"object","title":"MON market data","description":"The fixed MON-USD, USD-denominated market preview returned from Coinbase data.","required":["product","currency","source","windowSeconds","points","value","changePercent","low","high","asOf"],"additionalProperties":false,"properties":{"product":{"type":"string","const":"MON-USD","description":"Fixed Coinbase Exchange product identifier."},"currency":{"type":"string","const":"USD","description":"Fixed quote currency."},"source":{"type":"string","const":"Coinbase","description":"Fixed public data source."},"windowSeconds":{"type":"integer","const":604800,"description":"Fixed seven-day window length in seconds."},"points":{"type":"array","minItems":2,"description":"Chronologically ordered hourly candle closes for the window, followed by the current ticker point when it is newer.","items":{"$ref":"#/components/schemas/MarketPoint"}},"value":{"type":"number","description":"Latest MON value in USD.","examples":[0.04567]},"changePercent":{"type":"number","description":"Percentage change from the first historical point in the seven-day window.","examples":[10.85]},"low":{"type":"number","description":"Lowest observed value across the returned window and current ticker.","examples":[0.0381]},"high":{"type":"number","description":"Highest observed value across the returned window and current ticker.","examples":[0.0462]},"asOf":{"type":"string","format":"date-time","description":"ISO 8601 timestamp supplied by Coinbase for the latest ticker value.","examples":["2026-09-07T17:00:00.000Z"]}}},"examples":{"marketData":{"summary":"Illustrative MON-USD response","description":"Illustrative values showing the complete response shape; market values and timestamps change over time.","value":{"product":"MON-USD","currency":"USD","source":"Coinbase","windowSeconds":604800,"points":[{"time":1788685200,"value":0.0412},{"time":1788768000,"value":0.04438},{"time":1788771600,"value":0.04567}],"value":0.04567,"changePercent":10.85,"low":0.0381,"high":0.0462,"asOf":"2026-09-07T17:00:00.000Z"}}}}}},"405":{"description":"The API route exists, but the requested HTTP method is not supported.","headers":{"Allow":{"description":"Methods supported by this route.","schema":{"type":"string","examples":["GET, HEAD"]},"example":"GET, HEAD"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"},"examples":{"methodNotAllowed":{"summary":"Unsupported method","value":{"type":"https://www.kevincanlas.com/developers#method-not-allowed","title":"Method not allowed","status":405,"detail":"This public API route supports GET and HEAD requests.","code":"method_not_allowed","resolution":"Use GET to read this resource."}}}}}},"429":{"description":"The request exceeded the shared quota while distributed enforcement was active. Rate-limit headers are omitted when shared enforcement is inactive or unavailable.","headers":{"Retry-After":{"description":"Retry delay in seconds. This header is emitted only when shared quota enforcement succeeds and rejects the request.","schema":{"type":"integer","minimum":0,"description":"Number of seconds the client should wait before retrying.","examples":[60]},"example":60},"RateLimit":{"description":"Current service limit as a Structured Field List of Service Limit Items defined by draft-ietf-httpapi-ratelimit-headers-11. This header is emitted only when shared quota enforcement succeeds; it is absent when enforcement is inactive or unavailable.","schema":{"type":"string","description":"For example, \"public-api\";r=0;t=60, with configured values varying by deployment.","examples":["\"public-api\";r=0;t=60"]},"example":"\"public-api\";r=0;t=60"},"RateLimit-Policy":{"description":"Quota policy as a Structured Field List of Quota Policy Items defined by draft-ietf-httpapi-ratelimit-headers-11. This header is emitted only when shared quota enforcement succeeds; it is absent when enforcement is inactive or unavailable.","schema":{"type":"string","description":"For example, \"public-api\";q=60;w=60, with configured values varying by deployment.","examples":["\"public-api\";q=60;w=60"]},"example":"\"public-api\";q=60;w=60"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"},"examples":{"rateLimitExceeded":{"summary":"Shared quota exceeded","value":{"type":"https://www.kevincanlas.com/developers#rate-limit-exceeded","title":"Rate limit exceeded","status":429,"detail":"The shared request quota is temporarily exhausted.","code":"rate_limit_exceeded","resolution":"Wait for the Retry-After interval before retrying this resource."}}}}}},"502":{"description":"The external data source did not provide a usable response.","headers":{"RateLimit":{"description":"Current service limit as a Structured Field List of Service Limit Items defined by draft-ietf-httpapi-ratelimit-headers-11. This header is emitted only when shared quota enforcement succeeds; it is absent when enforcement is inactive or unavailable.","schema":{"type":"string","description":"For example, \"public-api\";r=0;t=60, with configured values varying by deployment.","examples":["\"public-api\";r=0;t=60"]},"example":"\"public-api\";r=0;t=60"},"RateLimit-Policy":{"description":"Quota policy as a Structured Field List of Quota Policy Items defined by draft-ietf-httpapi-ratelimit-headers-11. This header is emitted only when shared quota enforcement succeeds; it is absent when enforcement is inactive or unavailable.","schema":{"type":"string","description":"For example, \"public-api\";q=60;w=60, with configured values varying by deployment.","examples":["\"public-api\";q=60;w=60"]},"example":"\"public-api\";q=60;w=60"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"},"examples":{"upstreamUnavailable":{"summary":"External data source unavailable","value":{"type":"https://www.kevincanlas.com/developers#upstream-unavailable","title":"Upstream data unavailable","status":502,"detail":"The external data source did not return usable data.","code":"upstream_unavailable","resolution":"Retry later; the external data source may be temporarily unavailable.","error":"Market data is unavailable"}}}}}}}}},"/api/github-contributions":{"get":{"tags":["public-previews"],"summary":"Read Kevin Canlas's GitHub contributions","description":"Returns the public contribution calendar for the fixed GitHub account kvncnls over a rolling 365-day window ending on the current date in America/Toronto.\n\nThe account, time zone, and window are fixed. This operation accepts no parameters, requires no authentication, and returns daily contribution counts plus GitHub's 0–4 calendar intensity level.\n\nData source: the public GitHub contribution calendar for https://github.com/users/kvncnls/contributions. This endpoint reports the public calendar it can read and does not promise availability or completeness when GitHub changes or limits that source.\n\nCaching: the server keeps one rolling-year response in memory until the next Toronto midnight. The response is public-cacheable with max-age=0, a computed s-maxage ending at that midnight, and stale-while-revalidate=300 seconds.\n\nThe unversioned path is a stable alias of /api/v1/github-contributions and follows the v1 field names, types, units, and meaning.","operationId":"getGithubContributions","parameters":[],"security":[],"responses":{"200":{"description":"A rolling-year GitHub contribution calendar.","headers":{"Cache-Control":{"description":"Shared-cache policy; s-maxage is the number of seconds until the next midnight in America/Toronto. When quota enforcement succeeds, a proxy may instead use private, no-store to keep per-client remaining values out of shared caches.","schema":{"type":"string","pattern":"^(?:private, no-store|public, max-age=0, s-maxage=[1-9][0-9]*, stale-while-revalidate=300)$"},"example":"public, max-age=0, s-maxage=3600, stale-while-revalidate=300"},"RateLimit":{"description":"Current service limit as a Structured Field List of Service Limit Items defined by draft-ietf-httpapi-ratelimit-headers-11. This header is emitted only when shared quota enforcement succeeds; it is absent when enforcement is inactive or unavailable.","schema":{"type":"string","description":"For example, \"public-api\";r=0;t=60, with configured values varying by deployment.","examples":["\"public-api\";r=0;t=60"]},"example":"\"public-api\";r=0;t=60"},"RateLimit-Policy":{"description":"Quota policy as a Structured Field List of Quota Policy Items defined by draft-ietf-httpapi-ratelimit-headers-11. This header is emitted only when shared quota enforcement succeeds; it is absent when enforcement is inactive or unavailable.","schema":{"type":"string","description":"For example, \"public-api\";q=60;w=60, with configured values varying by deployment.","examples":["\"public-api\";q=60;w=60"]},"example":"\"public-api\";q=60;w=60"}},"content":{"application/json":{"schema":{"type":"object","title":"GitHub contributions","description":"The fixed kvncnls rolling-year contribution calendar in America/Toronto.","required":["username","totalContributions","startDate","endDate","days","timeZone","nextRefreshAt"],"additionalProperties":false,"properties":{"username":{"type":"string","const":"kvncnls","description":"Fixed GitHub account whose public calendar is read."},"totalContributions":{"type":"integer","minimum":0,"description":"Sum of count across all 365 returned days.","examples":[1234]},"startDate":{"type":"string","format":"date","description":"First date in the rolling 365-day window, inclusive.","examples":["2025-09-08"]},"endDate":{"type":"string","format":"date","description":"Last date in the rolling 365-day window, inclusive.","examples":["2026-09-07"]},"days":{"type":"array","minItems":365,"maxItems":365,"description":"Exactly 365 daily entries from startDate through endDate, inclusive.","items":{"$ref":"#/components/schemas/GitHubContributionDay"}},"timeZone":{"type":"string","const":"America/Toronto","description":"Fixed time zone used to determine the rolling window and refresh boundary."},"nextRefreshAt":{"type":"string","format":"date-time","description":"Next refresh boundary at midnight in America/Toronto, expressed as an ISO timestamp.","examples":["2026-09-08T04:00:00.000Z"]}}},"examples":{"githubContributions":{"summary":"Illustrative rolling-year contribution response","description":"Illustrative values showing all 365 daily entries; counts change as the public GitHub calendar changes.","value":{"username":"kvncnls","totalContributions":686,"startDate":"2025-09-08","endDate":"2026-09-07","days":[{"date":"2025-09-08","count":12,"level":4},{"date":"2025-09-09","count":0,"level":0},{"date":"2025-09-10","count":0,"level":0},{"date":"2025-09-11","count":2,"level":1},{"date":"2025-09-12","count":0,"level":0},{"date":"2025-09-13","count":0,"level":0},{"date":"2025-09-14","count":2,"level":1},{"date":"2025-09-15","count":5,"level":3},{"date":"2025-09-16","count":0,"level":0},{"date":"2025-09-17","count":2,"level":1},{"date":"2025-09-18","count":0,"level":0},{"date":"2025-09-19","count":0,"level":0},{"date":"2025-09-20","count":2,"level":1},{"date":"2025-09-21","count":0,"level":0},{"date":"2025-09-22","count":5,"level":3},{"date":"2025-09-23","count":2,"level":1},{"date":"2025-09-24","count":0,"level":0},{"date":"2025-09-25","count":0,"level":0},{"date":"2025-09-26","count":2,"level":1},{"date":"2025-09-27","count":12,"level":4},{"date":"2025-09-28","count":0,"level":0},{"date":"2025-09-29","count":5,"level":3},{"date":"2025-09-30","count":0,"level":0},{"date":"2025-10-01","count":0,"level":0},{"date":"2025-10-02","count":2,"level":1},{"date":"2025-10-03","count":0,"level":0},{"date":"2025-10-04","count":0,"level":0},{"date":"2025-10-05","count":2,"level":1},{"date":"2025-10-06","count":5,"level":3},{"date":"2025-10-07","count":0,"level":0},{"date":"2025-10-08","count":2,"level":1},{"date":"2025-10-09","count":0,"level":0},{"date":"2025-10-10","count":0,"level":0},{"date":"2025-10-11","count":2,"level":1},{"date":"2025-10-12","count":0,"level":0},{"date":"2025-10-13","count":5,"level":3},{"date":"2025-10-14","count":2,"level":1},{"date":"2025-10-15","count":0,"level":0},{"date":"2025-10-16","count":12,"level":4},{"date":"2025-10-17","count":2,"level":1},{"date":"2025-10-18","count":0,"level":0},{"date":"2025-10-19","count":0,"level":0},{"date":"2025-10-20","count":5,"level":3},{"date":"2025-10-21","count":0,"level":0},{"date":"2025-10-22","count":0,"level":0},{"date":"2025-10-23","count":2,"level":1},{"date":"2025-10-24","count":0,"level":0},{"date":"2025-10-25","count":0,"level":0},{"date":"2025-10-26","count":2,"level":1},{"date":"2025-10-27","count":5,"level":3},{"date":"2025-10-28","count":0,"level":0},{"date":"2025-10-29","count":2,"level":1},{"date":"2025-10-30","count":0,"level":0},{"date":"2025-10-31","count":0,"level":0},{"date":"2025-11-01","count":2,"level":1},{"date":"2025-11-02","count":0,"level":0},{"date":"2025-11-03","count":5,"level":3},{"date":"2025-11-04","count":12,"level":4},{"date":"2025-11-05","count":0,"level":0},{"date":"2025-11-06","count":0,"level":0},{"date":"2025-11-07","count":2,"level":1},{"date":"2025-11-08","count":0,"level":0},{"date":"2025-11-09","count":0,"level":0},{"date":"2025-11-10","count":5,"level":3},{"date":"2025-11-11","count":0,"level":0},{"date":"2025-11-12","count":0,"level":0},{"date":"2025-11-13","count":2,"level":1},{"date":"2025-11-14","count":0,"level":0},{"date":"2025-11-15","count":0,"level":0},{"date":"2025-11-16","count":2,"level":1},{"date":"2025-11-17","count":5,"level":3},{"date":"2025-11-18","count":0,"level":0},{"date":"2025-11-19","count":2,"level":1},{"date":"2025-11-20","count":0,"level":0},{"date":"2025-11-21","count":0,"level":0},{"date":"2025-11-22","count":2,"level":1},{"date":"2025-11-23","count":12,"level":4},{"date":"2025-11-24","count":5,"level":3},{"date":"2025-11-25","count":2,"level":1},{"date":"2025-11-26","count":0,"level":0},{"date":"2025-11-27","count":0,"level":0},{"date":"2025-11-28","count":2,"level":1},{"date":"2025-11-29","count":0,"level":0},{"date":"2025-11-30","count":0,"level":0},{"date":"2025-12-01","count":5,"level":3},{"date":"2025-12-02","count":0,"level":0},{"date":"2025-12-03","count":0,"level":0},{"date":"2025-12-04","count":2,"level":1},{"date":"2025-12-05","count":0,"level":0},{"date":"2025-12-06","count":0,"level":0},{"date":"2025-12-07","count":2,"level":1},{"date":"2025-12-08","count":5,"level":3},{"date":"2025-12-09","count":0,"level":0},{"date":"2025-12-10","count":2,"level":1},{"date":"2025-12-11","count":0,"level":0},{"date":"2025-12-12","count":12,"level":4},{"date":"2025-12-13","count":2,"level":1},{"date":"2025-12-14","count":0,"level":0},{"date":"2025-12-15","count":5,"level":3},{"date":"2025-12-16","count":2,"level":1},{"date":"2025-12-17","count":0,"level":0},{"date":"2025-12-18","count":0,"level":0},{"date":"2025-12-19","count":2,"level":1},{"date":"2025-12-20","count":0,"level":0},{"date":"2025-12-21","count":0,"level":0},{"date":"2025-12-22","count":5,"level":3},{"date":"2025-12-23","count":0,"level":0},{"date":"2025-12-24","count":0,"level":0},{"date":"2025-12-25","count":2,"level":1},{"date":"2025-12-26","count":0,"level":0},{"date":"2025-12-27","count":0,"level":0},{"date":"2025-12-28","count":2,"level":1},{"date":"2025-12-29","count":5,"level":3},{"date":"2025-12-30","count":0,"level":0},{"date":"2025-12-31","count":12,"level":4},{"date":"2026-01-01","count":0,"level":0},{"date":"2026-01-02","count":0,"level":0},{"date":"2026-01-03","count":2,"level":1},{"date":"2026-01-04","count":0,"level":0},{"date":"2026-01-05","count":5,"level":3},{"date":"2026-01-06","count":2,"level":1},{"date":"2026-01-07","count":0,"level":0},{"date":"2026-01-08","count":0,"level":0},{"date":"2026-01-09","count":2,"level":1},{"date":"2026-01-10","count":0,"level":0},{"date":"2026-01-11","count":0,"level":0},{"date":"2026-01-12","count":5,"level":3},{"date":"2026-01-13","count":0,"level":0},{"date":"2026-01-14","count":0,"level":0},{"date":"2026-01-15","count":2,"level":1},{"date":"2026-01-16","count":0,"level":0},{"date":"2026-01-17","count":0,"level":0},{"date":"2026-01-18","count":2,"level":1},{"date":"2026-01-19","count":12,"level":4},{"date":"2026-01-20","count":0,"level":0},{"date":"2026-01-21","count":2,"level":1},{"date":"2026-01-22","count":0,"level":0},{"date":"2026-01-23","count":0,"level":0},{"date":"2026-01-24","count":2,"level":1},{"date":"2026-01-25","count":0,"level":0},{"date":"2026-01-26","count":5,"level":3},{"date":"2026-01-27","count":2,"level":1},{"date":"2026-01-28","count":0,"level":0},{"date":"2026-01-29","count":0,"level":0},{"date":"2026-01-30","count":2,"level":1},{"date":"2026-01-31","count":0,"level":0},{"date":"2026-02-01","count":0,"level":0},{"date":"2026-02-02","count":5,"level":3},{"date":"2026-02-03","count":0,"level":0},{"date":"2026-02-04","count":0,"level":0},{"date":"2026-02-05","count":2,"level":1},{"date":"2026-02-06","count":0,"level":0},{"date":"2026-02-07","count":12,"level":4},{"date":"2026-02-08","count":2,"level":1},{"date":"2026-02-09","count":5,"level":3},{"date":"2026-02-10","count":0,"level":0},{"date":"2026-02-11","count":2,"level":1},{"date":"2026-02-12","count":0,"level":0},{"date":"2026-02-13","count":0,"level":0},{"date":"2026-02-14","count":2,"level":1},{"date":"2026-02-15","count":0,"level":0},{"date":"2026-02-16","count":5,"level":3},{"date":"2026-02-17","count":2,"level":1},{"date":"2026-02-18","count":0,"level":0},{"date":"2026-02-19","count":0,"level":0},{"date":"2026-02-20","count":2,"level":1},{"date":"2026-02-21","count":0,"level":0},{"date":"2026-02-22","count":0,"level":0},{"date":"2026-02-23","count":5,"level":3},{"date":"2026-02-24","count":0,"level":0},{"date":"2026-02-25","count":0,"level":0},{"date":"2026-02-26","count":12,"level":4},{"date":"2026-02-27","count":0,"level":0},{"date":"2026-02-28","count":0,"level":0},{"date":"2026-03-01","count":2,"level":1},{"date":"2026-03-02","count":5,"level":3},{"date":"2026-03-03","count":0,"level":0},{"date":"2026-03-04","count":2,"level":1},{"date":"2026-03-05","count":0,"level":0},{"date":"2026-03-06","count":0,"level":0},{"date":"2026-03-07","count":2,"level":1},{"date":"2026-03-08","count":0,"level":0},{"date":"2026-03-09","count":5,"level":3},{"date":"2026-03-10","count":2,"level":1},{"date":"2026-03-11","count":0,"level":0},{"date":"2026-03-12","count":0,"level":0},{"date":"2026-03-13","count":2,"level":1},{"date":"2026-03-14","count":0,"level":0},{"date":"2026-03-15","count":0,"level":0},{"date":"2026-03-16","count":5,"level":3},{"date":"2026-03-17","count":12,"level":4},{"date":"2026-03-18","count":0,"level":0},{"date":"2026-03-19","count":2,"level":1},{"date":"2026-03-20","count":0,"level":0},{"date":"2026-03-21","count":0,"level":0},{"date":"2026-03-22","count":2,"level":1},{"date":"2026-03-23","count":5,"level":3},{"date":"2026-03-24","count":0,"level":0},{"date":"2026-03-25","count":2,"level":1},{"date":"2026-03-26","count":0,"level":0},{"date":"2026-03-27","count":0,"level":0},{"date":"2026-03-28","count":2,"level":1},{"date":"2026-03-29","count":0,"level":0},{"date":"2026-03-30","count":5,"level":3},{"date":"2026-03-31","count":2,"level":1},{"date":"2026-04-01","count":0,"level":0},{"date":"2026-04-02","count":0,"level":0},{"date":"2026-04-03","count":2,"level":1},{"date":"2026-04-04","count":0,"level":0},{"date":"2026-04-05","count":12,"level":4},{"date":"2026-04-06","count":5,"level":3},{"date":"2026-04-07","count":0,"level":0},{"date":"2026-04-08","count":0,"level":0},{"date":"2026-04-09","count":2,"level":1},{"date":"2026-04-10","count":0,"level":0},{"date":"2026-04-11","count":0,"level":0},{"date":"2026-04-12","count":2,"level":1},{"date":"2026-04-13","count":5,"level":3},{"date":"2026-04-14","count":0,"level":0},{"date":"2026-04-15","count":2,"level":1},{"date":"2026-04-16","count":0,"level":0},{"date":"2026-04-17","count":0,"level":0},{"date":"2026-04-18","count":2,"level":1},{"date":"2026-04-19","count":0,"level":0},{"date":"2026-04-20","count":5,"level":3},{"date":"2026-04-21","count":2,"level":1},{"date":"2026-04-22","count":0,"level":0},{"date":"2026-04-23","count":0,"level":0},{"date":"2026-04-24","count":12,"level":4},{"date":"2026-04-25","count":0,"level":0},{"date":"2026-04-26","count":0,"level":0},{"date":"2026-04-27","count":5,"level":3},{"date":"2026-04-28","count":0,"level":0},{"date":"2026-04-29","count":0,"level":0},{"date":"2026-04-30","count":2,"level":1},{"date":"2026-05-01","count":0,"level":0},{"date":"2026-05-02","count":0,"level":0},{"date":"2026-05-03","count":2,"level":1},{"date":"2026-05-04","count":5,"level":3},{"date":"2026-05-05","count":0,"level":0},{"date":"2026-05-06","count":2,"level":1},{"date":"2026-05-07","count":0,"level":0},{"date":"2026-05-08","count":0,"level":0},{"date":"2026-05-09","count":2,"level":1},{"date":"2026-05-10","count":0,"level":0},{"date":"2026-05-11","count":5,"level":3},{"date":"2026-05-12","count":2,"level":1},{"date":"2026-05-13","count":12,"level":4},{"date":"2026-05-14","count":0,"level":0},{"date":"2026-05-15","count":2,"level":1},{"date":"2026-05-16","count":0,"level":0},{"date":"2026-05-17","count":0,"level":0},{"date":"2026-05-18","count":5,"level":3},{"date":"2026-05-19","count":0,"level":0},{"date":"2026-05-20","count":0,"level":0},{"date":"2026-05-21","count":2,"level":1},{"date":"2026-05-22","count":0,"level":0},{"date":"2026-05-23","count":0,"level":0},{"date":"2026-05-24","count":2,"level":1},{"date":"2026-05-25","count":5,"level":3},{"date":"2026-05-26","count":0,"level":0},{"date":"2026-05-27","count":2,"level":1},{"date":"2026-05-28","count":0,"level":0},{"date":"2026-05-29","count":0,"level":0},{"date":"2026-05-30","count":2,"level":1},{"date":"2026-05-31","count":0,"level":0},{"date":"2026-06-01","count":12,"level":4},{"date":"2026-06-02","count":2,"level":1},{"date":"2026-06-03","count":0,"level":0},{"date":"2026-06-04","count":0,"level":0},{"date":"2026-06-05","count":2,"level":1},{"date":"2026-06-06","count":0,"level":0},{"date":"2026-06-07","count":0,"level":0},{"date":"2026-06-08","count":5,"level":3},{"date":"2026-06-09","count":0,"level":0},{"date":"2026-06-10","count":0,"level":0},{"date":"2026-06-11","count":2,"level":1},{"date":"2026-06-12","count":0,"level":0},{"date":"2026-06-13","count":0,"level":0},{"date":"2026-06-14","count":2,"level":1},{"date":"2026-06-15","count":5,"level":3},{"date":"2026-06-16","count":0,"level":0},{"date":"2026-06-17","count":2,"level":1},{"date":"2026-06-18","count":0,"level":0},{"date":"2026-06-19","count":0,"level":0},{"date":"2026-06-20","count":12,"level":4},{"date":"2026-06-21","count":0,"level":0},{"date":"2026-06-22","count":5,"level":3},{"date":"2026-06-23","count":2,"level":1},{"date":"2026-06-24","count":0,"level":0},{"date":"2026-06-25","count":0,"level":0},{"date":"2026-06-26","count":2,"level":1},{"date":"2026-06-27","count":0,"level":0},{"date":"2026-06-28","count":0,"level":0},{"date":"2026-06-29","count":5,"level":3},{"date":"2026-06-30","count":0,"level":0},{"date":"2026-07-01","count":0,"level":0},{"date":"2026-07-02","count":2,"level":1},{"date":"2026-07-03","count":0,"level":0},{"date":"2026-07-04","count":0,"level":0},{"date":"2026-07-05","count":2,"level":1},{"date":"2026-07-06","count":5,"level":3},{"date":"2026-07-07","count":0,"level":0},{"date":"2026-07-08","count":2,"level":1},{"date":"2026-07-09","count":12,"level":4},{"date":"2026-07-10","count":0,"level":0},{"date":"2026-07-11","count":2,"level":1},{"date":"2026-07-12","count":0,"level":0},{"date":"2026-07-13","count":5,"level":3},{"date":"2026-07-14","count":2,"level":1},{"date":"2026-07-15","count":0,"level":0},{"date":"2026-07-16","count":0,"level":0},{"date":"2026-07-17","count":2,"level":1},{"date":"2026-07-18","count":0,"level":0},{"date":"2026-07-19","count":0,"level":0},{"date":"2026-07-20","count":5,"level":3},{"date":"2026-07-21","count":0,"level":0},{"date":"2026-07-22","count":0,"level":0},{"date":"2026-07-23","count":2,"level":1},{"date":"2026-07-24","count":0,"level":0},{"date":"2026-07-25","count":0,"level":0},{"date":"2026-07-26","count":2,"level":1},{"date":"2026-07-27","count":5,"level":3},{"date":"2026-07-28","count":12,"level":4},{"date":"2026-07-29","count":2,"level":1},{"date":"2026-07-30","count":0,"level":0},{"date":"2026-07-31","count":0,"level":0},{"date":"2026-08-01","count":2,"level":1},{"date":"2026-08-02","count":0,"level":0},{"date":"2026-08-03","count":5,"level":3},{"date":"2026-08-04","count":2,"level":1},{"date":"2026-08-05","count":0,"level":0},{"date":"2026-08-06","count":0,"level":0},{"date":"2026-08-07","count":2,"level":1},{"date":"2026-08-08","count":0,"level":0},{"date":"2026-08-09","count":0,"level":0},{"date":"2026-08-10","count":5,"level":3},{"date":"2026-08-11","count":0,"level":0},{"date":"2026-08-12","count":0,"level":0},{"date":"2026-08-13","count":2,"level":1},{"date":"2026-08-14","count":0,"level":0},{"date":"2026-08-15","count":0,"level":0},{"date":"2026-08-16","count":12,"level":4},{"date":"2026-08-17","count":5,"level":3},{"date":"2026-08-18","count":0,"level":0},{"date":"2026-08-19","count":2,"level":1},{"date":"2026-08-20","count":0,"level":0},{"date":"2026-08-21","count":0,"level":0},{"date":"2026-08-22","count":2,"level":1},{"date":"2026-08-23","count":0,"level":0},{"date":"2026-08-24","count":5,"level":3},{"date":"2026-08-25","count":2,"level":1},{"date":"2026-08-26","count":0,"level":0},{"date":"2026-08-27","count":0,"level":0},{"date":"2026-08-28","count":2,"level":1},{"date":"2026-08-29","count":0,"level":0},{"date":"2026-08-30","count":0,"level":0},{"date":"2026-08-31","count":5,"level":3},{"date":"2026-09-01","count":0,"level":0},{"date":"2026-09-02","count":0,"level":0},{"date":"2026-09-03","count":2,"level":1},{"date":"2026-09-04","count":12,"level":4},{"date":"2026-09-05","count":0,"level":0},{"date":"2026-09-06","count":2,"level":1},{"date":"2026-09-07","count":5,"level":3}],"timeZone":"America/Toronto","nextRefreshAt":"2026-09-08T04:00:00.000Z"}}}}}},"405":{"description":"The API route exists, but the requested HTTP method is not supported.","headers":{"Allow":{"description":"Methods supported by this route.","schema":{"type":"string","examples":["GET, HEAD"]},"example":"GET, HEAD"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"},"examples":{"methodNotAllowed":{"summary":"Unsupported method","value":{"type":"https://www.kevincanlas.com/developers#method-not-allowed","title":"Method not allowed","status":405,"detail":"This public API route supports GET and HEAD requests.","code":"method_not_allowed","resolution":"Use GET to read this resource."}}}}}},"429":{"description":"The request exceeded the shared quota while distributed enforcement was active. Rate-limit headers are omitted when shared enforcement is inactive or unavailable.","headers":{"Retry-After":{"description":"Retry delay in seconds. This header is emitted only when shared quota enforcement succeeds and rejects the request.","schema":{"type":"integer","minimum":0,"description":"Number of seconds the client should wait before retrying.","examples":[60]},"example":60},"RateLimit":{"description":"Current service limit as a Structured Field List of Service Limit Items defined by draft-ietf-httpapi-ratelimit-headers-11. This header is emitted only when shared quota enforcement succeeds; it is absent when enforcement is inactive or unavailable.","schema":{"type":"string","description":"For example, \"public-api\";r=0;t=60, with configured values varying by deployment.","examples":["\"public-api\";r=0;t=60"]},"example":"\"public-api\";r=0;t=60"},"RateLimit-Policy":{"description":"Quota policy as a Structured Field List of Quota Policy Items defined by draft-ietf-httpapi-ratelimit-headers-11. This header is emitted only when shared quota enforcement succeeds; it is absent when enforcement is inactive or unavailable.","schema":{"type":"string","description":"For example, \"public-api\";q=60;w=60, with configured values varying by deployment.","examples":["\"public-api\";q=60;w=60"]},"example":"\"public-api\";q=60;w=60"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"},"examples":{"rateLimitExceeded":{"summary":"Shared quota exceeded","value":{"type":"https://www.kevincanlas.com/developers#rate-limit-exceeded","title":"Rate limit exceeded","status":429,"detail":"The shared request quota is temporarily exhausted.","code":"rate_limit_exceeded","resolution":"Wait for the Retry-After interval before retrying this resource."}}}}}},"502":{"description":"The external data source did not provide a usable response.","headers":{"RateLimit":{"description":"Current service limit as a Structured Field List of Service Limit Items defined by draft-ietf-httpapi-ratelimit-headers-11. This header is emitted only when shared quota enforcement succeeds; it is absent when enforcement is inactive or unavailable.","schema":{"type":"string","description":"For example, \"public-api\";r=0;t=60, with configured values varying by deployment.","examples":["\"public-api\";r=0;t=60"]},"example":"\"public-api\";r=0;t=60"},"RateLimit-Policy":{"description":"Quota policy as a Structured Field List of Quota Policy Items defined by draft-ietf-httpapi-ratelimit-headers-11. This header is emitted only when shared quota enforcement succeeds; it is absent when enforcement is inactive or unavailable.","schema":{"type":"string","description":"For example, \"public-api\";q=60;w=60, with configured values varying by deployment.","examples":["\"public-api\";q=60;w=60"]},"example":"\"public-api\";q=60;w=60"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"},"examples":{"upstreamUnavailable":{"summary":"External data source unavailable","value":{"type":"https://www.kevincanlas.com/developers#upstream-unavailable","title":"Upstream data unavailable","status":502,"detail":"The external data source did not return usable data.","code":"upstream_unavailable","resolution":"Retry later; the external data source may be temporarily unavailable.","error":"Market data is unavailable"}}}}}}}}},"/api/v1/github-contributions":{"get":{"tags":["public-previews"],"summary":"Read version 1 Kevin Canlas GitHub contributions","description":"Returns the public contribution calendar for the fixed GitHub account kvncnls over a rolling 365-day window ending on the current date in America/Toronto.\n\nThe account, time zone, and window are fixed. This operation accepts no parameters, requires no authentication, and returns daily contribution counts plus GitHub's 0–4 calendar intensity level.\n\nData source: the public GitHub contribution calendar for https://github.com/users/kvncnls/contributions. This endpoint reports the public calendar it can read and does not promise availability or completeness when GitHub changes or limits that source.\n\nCaching: the server keeps one rolling-year response in memory until the next Toronto midnight. The response is public-cacheable with max-age=0, a computed s-maxage ending at that midnight, and stale-while-revalidate=300 seconds.\n\nThis is the stable v1 path. Its field names, types, units, and meaning are stable; incompatible future versions use a new major path.","operationId":"getV1GithubContributions","parameters":[],"security":[],"responses":{"200":{"description":"A rolling-year GitHub contribution calendar.","headers":{"Cache-Control":{"description":"Shared-cache policy; s-maxage is the number of seconds until the next midnight in America/Toronto. When quota enforcement succeeds, a proxy may instead use private, no-store to keep per-client remaining values out of shared caches.","schema":{"type":"string","pattern":"^(?:private, no-store|public, max-age=0, s-maxage=[1-9][0-9]*, stale-while-revalidate=300)$"},"example":"public, max-age=0, s-maxage=3600, stale-while-revalidate=300"},"RateLimit":{"description":"Current service limit as a Structured Field List of Service Limit Items defined by draft-ietf-httpapi-ratelimit-headers-11. This header is emitted only when shared quota enforcement succeeds; it is absent when enforcement is inactive or unavailable.","schema":{"type":"string","description":"For example, \"public-api\";r=0;t=60, with configured values varying by deployment.","examples":["\"public-api\";r=0;t=60"]},"example":"\"public-api\";r=0;t=60"},"RateLimit-Policy":{"description":"Quota policy as a Structured Field List of Quota Policy Items defined by draft-ietf-httpapi-ratelimit-headers-11. This header is emitted only when shared quota enforcement succeeds; it is absent when enforcement is inactive or unavailable.","schema":{"type":"string","description":"For example, \"public-api\";q=60;w=60, with configured values varying by deployment.","examples":["\"public-api\";q=60;w=60"]},"example":"\"public-api\";q=60;w=60"}},"content":{"application/json":{"schema":{"type":"object","title":"GitHub contributions","description":"The fixed kvncnls rolling-year contribution calendar in America/Toronto.","required":["username","totalContributions","startDate","endDate","days","timeZone","nextRefreshAt"],"additionalProperties":false,"properties":{"username":{"type":"string","const":"kvncnls","description":"Fixed GitHub account whose public calendar is read."},"totalContributions":{"type":"integer","minimum":0,"description":"Sum of count across all 365 returned days.","examples":[1234]},"startDate":{"type":"string","format":"date","description":"First date in the rolling 365-day window, inclusive.","examples":["2025-09-08"]},"endDate":{"type":"string","format":"date","description":"Last date in the rolling 365-day window, inclusive.","examples":["2026-09-07"]},"days":{"type":"array","minItems":365,"maxItems":365,"description":"Exactly 365 daily entries from startDate through endDate, inclusive.","items":{"$ref":"#/components/schemas/GitHubContributionDay"}},"timeZone":{"type":"string","const":"America/Toronto","description":"Fixed time zone used to determine the rolling window and refresh boundary."},"nextRefreshAt":{"type":"string","format":"date-time","description":"Next refresh boundary at midnight in America/Toronto, expressed as an ISO timestamp.","examples":["2026-09-08T04:00:00.000Z"]}}},"examples":{"githubContributions":{"summary":"Illustrative rolling-year contribution response","description":"Illustrative values showing all 365 daily entries; counts change as the public GitHub calendar changes.","value":{"username":"kvncnls","totalContributions":686,"startDate":"2025-09-08","endDate":"2026-09-07","days":[{"date":"2025-09-08","count":12,"level":4},{"date":"2025-09-09","count":0,"level":0},{"date":"2025-09-10","count":0,"level":0},{"date":"2025-09-11","count":2,"level":1},{"date":"2025-09-12","count":0,"level":0},{"date":"2025-09-13","count":0,"level":0},{"date":"2025-09-14","count":2,"level":1},{"date":"2025-09-15","count":5,"level":3},{"date":"2025-09-16","count":0,"level":0},{"date":"2025-09-17","count":2,"level":1},{"date":"2025-09-18","count":0,"level":0},{"date":"2025-09-19","count":0,"level":0},{"date":"2025-09-20","count":2,"level":1},{"date":"2025-09-21","count":0,"level":0},{"date":"2025-09-22","count":5,"level":3},{"date":"2025-09-23","count":2,"level":1},{"date":"2025-09-24","count":0,"level":0},{"date":"2025-09-25","count":0,"level":0},{"date":"2025-09-26","count":2,"level":1},{"date":"2025-09-27","count":12,"level":4},{"date":"2025-09-28","count":0,"level":0},{"date":"2025-09-29","count":5,"level":3},{"date":"2025-09-30","count":0,"level":0},{"date":"2025-10-01","count":0,"level":0},{"date":"2025-10-02","count":2,"level":1},{"date":"2025-10-03","count":0,"level":0},{"date":"2025-10-04","count":0,"level":0},{"date":"2025-10-05","count":2,"level":1},{"date":"2025-10-06","count":5,"level":3},{"date":"2025-10-07","count":0,"level":0},{"date":"2025-10-08","count":2,"level":1},{"date":"2025-10-09","count":0,"level":0},{"date":"2025-10-10","count":0,"level":0},{"date":"2025-10-11","count":2,"level":1},{"date":"2025-10-12","count":0,"level":0},{"date":"2025-10-13","count":5,"level":3},{"date":"2025-10-14","count":2,"level":1},{"date":"2025-10-15","count":0,"level":0},{"date":"2025-10-16","count":12,"level":4},{"date":"2025-10-17","count":2,"level":1},{"date":"2025-10-18","count":0,"level":0},{"date":"2025-10-19","count":0,"level":0},{"date":"2025-10-20","count":5,"level":3},{"date":"2025-10-21","count":0,"level":0},{"date":"2025-10-22","count":0,"level":0},{"date":"2025-10-23","count":2,"level":1},{"date":"2025-10-24","count":0,"level":0},{"date":"2025-10-25","count":0,"level":0},{"date":"2025-10-26","count":2,"level":1},{"date":"2025-10-27","count":5,"level":3},{"date":"2025-10-28","count":0,"level":0},{"date":"2025-10-29","count":2,"level":1},{"date":"2025-10-30","count":0,"level":0},{"date":"2025-10-31","count":0,"level":0},{"date":"2025-11-01","count":2,"level":1},{"date":"2025-11-02","count":0,"level":0},{"date":"2025-11-03","count":5,"level":3},{"date":"2025-11-04","count":12,"level":4},{"date":"2025-11-05","count":0,"level":0},{"date":"2025-11-06","count":0,"level":0},{"date":"2025-11-07","count":2,"level":1},{"date":"2025-11-08","count":0,"level":0},{"date":"2025-11-09","count":0,"level":0},{"date":"2025-11-10","count":5,"level":3},{"date":"2025-11-11","count":0,"level":0},{"date":"2025-11-12","count":0,"level":0},{"date":"2025-11-13","count":2,"level":1},{"date":"2025-11-14","count":0,"level":0},{"date":"2025-11-15","count":0,"level":0},{"date":"2025-11-16","count":2,"level":1},{"date":"2025-11-17","count":5,"level":3},{"date":"2025-11-18","count":0,"level":0},{"date":"2025-11-19","count":2,"level":1},{"date":"2025-11-20","count":0,"level":0},{"date":"2025-11-21","count":0,"level":0},{"date":"2025-11-22","count":2,"level":1},{"date":"2025-11-23","count":12,"level":4},{"date":"2025-11-24","count":5,"level":3},{"date":"2025-11-25","count":2,"level":1},{"date":"2025-11-26","count":0,"level":0},{"date":"2025-11-27","count":0,"level":0},{"date":"2025-11-28","count":2,"level":1},{"date":"2025-11-29","count":0,"level":0},{"date":"2025-11-30","count":0,"level":0},{"date":"2025-12-01","count":5,"level":3},{"date":"2025-12-02","count":0,"level":0},{"date":"2025-12-03","count":0,"level":0},{"date":"2025-12-04","count":2,"level":1},{"date":"2025-12-05","count":0,"level":0},{"date":"2025-12-06","count":0,"level":0},{"date":"2025-12-07","count":2,"level":1},{"date":"2025-12-08","count":5,"level":3},{"date":"2025-12-09","count":0,"level":0},{"date":"2025-12-10","count":2,"level":1},{"date":"2025-12-11","count":0,"level":0},{"date":"2025-12-12","count":12,"level":4},{"date":"2025-12-13","count":2,"level":1},{"date":"2025-12-14","count":0,"level":0},{"date":"2025-12-15","count":5,"level":3},{"date":"2025-12-16","count":2,"level":1},{"date":"2025-12-17","count":0,"level":0},{"date":"2025-12-18","count":0,"level":0},{"date":"2025-12-19","count":2,"level":1},{"date":"2025-12-20","count":0,"level":0},{"date":"2025-12-21","count":0,"level":0},{"date":"2025-12-22","count":5,"level":3},{"date":"2025-12-23","count":0,"level":0},{"date":"2025-12-24","count":0,"level":0},{"date":"2025-12-25","count":2,"level":1},{"date":"2025-12-26","count":0,"level":0},{"date":"2025-12-27","count":0,"level":0},{"date":"2025-12-28","count":2,"level":1},{"date":"2025-12-29","count":5,"level":3},{"date":"2025-12-30","count":0,"level":0},{"date":"2025-12-31","count":12,"level":4},{"date":"2026-01-01","count":0,"level":0},{"date":"2026-01-02","count":0,"level":0},{"date":"2026-01-03","count":2,"level":1},{"date":"2026-01-04","count":0,"level":0},{"date":"2026-01-05","count":5,"level":3},{"date":"2026-01-06","count":2,"level":1},{"date":"2026-01-07","count":0,"level":0},{"date":"2026-01-08","count":0,"level":0},{"date":"2026-01-09","count":2,"level":1},{"date":"2026-01-10","count":0,"level":0},{"date":"2026-01-11","count":0,"level":0},{"date":"2026-01-12","count":5,"level":3},{"date":"2026-01-13","count":0,"level":0},{"date":"2026-01-14","count":0,"level":0},{"date":"2026-01-15","count":2,"level":1},{"date":"2026-01-16","count":0,"level":0},{"date":"2026-01-17","count":0,"level":0},{"date":"2026-01-18","count":2,"level":1},{"date":"2026-01-19","count":12,"level":4},{"date":"2026-01-20","count":0,"level":0},{"date":"2026-01-21","count":2,"level":1},{"date":"2026-01-22","count":0,"level":0},{"date":"2026-01-23","count":0,"level":0},{"date":"2026-01-24","count":2,"level":1},{"date":"2026-01-25","count":0,"level":0},{"date":"2026-01-26","count":5,"level":3},{"date":"2026-01-27","count":2,"level":1},{"date":"2026-01-28","count":0,"level":0},{"date":"2026-01-29","count":0,"level":0},{"date":"2026-01-30","count":2,"level":1},{"date":"2026-01-31","count":0,"level":0},{"date":"2026-02-01","count":0,"level":0},{"date":"2026-02-02","count":5,"level":3},{"date":"2026-02-03","count":0,"level":0},{"date":"2026-02-04","count":0,"level":0},{"date":"2026-02-05","count":2,"level":1},{"date":"2026-02-06","count":0,"level":0},{"date":"2026-02-07","count":12,"level":4},{"date":"2026-02-08","count":2,"level":1},{"date":"2026-02-09","count":5,"level":3},{"date":"2026-02-10","count":0,"level":0},{"date":"2026-02-11","count":2,"level":1},{"date":"2026-02-12","count":0,"level":0},{"date":"2026-02-13","count":0,"level":0},{"date":"2026-02-14","count":2,"level":1},{"date":"2026-02-15","count":0,"level":0},{"date":"2026-02-16","count":5,"level":3},{"date":"2026-02-17","count":2,"level":1},{"date":"2026-02-18","count":0,"level":0},{"date":"2026-02-19","count":0,"level":0},{"date":"2026-02-20","count":2,"level":1},{"date":"2026-02-21","count":0,"level":0},{"date":"2026-02-22","count":0,"level":0},{"date":"2026-02-23","count":5,"level":3},{"date":"2026-02-24","count":0,"level":0},{"date":"2026-02-25","count":0,"level":0},{"date":"2026-02-26","count":12,"level":4},{"date":"2026-02-27","count":0,"level":0},{"date":"2026-02-28","count":0,"level":0},{"date":"2026-03-01","count":2,"level":1},{"date":"2026-03-02","count":5,"level":3},{"date":"2026-03-03","count":0,"level":0},{"date":"2026-03-04","count":2,"level":1},{"date":"2026-03-05","count":0,"level":0},{"date":"2026-03-06","count":0,"level":0},{"date":"2026-03-07","count":2,"level":1},{"date":"2026-03-08","count":0,"level":0},{"date":"2026-03-09","count":5,"level":3},{"date":"2026-03-10","count":2,"level":1},{"date":"2026-03-11","count":0,"level":0},{"date":"2026-03-12","count":0,"level":0},{"date":"2026-03-13","count":2,"level":1},{"date":"2026-03-14","count":0,"level":0},{"date":"2026-03-15","count":0,"level":0},{"date":"2026-03-16","count":5,"level":3},{"date":"2026-03-17","count":12,"level":4},{"date":"2026-03-18","count":0,"level":0},{"date":"2026-03-19","count":2,"level":1},{"date":"2026-03-20","count":0,"level":0},{"date":"2026-03-21","count":0,"level":0},{"date":"2026-03-22","count":2,"level":1},{"date":"2026-03-23","count":5,"level":3},{"date":"2026-03-24","count":0,"level":0},{"date":"2026-03-25","count":2,"level":1},{"date":"2026-03-26","count":0,"level":0},{"date":"2026-03-27","count":0,"level":0},{"date":"2026-03-28","count":2,"level":1},{"date":"2026-03-29","count":0,"level":0},{"date":"2026-03-30","count":5,"level":3},{"date":"2026-03-31","count":2,"level":1},{"date":"2026-04-01","count":0,"level":0},{"date":"2026-04-02","count":0,"level":0},{"date":"2026-04-03","count":2,"level":1},{"date":"2026-04-04","count":0,"level":0},{"date":"2026-04-05","count":12,"level":4},{"date":"2026-04-06","count":5,"level":3},{"date":"2026-04-07","count":0,"level":0},{"date":"2026-04-08","count":0,"level":0},{"date":"2026-04-09","count":2,"level":1},{"date":"2026-04-10","count":0,"level":0},{"date":"2026-04-11","count":0,"level":0},{"date":"2026-04-12","count":2,"level":1},{"date":"2026-04-13","count":5,"level":3},{"date":"2026-04-14","count":0,"level":0},{"date":"2026-04-15","count":2,"level":1},{"date":"2026-04-16","count":0,"level":0},{"date":"2026-04-17","count":0,"level":0},{"date":"2026-04-18","count":2,"level":1},{"date":"2026-04-19","count":0,"level":0},{"date":"2026-04-20","count":5,"level":3},{"date":"2026-04-21","count":2,"level":1},{"date":"2026-04-22","count":0,"level":0},{"date":"2026-04-23","count":0,"level":0},{"date":"2026-04-24","count":12,"level":4},{"date":"2026-04-25","count":0,"level":0},{"date":"2026-04-26","count":0,"level":0},{"date":"2026-04-27","count":5,"level":3},{"date":"2026-04-28","count":0,"level":0},{"date":"2026-04-29","count":0,"level":0},{"date":"2026-04-30","count":2,"level":1},{"date":"2026-05-01","count":0,"level":0},{"date":"2026-05-02","count":0,"level":0},{"date":"2026-05-03","count":2,"level":1},{"date":"2026-05-04","count":5,"level":3},{"date":"2026-05-05","count":0,"level":0},{"date":"2026-05-06","count":2,"level":1},{"date":"2026-05-07","count":0,"level":0},{"date":"2026-05-08","count":0,"level":0},{"date":"2026-05-09","count":2,"level":1},{"date":"2026-05-10","count":0,"level":0},{"date":"2026-05-11","count":5,"level":3},{"date":"2026-05-12","count":2,"level":1},{"date":"2026-05-13","count":12,"level":4},{"date":"2026-05-14","count":0,"level":0},{"date":"2026-05-15","count":2,"level":1},{"date":"2026-05-16","count":0,"level":0},{"date":"2026-05-17","count":0,"level":0},{"date":"2026-05-18","count":5,"level":3},{"date":"2026-05-19","count":0,"level":0},{"date":"2026-05-20","count":0,"level":0},{"date":"2026-05-21","count":2,"level":1},{"date":"2026-05-22","count":0,"level":0},{"date":"2026-05-23","count":0,"level":0},{"date":"2026-05-24","count":2,"level":1},{"date":"2026-05-25","count":5,"level":3},{"date":"2026-05-26","count":0,"level":0},{"date":"2026-05-27","count":2,"level":1},{"date":"2026-05-28","count":0,"level":0},{"date":"2026-05-29","count":0,"level":0},{"date":"2026-05-30","count":2,"level":1},{"date":"2026-05-31","count":0,"level":0},{"date":"2026-06-01","count":12,"level":4},{"date":"2026-06-02","count":2,"level":1},{"date":"2026-06-03","count":0,"level":0},{"date":"2026-06-04","count":0,"level":0},{"date":"2026-06-05","count":2,"level":1},{"date":"2026-06-06","count":0,"level":0},{"date":"2026-06-07","count":0,"level":0},{"date":"2026-06-08","count":5,"level":3},{"date":"2026-06-09","count":0,"level":0},{"date":"2026-06-10","count":0,"level":0},{"date":"2026-06-11","count":2,"level":1},{"date":"2026-06-12","count":0,"level":0},{"date":"2026-06-13","count":0,"level":0},{"date":"2026-06-14","count":2,"level":1},{"date":"2026-06-15","count":5,"level":3},{"date":"2026-06-16","count":0,"level":0},{"date":"2026-06-17","count":2,"level":1},{"date":"2026-06-18","count":0,"level":0},{"date":"2026-06-19","count":0,"level":0},{"date":"2026-06-20","count":12,"level":4},{"date":"2026-06-21","count":0,"level":0},{"date":"2026-06-22","count":5,"level":3},{"date":"2026-06-23","count":2,"level":1},{"date":"2026-06-24","count":0,"level":0},{"date":"2026-06-25","count":0,"level":0},{"date":"2026-06-26","count":2,"level":1},{"date":"2026-06-27","count":0,"level":0},{"date":"2026-06-28","count":0,"level":0},{"date":"2026-06-29","count":5,"level":3},{"date":"2026-06-30","count":0,"level":0},{"date":"2026-07-01","count":0,"level":0},{"date":"2026-07-02","count":2,"level":1},{"date":"2026-07-03","count":0,"level":0},{"date":"2026-07-04","count":0,"level":0},{"date":"2026-07-05","count":2,"level":1},{"date":"2026-07-06","count":5,"level":3},{"date":"2026-07-07","count":0,"level":0},{"date":"2026-07-08","count":2,"level":1},{"date":"2026-07-09","count":12,"level":4},{"date":"2026-07-10","count":0,"level":0},{"date":"2026-07-11","count":2,"level":1},{"date":"2026-07-12","count":0,"level":0},{"date":"2026-07-13","count":5,"level":3},{"date":"2026-07-14","count":2,"level":1},{"date":"2026-07-15","count":0,"level":0},{"date":"2026-07-16","count":0,"level":0},{"date":"2026-07-17","count":2,"level":1},{"date":"2026-07-18","count":0,"level":0},{"date":"2026-07-19","count":0,"level":0},{"date":"2026-07-20","count":5,"level":3},{"date":"2026-07-21","count":0,"level":0},{"date":"2026-07-22","count":0,"level":0},{"date":"2026-07-23","count":2,"level":1},{"date":"2026-07-24","count":0,"level":0},{"date":"2026-07-25","count":0,"level":0},{"date":"2026-07-26","count":2,"level":1},{"date":"2026-07-27","count":5,"level":3},{"date":"2026-07-28","count":12,"level":4},{"date":"2026-07-29","count":2,"level":1},{"date":"2026-07-30","count":0,"level":0},{"date":"2026-07-31","count":0,"level":0},{"date":"2026-08-01","count":2,"level":1},{"date":"2026-08-02","count":0,"level":0},{"date":"2026-08-03","count":5,"level":3},{"date":"2026-08-04","count":2,"level":1},{"date":"2026-08-05","count":0,"level":0},{"date":"2026-08-06","count":0,"level":0},{"date":"2026-08-07","count":2,"level":1},{"date":"2026-08-08","count":0,"level":0},{"date":"2026-08-09","count":0,"level":0},{"date":"2026-08-10","count":5,"level":3},{"date":"2026-08-11","count":0,"level":0},{"date":"2026-08-12","count":0,"level":0},{"date":"2026-08-13","count":2,"level":1},{"date":"2026-08-14","count":0,"level":0},{"date":"2026-08-15","count":0,"level":0},{"date":"2026-08-16","count":12,"level":4},{"date":"2026-08-17","count":5,"level":3},{"date":"2026-08-18","count":0,"level":0},{"date":"2026-08-19","count":2,"level":1},{"date":"2026-08-20","count":0,"level":0},{"date":"2026-08-21","count":0,"level":0},{"date":"2026-08-22","count":2,"level":1},{"date":"2026-08-23","count":0,"level":0},{"date":"2026-08-24","count":5,"level":3},{"date":"2026-08-25","count":2,"level":1},{"date":"2026-08-26","count":0,"level":0},{"date":"2026-08-27","count":0,"level":0},{"date":"2026-08-28","count":2,"level":1},{"date":"2026-08-29","count":0,"level":0},{"date":"2026-08-30","count":0,"level":0},{"date":"2026-08-31","count":5,"level":3},{"date":"2026-09-01","count":0,"level":0},{"date":"2026-09-02","count":0,"level":0},{"date":"2026-09-03","count":2,"level":1},{"date":"2026-09-04","count":12,"level":4},{"date":"2026-09-05","count":0,"level":0},{"date":"2026-09-06","count":2,"level":1},{"date":"2026-09-07","count":5,"level":3}],"timeZone":"America/Toronto","nextRefreshAt":"2026-09-08T04:00:00.000Z"}}}}}},"405":{"description":"The API route exists, but the requested HTTP method is not supported.","headers":{"Allow":{"description":"Methods supported by this route.","schema":{"type":"string","examples":["GET, HEAD"]},"example":"GET, HEAD"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"},"examples":{"methodNotAllowed":{"summary":"Unsupported method","value":{"type":"https://www.kevincanlas.com/developers#method-not-allowed","title":"Method not allowed","status":405,"detail":"This public API route supports GET and HEAD requests.","code":"method_not_allowed","resolution":"Use GET to read this resource."}}}}}},"429":{"description":"The request exceeded the shared quota while distributed enforcement was active. Rate-limit headers are omitted when shared enforcement is inactive or unavailable.","headers":{"Retry-After":{"description":"Retry delay in seconds. This header is emitted only when shared quota enforcement succeeds and rejects the request.","schema":{"type":"integer","minimum":0,"description":"Number of seconds the client should wait before retrying.","examples":[60]},"example":60},"RateLimit":{"description":"Current service limit as a Structured Field List of Service Limit Items defined by draft-ietf-httpapi-ratelimit-headers-11. This header is emitted only when shared quota enforcement succeeds; it is absent when enforcement is inactive or unavailable.","schema":{"type":"string","description":"For example, \"public-api\";r=0;t=60, with configured values varying by deployment.","examples":["\"public-api\";r=0;t=60"]},"example":"\"public-api\";r=0;t=60"},"RateLimit-Policy":{"description":"Quota policy as a Structured Field List of Quota Policy Items defined by draft-ietf-httpapi-ratelimit-headers-11. This header is emitted only when shared quota enforcement succeeds; it is absent when enforcement is inactive or unavailable.","schema":{"type":"string","description":"For example, \"public-api\";q=60;w=60, with configured values varying by deployment.","examples":["\"public-api\";q=60;w=60"]},"example":"\"public-api\";q=60;w=60"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"},"examples":{"rateLimitExceeded":{"summary":"Shared quota exceeded","value":{"type":"https://www.kevincanlas.com/developers#rate-limit-exceeded","title":"Rate limit exceeded","status":429,"detail":"The shared request quota is temporarily exhausted.","code":"rate_limit_exceeded","resolution":"Wait for the Retry-After interval before retrying this resource."}}}}}},"502":{"description":"The external data source did not provide a usable response.","headers":{"RateLimit":{"description":"Current service limit as a Structured Field List of Service Limit Items defined by draft-ietf-httpapi-ratelimit-headers-11. This header is emitted only when shared quota enforcement succeeds; it is absent when enforcement is inactive or unavailable.","schema":{"type":"string","description":"For example, \"public-api\";r=0;t=60, with configured values varying by deployment.","examples":["\"public-api\";r=0;t=60"]},"example":"\"public-api\";r=0;t=60"},"RateLimit-Policy":{"description":"Quota policy as a Structured Field List of Quota Policy Items defined by draft-ietf-httpapi-ratelimit-headers-11. This header is emitted only when shared quota enforcement succeeds; it is absent when enforcement is inactive or unavailable.","schema":{"type":"string","description":"For example, \"public-api\";q=60;w=60, with configured values varying by deployment.","examples":["\"public-api\";q=60;w=60"]},"example":"\"public-api\";q=60;w=60"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"},"examples":{"upstreamUnavailable":{"summary":"External data source unavailable","value":{"type":"https://www.kevincanlas.com/developers#upstream-unavailable","title":"Upstream data unavailable","status":502,"detail":"The external data source did not return usable data.","code":"upstream_unavailable","resolution":"Retry later; the external data source may be temporarily unavailable.","error":"Market data is unavailable"}}}}}}}}}},"components":{"schemas":{"MarketPoint":{"type":"object","title":"Market point","description":"One hourly historical close or current ticker point, expressed as Unix seconds and USD.","required":["time","value"],"additionalProperties":false,"properties":{"time":{"type":"integer","description":"Unix timestamp in seconds.","examples":[1788771600]},"value":{"type":"number","description":"MON value in USD at this timestamp.","examples":[0.04567]}}},"MarketData":{"type":"object","title":"MON market data","description":"The fixed MON-USD, USD-denominated market preview returned from Coinbase data.","required":["product","currency","source","windowSeconds","points","value","changePercent","low","high","asOf"],"additionalProperties":false,"properties":{"product":{"type":"string","const":"MON-USD","description":"Fixed Coinbase Exchange product identifier."},"currency":{"type":"string","const":"USD","description":"Fixed quote currency."},"source":{"type":"string","const":"Coinbase","description":"Fixed public data source."},"windowSeconds":{"type":"integer","const":604800,"description":"Fixed seven-day window length in seconds."},"points":{"type":"array","minItems":2,"description":"Chronologically ordered hourly candle closes for the window, followed by the current ticker point when it is newer.","items":{"$ref":"#/components/schemas/MarketPoint"}},"value":{"type":"number","description":"Latest MON value in USD.","examples":[0.04567]},"changePercent":{"type":"number","description":"Percentage change from the first historical point in the seven-day window.","examples":[10.85]},"low":{"type":"number","description":"Lowest observed value across the returned window and current ticker.","examples":[0.0381]},"high":{"type":"number","description":"Highest observed value across the returned window and current ticker.","examples":[0.0462]},"asOf":{"type":"string","format":"date-time","description":"ISO 8601 timestamp supplied by Coinbase for the latest ticker value.","examples":["2026-09-07T17:00:00.000Z"]}}},"GitHubContributionDay":{"type":"object","title":"GitHub contribution day","description":"One daily entry from GitHub's public contribution calendar.","required":["date","count","level"],"additionalProperties":false,"properties":{"date":{"type":"string","format":"date","description":"Calendar date in ISO 8601 date format.","examples":["2026-09-07"]},"count":{"type":"integer","minimum":0,"description":"Number of public contributions recorded for the day.","examples":[5]},"level":{"type":"integer","minimum":0,"maximum":4,"description":"GitHub's contribution intensity level from 0 through 4.","examples":[3]}}},"GitHubContributionData":{"type":"object","title":"GitHub contributions","description":"The fixed kvncnls rolling-year contribution calendar in America/Toronto.","required":["username","totalContributions","startDate","endDate","days","timeZone","nextRefreshAt"],"additionalProperties":false,"properties":{"username":{"type":"string","const":"kvncnls","description":"Fixed GitHub account whose public calendar is read."},"totalContributions":{"type":"integer","minimum":0,"description":"Sum of count across all 365 returned days.","examples":[1234]},"startDate":{"type":"string","format":"date","description":"First date in the rolling 365-day window, inclusive.","examples":["2025-09-08"]},"endDate":{"type":"string","format":"date","description":"Last date in the rolling 365-day window, inclusive.","examples":["2026-09-07"]},"days":{"type":"array","minItems":365,"maxItems":365,"description":"Exactly 365 daily entries from startDate through endDate, inclusive.","items":{"$ref":"#/components/schemas/GitHubContributionDay"}},"timeZone":{"type":"string","const":"America/Toronto","description":"Fixed time zone used to determine the rolling window and refresh boundary."},"nextRefreshAt":{"type":"string","format":"date-time","description":"Next refresh boundary at midnight in America/Toronto, expressed as an ISO timestamp.","examples":["2026-09-08T04:00:00.000Z"]}}},"ProblemDetails":{"type":"object","title":"Problem details","description":"A machine-readable error following RFC 9457 fields, with a stable application code and a recovery hint.","required":["type","title","status","detail","code","resolution"],"additionalProperties":false,"properties":{"type":{"type":"string","format":"uri-reference","description":"Identifier for the class of problem.","examples":["https://www.kevincanlas.com/developers#upstream-unavailable"]},"title":{"type":"string","description":"Short, human-readable summary of the problem type.","examples":["Upstream data unavailable"]},"status":{"type":"integer","minimum":400,"maximum":599,"description":"HTTP status code for this occurrence of the problem.","examples":[502]},"detail":{"type":"string","description":"Human-readable explanation specific to this request.","examples":["Coinbase did not return usable MON market data."]},"code":{"type":"string","enum":["upstream_unavailable","api_route_not_found","method_not_allowed","rate_limit_exceeded"],"description":"Stable code that callers can branch on.","examples":["upstream_unavailable"]},"resolution":{"type":"string","description":"Action a caller can take to recover or retry safely.","examples":["Retry later; the external data source may be temporarily unavailable."]},"error":{"type":"string","description":"Optional legacy error message retained for existing callers.","examples":["MON market data is unavailable"]}}}},"responses":{"UpstreamUnavailable":{"description":"The external data source did not provide a usable response.","headers":{"RateLimit":{"description":"Current service limit as a Structured Field List of Service Limit Items defined by draft-ietf-httpapi-ratelimit-headers-11. This header is emitted only when shared quota enforcement succeeds; it is absent when enforcement is inactive or unavailable.","schema":{"type":"string","description":"For example, \"public-api\";r=0;t=60, with configured values varying by deployment.","examples":["\"public-api\";r=0;t=60"]},"example":"\"public-api\";r=0;t=60"},"RateLimit-Policy":{"description":"Quota policy as a Structured Field List of Quota Policy Items defined by draft-ietf-httpapi-ratelimit-headers-11. This header is emitted only when shared quota enforcement succeeds; it is absent when enforcement is inactive or unavailable.","schema":{"type":"string","description":"For example, \"public-api\";q=60;w=60, with configured values varying by deployment.","examples":["\"public-api\";q=60;w=60"]},"example":"\"public-api\";q=60;w=60"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"},"examples":{"upstreamUnavailable":{"summary":"External data source unavailable","value":{"type":"https://www.kevincanlas.com/developers#upstream-unavailable","title":"Upstream data unavailable","status":502,"detail":"The external data source did not return usable data.","code":"upstream_unavailable","resolution":"Retry later; the external data source may be temporarily unavailable.","error":"Market data is unavailable"}}}}}},"ApiRouteNotFound":{"description":"The requested API route does not exist.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"},"examples":{"apiRouteNotFound":{"summary":"Unknown API route","value":{"type":"https://www.kevincanlas.com/developers#api-route-not-found","title":"API route not found","status":404,"detail":"No public API route matches the requested path.","code":"api_route_not_found","resolution":"Check the API path in the published OpenAPI document."}}}}}},"MethodNotAllowed":{"description":"The API route exists, but the requested HTTP method is not supported.","headers":{"Allow":{"description":"Methods supported by this route.","schema":{"type":"string","examples":["GET, HEAD"]},"example":"GET, HEAD"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"},"examples":{"methodNotAllowed":{"summary":"Unsupported method","value":{"type":"https://www.kevincanlas.com/developers#method-not-allowed","title":"Method not allowed","status":405,"detail":"This public API route supports GET and HEAD requests.","code":"method_not_allowed","resolution":"Use GET to read this resource."}}}}}},"RateLimitExceeded":{"description":"The request exceeded the shared quota while distributed enforcement was active. Rate-limit headers are omitted when shared enforcement is inactive or unavailable.","headers":{"Retry-After":{"description":"Retry delay in seconds. This header is emitted only when shared quota enforcement succeeds and rejects the request.","schema":{"type":"integer","minimum":0,"description":"Number of seconds the client should wait before retrying.","examples":[60]},"example":60},"RateLimit":{"description":"Current service limit as a Structured Field List of Service Limit Items defined by draft-ietf-httpapi-ratelimit-headers-11. This header is emitted only when shared quota enforcement succeeds; it is absent when enforcement is inactive or unavailable.","schema":{"type":"string","description":"For example, \"public-api\";r=0;t=60, with configured values varying by deployment.","examples":["\"public-api\";r=0;t=60"]},"example":"\"public-api\";r=0;t=60"},"RateLimit-Policy":{"description":"Quota policy as a Structured Field List of Quota Policy Items defined by draft-ietf-httpapi-ratelimit-headers-11. This header is emitted only when shared quota enforcement succeeds; it is absent when enforcement is inactive or unavailable.","schema":{"type":"string","description":"For example, \"public-api\";q=60;w=60, with configured values varying by deployment.","examples":["\"public-api\";q=60;w=60"]},"example":"\"public-api\";q=60;w=60"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"},"examples":{"rateLimitExceeded":{"summary":"Shared quota exceeded","value":{"type":"https://www.kevincanlas.com/developers#rate-limit-exceeded","title":"Rate limit exceeded","status":429,"detail":"The shared request quota is temporarily exhausted.","code":"rate_limit_exceeded","resolution":"Wait for the Retry-After interval before retrying this resource."}}}}}}}}}