{"openapi":"3.1.0","info":{"title":"Timezone Truth","version":"1.0.0","summary":"Convert times between zones, and catch the ones that do not exist.","description":"Convert a time between any two IANA timezones and find out what the conversion hides: local times that do not exist because a daylight-saving jump skipped them, times that occur twice because the clock went back, zone abbreviations that mean different things in different countries, and offsets that were different on the date you actually care about.\n\n**Not for:** Does not schedule anything, and does not maintain its own timezone database — it reads the one shipped with the runtime, so historical dates before that data is reliable are reported rather than guessed. Does not parse free-form natural language dates.\n\nFree tier: 250 calls per UTC day per caller. Past that, endpoints return 402 with x402 payment requirements. An MCP server exposing the same capabilities is available at https://timezone-truth.gumballtools.com/api/mcp.","contact":{"url":"https://github.com/bwalvoord/gumball"}},"servers":[{"url":"https://timezone-truth.gumballtools.com","description":"Production"}],"externalDocs":{"url":"https://timezone-truth.gumballtools.com/llms-full.txt","description":"Full documentation for agents"},"paths":{"/api/v1/convert":{"get":{"operationId":"convertTime","summary":"Convert times between zones, and catch the ones that do not exist.","description":"Converts a wall-clock time between zones. Returns null for local times that do not exist, and both candidates for ambiguous ones.","parameters":[{"name":"time","in":"query","required":true,"description":"Wall-clock time as YYYY-MM-DD HH:MM. Also send from and to as IANA zone names.","schema":{"type":"string"}}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid input. The body names the field and how to fix it.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","fix_hint","docs"],"properties":{"code":{"type":"string","description":"Stable machine-readable error code."},"message":{"type":"string"},"fix_hint":{"type":"string","description":"What to change before retrying."},"field":{"type":"string"},"token":{"type":"string"},"examples":{"type":"array","items":{"type":"string"}},"docs":{"type":"string","format":"uri"}}}}}}}},"402":{"description":"Free quota of 250 calls per UTC day exhausted. Body is an x402 v1 payment requirement ($0.001 per call). While settlement is disabled the body carries payment_enabled: false and the call cannot be unblocked by paying — wait for quota.resetsAt.","content":{"application/json":{"schema":{"type":"object"}}}}}}}}}