{"openapi":"3.1.0","info":{"title":"Exchanger API","version":"1.0.0","description":"Cached USD-based exchange rates from Open Exchange Rates. Rates refresh lazily when stale."},"servers":[{"url":"https://exchanger.haproco.com"}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"API key issued from the admin dashboard. Bearer auth is also accepted."}},"schemas":{"RateSnapshot":{"type":"object","required":["base","timestamp","fetched_at","rates"],"properties":{"base":{"type":"string","example":"USD"},"timestamp":{"type":"integer","description":"Unix timestamp from Open Exchange Rates","example":1710288000},"fetched_at":{"type":"string","format":"date-time","example":"2026-07-12T10:00:00.000Z"},"rates":{"type":"object","additionalProperties":{"type":"number"},"example":{"EUR":0.92,"GBP":0.79,"JPY":157.2}}}},"ConvertResponse":{"type":"object","required":["from","to","amount","rate","result","fetched_at"],"properties":{"from":{"type":"string","example":"USD"},"to":{"type":"string","example":"EUR"},"amount":{"type":"number","example":100},"rate":{"type":"number","example":0.92},"result":{"type":"number","example":92},"fetched_at":{"type":"string","format":"date-time"}}},"ErrorResponse":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}},"paths":{"/api/rates/latest":{"get":{"summary":"Get latest exchange rates","description":"Returns the latest stored USD-based rates. Refreshes from Open Exchange Rates if data is older than the configured interval.","security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Latest rate snapshot","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateSnapshot"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/rates/convert":{"get":{"summary":"Convert an amount between currencies","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"from","in":"query","required":true,"schema":{"type":"string","example":"USD"}},{"name":"to","in":"query","required":true,"schema":{"type":"string","example":"EUR"}},{"name":"amount","in":"query","required":true,"schema":{"type":"number","example":100}}],"responses":{"200":{"description":"Conversion result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConvertResponse"}}}},"400":{"description":"Invalid parameters or unsupported currency","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}}}