{"openapi":"3.1.0","info":{"title":"ethwatch Open API","version":"1.0.0","description":"Read-only Ethereum network figures with explicit provenance."},"servers":[{"url":"https://api.ethwatch.org"}],"paths":{"/":{"get":{"summary":"Redirect to API documentation","responses":{"302":{"description":"Documentation."}}}},"/docs":{"get":{"summary":"Read the API documentation","responses":{"200":{"description":"Static HTML documentation."}}}},"/v1/health":{"get":{"summary":"Read snapshot freshness","responses":{"200":{"description":"Healthy snapshot."},"503":{"description":"Snapshot unavailable."}}}},"/openapi.json":{"get":{"summary":"Read this OpenAPI document","responses":{"200":{"description":"OpenAPI 3.1 document."}}}},"/v1/keys":{"post":{"summary":"Request an email verification link","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email"}}}}}},"responses":{"202":{"description":"The same response is returned for fresh and registered addresses."},"400":{"description":"Invalid request."},"429":{"description":"Registration IP rate limit exceeded."}}}},"/v1/keys/verify":{"get":{"summary":"Consume a verification token and display a new key once","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"One-time API key page."},"400":{"description":"Invalid, expired, or used token."}}}},"/v1/snapshot":{"get":{"summary":"Read the complete snapshot","security":[{"bearerAuth":[]},{"queryKey":[]}],"responses":{"200":{"description":"Snapshot data with rate-limit and snapshot-generation headers.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}},"X-Snapshot-Generated":{"schema":{"type":"string","format":"date-time"}}}},"401":{"description":"Missing or unknown API key."},"429":{"description":"Per-key or global rate limit exceeded."},"503":{"description":"The current snapshot is unavailable."}}}},"/v1/sources":{"get":{"summary":"Read the generated source registry","security":[{"bearerAuth":[]},{"queryKey":[]}],"responses":{"200":{"description":"Snapshot data with rate-limit and snapshot-generation headers.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}},"X-Snapshot-Generated":{"schema":{"type":"string","format":"date-time"}}}},"401":{"description":"Missing or unknown API key."},"429":{"description":"Per-key or global rate limit exceeded."},"503":{"description":"The current snapshot is unavailable."}}}},"/v1/price":{"get":{"summary":"Read price figures and provenance","security":[{"bearerAuth":[]},{"queryKey":[]}],"responses":{"200":{"description":"Snapshot data with rate-limit and snapshot-generation headers.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}},"X-Snapshot-Generated":{"schema":{"type":"string","format":"date-time"}}}},"401":{"description":"Missing or unknown API key."},"429":{"description":"Per-key or global rate limit exceeded."},"503":{"description":"The current snapshot is unavailable."}}}},"/v1/supply":{"get":{"summary":"Read supply figures and provenance","security":[{"bearerAuth":[]},{"queryKey":[]}],"responses":{"200":{"description":"Snapshot data with rate-limit and snapshot-generation headers.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}},"X-Snapshot-Generated":{"schema":{"type":"string","format":"date-time"}}}},"401":{"description":"Missing or unknown API key."},"429":{"description":"Per-key or global rate limit exceeded."},"503":{"description":"The current snapshot is unavailable."}}}},"/v1/issuance":{"get":{"summary":"Read issuance figures and provenance","security":[{"bearerAuth":[]},{"queryKey":[]}],"responses":{"200":{"description":"Snapshot data with rate-limit and snapshot-generation headers.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}},"X-Snapshot-Generated":{"schema":{"type":"string","format":"date-time"}}}},"401":{"description":"Missing or unknown API key."},"429":{"description":"Per-key or global rate limit exceeded."},"503":{"description":"The current snapshot is unavailable."}}}},"/v1/gas":{"get":{"summary":"Read gas figures and provenance","security":[{"bearerAuth":[]},{"queryKey":[]}],"responses":{"200":{"description":"Snapshot data with rate-limit and snapshot-generation headers.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}},"X-Snapshot-Generated":{"schema":{"type":"string","format":"date-time"}}}},"401":{"description":"Missing or unknown API key."},"429":{"description":"Per-key or global rate limit exceeded."},"503":{"description":"The current snapshot is unavailable."}}}},"/v1/staking":{"get":{"summary":"Read staking figures and provenance","security":[{"bearerAuth":[]},{"queryKey":[]}],"responses":{"200":{"description":"Snapshot data with rate-limit and snapshot-generation headers.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}},"X-Snapshot-Generated":{"schema":{"type":"string","format":"date-time"}}}},"401":{"description":"Missing or unknown API key."},"429":{"description":"Per-key or global rate limit exceeded."},"503":{"description":"The current snapshot is unavailable."}}}},"/v1/l2":{"get":{"summary":"Read layer-2 figures and provenance","security":[{"bearerAuth":[]},{"queryKey":[]}],"responses":{"200":{"description":"Snapshot data with rate-limit and snapshot-generation headers.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}},"X-Snapshot-Generated":{"schema":{"type":"string","format":"date-time"}}}},"401":{"description":"Missing or unknown API key."},"429":{"description":"Per-key or global rate limit exceeded."},"503":{"description":"The current snapshot is unavailable."}}}},"/v1/holdings":{"get":{"summary":"Read holdings figures and provenance","security":[{"bearerAuth":[]},{"queryKey":[]}],"responses":{"200":{"description":"Snapshot data with rate-limit and snapshot-generation headers.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}},"X-Snapshot-Generated":{"schema":{"type":"string","format":"date-time"}}}},"401":{"description":"Missing or unknown API key."},"429":{"description":"Per-key or global rate limit exceeded."},"503":{"description":"The current snapshot is unavailable."}}}},"/v1/network":{"get":{"summary":"Read network figures and provenance","security":[{"bearerAuth":[]},{"queryKey":[]}],"responses":{"200":{"description":"Snapshot data with rate-limit and snapshot-generation headers.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}},"X-Snapshot-Generated":{"schema":{"type":"string","format":"date-time"}}}},"401":{"description":"Missing or unknown API key."},"429":{"description":"Per-key or global rate limit exceeded."},"503":{"description":"The current snapshot is unavailable."}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"},"queryKey":{"type":"apiKey","in":"query","name":"key"}}}}