{"openapi":"3.1.0","info":{"title":"GetItDone free tools API","version":"1.0.0","description":"No-key utilities from nowgetitdone.com/tools. No authentication; CORS is open; JSON by default, Markdown with Accept: text/markdown; errors are RFC 9457 problem+json. Guide: https://nowgetitdone.com/docs/free-tools-api"},"servers":[{"url":"https://nowgetitdone.com"}],"security":[],"tags":[{"name":"Free tools","description":"Free, no-key utilities."}],"paths":{"/api/tools/parse-date":{"get":{"operationId":"parseDate","tags":["Free tools"],"security":[],"summary":"Natural language to due date and RRULE","description":"Type a task the way you would say it. The parser finds the date (\"tomorrow\", \"next friday\", \"sep 14\", \"in 3 days\"), a start date (\"start monday\"), a repeat (\"every weekday\", \"every other tuesday\", \"the 1st of every month\") and a time of day, then gives you an ISO date, an RRULE and the task title with those words removed. It is the same parser the GetItDone task box runs as you type, and it never invents a date the text does not state.","parameters":[{"name":"text","in":"query","required":true,"description":"The task text, e.g. \"review the report every friday\".","schema":{"type":"string","maxLength":500}},{"name":"tz","in":"query","required":false,"description":"IANA timezone \"today\" is read in, e.g. America/Toronto. Defaults to UTC.","schema":{"type":"string","example":"America/Toronto"}}],"responses":{"200":{"description":"The parsed task.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParseDateResult"}},"text/markdown":{"schema":{"type":"string"}}}},"400":{"description":"Missing or unreadable input.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Over the per-address budget (30 a minute, 300 a day).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"description":"Seconds until the window rolls over.","schema":{"type":"integer"}}}}}}},"/api/tools/rrule-explainer":{"get":{"operationId":"explainRRule","tags":["Free tools"],"security":[],"summary":"RRULE to plain English and the next 10 dates","description":"Paste a recurrence rule such as FREQ=WEEKLY;INTERVAL=2;BYDAY=TU and get it in plain English with the next 10 dates. A DTSTART line sets the first day and its TZID the timezone; parts it cannot schedule, such as BYSETPOS or YEARLY, are refused by name. The same explainer runs at /tools/rrule-builder?mode=explain.","parameters":[{"name":"rrule","in":"query","required":true,"description":"An RRULE value, optionally prefixed with RRULE: and preceded by a DTSTART line.","schema":{"type":"string","maxLength":1000}},{"name":"tz","in":"query","required":false,"description":"IANA timezone \"today\" is read in, e.g. America/Toronto. Defaults to UTC.","schema":{"type":"string","example":"America/Toronto"}}],"responses":{"200":{"description":"The rule explained.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExplainRRuleResult"}},"text/markdown":{"schema":{"type":"string"}}}},"400":{"description":"Missing input, or a rule part GetItDone cannot schedule (named in detail).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Over the per-address budget (30 a minute, 300 a day).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"description":"Seconds until the window rolls over.","schema":{"type":"integer"}}}}}}}},"components":{"schemas":{"Problem":{"type":"object","required":["type","title","status","detail"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"}}},"RecurrenceSummary":{"type":"object","required":["rrule","description","startDate","timezone","nextDates","notes"],"properties":{"rrule":{"type":"string","description":"RFC 5545 RRULE value.","example":"FREQ=WEEKLY;BYDAY=FR"},"description":{"type":"string","description":"The rule in plain English.","example":"Every week on Fri"},"startDate":{"type":"string","format":"date","description":"A calendar day, YYYY-MM-DD."},"timezone":{"type":"string"},"nextDates":{"type":"array","items":{"type":"string","format":"date","description":"A calendar day, YYYY-MM-DD."},"description":"The next days the rule falls on; empty for an after-completion rule."},"notes":{"type":"array","items":{"type":"string"},"description":"Where GetItDone and a strict RFC 5545 reading part ways for this rule."}}},"ParseDateResult":{"type":"object","required":["input","tz","today","strippedTitle","dueDate","startDate","rrule","recurrence","timeOfDay","priority","projects","tokens","explanation"],"properties":{"input":{"type":"string"},"tz":{"type":"string"},"today":{"type":"string","format":"date","description":"A calendar day, YYYY-MM-DD."},"strippedTitle":{"type":"string","description":"The text with every recognised phrase removed."},"dueDate":{"type":["string","null"],"format":"date","description":"A calendar day, YYYY-MM-DD."},"startDate":{"type":["string","null"],"format":"date","description":"A calendar day, YYYY-MM-DD."},"rrule":{"type":["string","null"]},"recurrence":{"oneOf":[{"$ref":"#/components/schemas/RecurrenceSummary"},{"type":"null"}]},"timeOfDay":{"description":"A clock time that was read but is not stored: GetItDone schedules whole days.","oneOf":[{"type":"object","required":["text","label","saved"],"properties":{"text":{"type":"string"},"label":{"type":"string"},"saved":{"const":false}}},{"type":"null"}]},"priority":{"type":["string","null"],"description":"The task priority a marker such as p1 or !high named."},"projects":{"type":"array","items":{"type":"string"}},"tokens":{"type":"array","items":{"type":"object","required":["kind","text","label"],"properties":{"kind":{"type":"string"},"text":{"type":"string"},"label":{"type":"string"}}}},"explanation":{"type":"string"}}},"ExplainRRuleResult":{"type":"object","required":["input","droppedTimeOfDay","rrule","description","startDate","timezone","nextDates","notes"],"properties":{"input":{"type":"string"},"droppedTimeOfDay":{"type":"boolean"},"rrule":{"type":"string","description":"RFC 5545 RRULE value.","example":"FREQ=WEEKLY;BYDAY=FR"},"description":{"type":"string","description":"The rule in plain English.","example":"Every week on Fri"},"startDate":{"type":"string","format":"date","description":"A calendar day, YYYY-MM-DD."},"timezone":{"type":"string"},"nextDates":{"type":"array","items":{"type":"string","format":"date","description":"A calendar day, YYYY-MM-DD."},"description":"The next days the rule falls on; empty for an after-completion rule."},"notes":{"type":"array","items":{"type":"string"},"description":"Where GetItDone and a strict RFC 5545 reading part ways for this rule."}}}}}}