{"openapi":"3.1.0","info":{"title":"CRN0 Cron Timezone API","version":"1.0.0","description":"Convert, explain and schedule cron expressions across timezones. Free, no auth. Also available as an MCP server at /mcp."},"servers":[{"url":"https://crn0.com"}],"externalDocs":{"url":"https://crn0.com/llms-full.txt"},"paths":{"/api/convert":{"get":{"operationId":"convert_cron","summary":"Convert a cron expression between timezones","description":"Convert a cron expression from one timezone to another so it fires at the same real-world instants. Returns the converted cron line(s), plain-English descriptions, offsets, warnings (day shifts, multi-line results, DST) and the next run times in both zones.","parameters":[{"name":"cron","in":"query","required":true,"description":"Standard 5-field cron, e.g. \"0 9 * * 1-5\", or a macro like \"@daily\".","schema":{"type":"string"}},{"name":"from","in":"query","required":false,"description":"Timezone the schedule is written in (IANA id, abbreviation, offset or city). Default \"UTC\".","schema":{"type":"string"}},{"name":"to","in":"query","required":true,"description":"Timezone of the machine/scheduler that will run it, e.g. \"UTC\" for most cloud schedulers.","schema":{"type":"string"}},{"name":"at","in":"query","required":false,"description":"ISO 8601 date used to evaluate DST offsets. Defaults to now.","schema":{"type":"string"}},{"name":"count","in":"query","required":false,"description":"How many upcoming runs to list (default 3).","schema":{"type":"integer"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"convert_cron_post","summary":"Convert a cron expression between timezones","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"cron":{"type":"string","description":"Standard 5-field cron, e.g. \"0 9 * * 1-5\", or a macro like \"@daily\"."},"from":{"type":"string","description":"Timezone the schedule is written in (IANA id, abbreviation, offset or city). Default \"UTC\"."},"to":{"type":"string","description":"Timezone of the machine/scheduler that will run it, e.g. \"UTC\" for most cloud schedulers."},"at":{"type":"string","description":"ISO 8601 date used to evaluate DST offsets. Defaults to now."},"count":{"type":"integer","minimum":1,"maximum":50,"description":"How many upcoming runs to list (default 3)."}},"required":["cron","to"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/describe":{"get":{"operationId":"describe_cron","summary":"Explain a cron expression","description":"Validate a cron expression and explain it in plain English, with the expanded values of each field.","parameters":[{"name":"cron","in":"query","required":true,"description":"Standard 5-field cron, e.g. \"0 9 * * 1-5\", or a macro like \"@daily\".","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"describe_cron_post","summary":"Explain a cron expression","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"cron":{"type":"string","description":"Standard 5-field cron, e.g. \"0 9 * * 1-5\", or a macro like \"@daily\"."}},"required":["cron"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/next-runs":{"get":{"operationId":"next_cron_runs","summary":"List upcoming run times","description":"List the next run times of a cron expression evaluated in a given timezone (DST-aware), in UTC and local wall time.","parameters":[{"name":"cron","in":"query","required":true,"description":"Standard 5-field cron, e.g. \"0 9 * * 1-5\", or a macro like \"@daily\".","schema":{"type":"string"}},{"name":"timezone","in":"query","required":false,"description":"Timezone the cron is evaluated in. Default \"UTC\".","schema":{"type":"string"}},{"name":"count","in":"query","required":false,"description":"Number of runs (default 5).","schema":{"type":"integer"}},{"name":"from","in":"query","required":false,"description":"ISO 8601 start instant. Defaults to now.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"next_cron_runs_post","summary":"List upcoming run times","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"cron":{"type":"string","description":"Standard 5-field cron, e.g. \"0 9 * * 1-5\", or a macro like \"@daily\"."},"timezone":{"type":"string","description":"Timezone the cron is evaluated in. Default \"UTC\"."},"count":{"type":"integer","minimum":1,"maximum":50,"description":"Number of runs (default 5)."},"from":{"type":"string","description":"ISO 8601 start instant. Defaults to now."}},"required":["cron"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/timezones":{"get":{"operationId":"search_timezones","summary":"Search timezones by city, abbreviation or IANA id","description":"Look up IANA timezone ids and current UTC offsets by city, country, abbreviation or IANA name.","parameters":[{"name":"query","in":"query","required":true,"description":"e.g. \"Melbourne\", \"IST\", \"Europe/\"","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max results (default 10).","schema":{"type":"integer"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"search_timezones_post","summary":"Search timezones by city, abbreviation or IANA id","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string","description":"e.g. \"Melbourne\", \"IST\", \"Europe/\""},"limit":{"type":"integer","minimum":1,"maximum":50,"description":"Max results (default 10)."}},"required":["query"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}