{"openapi":"3.1.0","info":{"title":"AUTOMATION.md API","version":"1.1","description":"An AUTOMATION.md file, kept by each owner, that declares every unattended job an agent runs: the trigger, the ordered steps, what it may read and write, when it asks, the budget, retries, timeout, owner, status and review date. Read-only tools serve five starter files, lint the file, answer go, hold or stop right before a run, parse the file to canonical JSON, work out run times and overlaps, cost a month of runs with retries, score the exposure of a job and write a ready file. Every number comes from your request. Read-only, no key, nothing stored. Use at your own risk. automation.md is provided as is, without warranty. Information here may be inaccurate, incomplete or not current, and is not verified; figures are estimates from the numbers you send and the formulas stated. Nothing here is operations, engineering, financial, legal or other professional advice. automation.md never runs, schedules or stops anything itself. Check everything yourself before you act on it.","termsOfService":"https://automation.md/terms","license":{"name":"MIT","identifier":"MIT"}},"servers":[{"url":"https://automation.md"}],"paths":{"/automation.md":{"get":{"operationId":"getSkill","summary":"The AUTOMATION.md skill as Markdown. Add a preset or any setting to write your settings in; notes on clamped or ignored values come back in the X-Settings-Notes header.","parameters":[{"name":"preset","in":"query","required":false,"schema":{"type":"string","enum":["core","recommended","strict"]}},{"name":"approval_over","in":"query","required":false,"description":"Ask before any run that may spend more than (number). Default 25. Out-of-range values are clamped.","schema":{"type":"number","minimum":0,"maximum":1000000}},{"name":"writes_need_approval","in":"query","required":false,"description":"Writes need an approval: any (Any write), external (Sends, publishes, deploys, payments and deletions), none (None inside scope and budget). Optional; unset clears it.","schema":{"type":"string","enum":["any","external","none","unset"]}},{"name":"max_retries","in":"query","required":false,"description":"Most retries per run (retries). Default 3. Out-of-range values are clamped.","schema":{"type":"integer","minimum":0,"maximum":20}},{"name":"default_timeout_minutes","in":"query","required":false,"description":"Timeout when a job states none (minutes). Default 15. Out-of-range values are clamped.","schema":{"type":"integer","minimum":1,"maximum":1440}},{"name":"max_timeout_minutes","in":"query","required":false,"description":"Longest timeout (minutes). Optional; unset clears it. Out-of-range values are clamped.","schema":{"type":"integer","minimum":1,"maximum":1440}},{"name":"max_runs_per_day","in":"query","required":false,"description":"Most runs a day for one job (runs). Optional; unset clears it. Out-of-range values are clamped.","schema":{"type":"integer","minimum":1,"maximum":1440}},{"name":"failure_limit","in":"query","required":false,"description":"Stop a job after this many failed runs in a row (runs). Optional; unset clears it. Out-of-range values are clamped.","schema":{"type":"integer","minimum":1,"maximum":20}},{"name":"monthly_budget","in":"query","required":false,"description":"Monthly budget for every job in the file (number). Default 100. Out-of-range values are clamped.","schema":{"type":"number","minimum":0,"maximum":10000000}},{"name":"budget_alert_pct","in":"query","required":false,"description":"Warn when the file's monthly budgets reach (%). Optional; unset clears it. Out-of-range values are clamped.","schema":{"type":"integer","minimum":10,"maximum":100}},{"name":"review_interval_days","in":"query","required":false,"description":"Review every job at least every (days). Default 90. Out-of-range values are clamped.","schema":{"type":"integer","minimum":7,"maximum":365}},{"name":"quiet_start_hour","in":"query","required":false,"description":"Quiet hours start (UTC) (h). Optional; unset clears it. Out-of-range values are clamped.","schema":{"type":"integer","minimum":0,"maximum":23}},{"name":"quiet_end_hour","in":"query","required":false,"description":"Quiet hours end (UTC) (h). Optional; unset clears it. Out-of-range values are clamped.","schema":{"type":"integer","minimum":0,"maximum":23}},{"name":"strictness","in":"query","required":false,"description":"Check strictness: lenient (Lenient: missing keys are warnings), standard (Standard: missing keys are errors), strict (Strict: warnings fail the check too). Optional; unset clears it.","schema":{"type":"string","enum":["lenient","standard","strict","unset"]}}],"responses":{"200":{"description":"The skill","content":{"text/markdown":{"schema":{"type":"string"}}}}}}},"/api/v1/settings":{"get":{"operationId":"listSettings","summary":"Every setting (group, kind, unit, range, options, default) and the presets.","responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}}}}},"/api/v1/check_automation":{"get":{"operationId":"checkAutomationGet","summary":"Lint an AUTOMATION.md file","description":"Reads an AUTOMATION.md file (sent as a string) and returns findings with line numbers: missing or unreadable keys, writes or spending with no approval, unbounded retries, no timeout, no owner, no budget, a per-run budget that does not fit the month, schedules that overlap themselves or each other, quiet-hour runs, high exposure and stale reviews. The rules take your settings as arguments. A pass means the text met the rules you chose; it approves nothing and runs nothing.","parameters":[{"name":"content","in":"query","required":true,"description":"The whole AUTOMATION.md file as text.","schema":{"type":"string"}},{"name":"today","in":"query","required":false,"description":"The date to judge reviews and schedules from (YYYY-MM-DD, UTC). Default: today.","schema":{"type":"string"}},{"name":"strictness","in":"query","required":false,"description":"lenient: missing keys are warnings (trigger and steps stay errors). standard: missing keys are errors. strict: warnings fail the check too.","schema":{"type":"string","enum":["lenient","standard","strict"]}},{"name":"approval_over","in":"query","required":false,"description":"Your approval amount: a job with approval none and a per-run budget above this is an error.","schema":{"type":"number","minimum":0,"maximum":1000000000}},{"name":"writes_need_approval","in":"query","required":false,"description":"any: every writing job needs an approval. external (default): jobs that send, publish, deploy, pay or delete need one. none: no rule.","schema":{"type":"string","enum":["any","external","none"]}},{"name":"max_retries","in":"query","required":false,"description":"Most retries per run before a warning. Unlimited retries are always an error.","schema":{"type":"integer","minimum":0,"maximum":100}},{"name":"max_timeout_minutes","in":"query","required":false,"description":"Longest timeout before a warning, in minutes.","schema":{"type":"number","minimum":1,"maximum":100000}},{"name":"max_runs_per_day","in":"query","required":false,"description":"Most runs a day for one job before a warning.","schema":{"type":"number","minimum":0.01,"maximum":100000}},{"name":"monthly_budget","in":"query","required":false,"description":"Your monthly budget for every job in the file; the per-month budgets of jobs that are on are added up against it.","schema":{"type":"number","minimum":0,"maximum":1000000000000}},{"name":"budget_alert_pct","in":"query","required":false,"description":"Warn when that sum reaches this share of monthly_budget.","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"review_interval_days","in":"query","required":false,"description":"A last_reviewed older than this is stale. Default 90.","schema":{"type":"integer","minimum":1,"maximum":3650}},{"name":"quiet_start_hour","in":"query","required":false,"description":"Quiet hours start (UTC hour). With quiet_end_hour, a writing job that runs inside them gets a warning.","schema":{"type":"integer","minimum":0,"maximum":23}},{"name":"quiet_end_hour","in":"query","required":false,"description":"Quiet hours end (UTC hour, excluded).","schema":{"type":"integer","minimum":0,"maximum":23}}],"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"operationId":"checkAutomation","summary":"Lint an AUTOMATION.md file","description":"Reads an AUTOMATION.md file (sent as a string) and returns findings with line numbers: missing or unreadable keys, writes or spending with no approval, unbounded retries, no timeout, no owner, no budget, a per-run budget that does not fit the month, schedules that overlap themselves or each other, quiet-hour runs, high exposure and stale reviews. The rules take your settings as arguments. A pass means the text met the rules you chose; it approves nothing and runs nothing.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","maxLength":60000,"description":"The whole AUTOMATION.md file as text."},"today":{"type":"string","maxLength":10,"pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"The date to judge reviews and schedules from (YYYY-MM-DD, UTC). Default: today."},"strictness":{"type":"string","enum":["lenient","standard","strict"],"default":"standard","description":"lenient: missing keys are warnings (trigger and steps stay errors). standard: missing keys are errors. strict: warnings fail the check too."},"approval_over":{"type":"number","minimum":0,"maximum":1000000000,"description":"Your approval amount: a job with approval none and a per-run budget above this is an error."},"writes_need_approval":{"type":"string","enum":["any","external","none"],"default":"external","description":"any: every writing job needs an approval. external (default): jobs that send, publish, deploy, pay or delete need one. none: no rule."},"max_retries":{"type":"integer","minimum":0,"maximum":100,"default":3,"description":"Most retries per run before a warning. Unlimited retries are always an error."},"max_timeout_minutes":{"type":"number","minimum":1,"maximum":100000,"description":"Longest timeout before a warning, in minutes."},"max_runs_per_day":{"type":"number","minimum":0.01,"maximum":100000,"description":"Most runs a day for one job before a warning."},"monthly_budget":{"type":"number","minimum":0,"maximum":1000000000000,"description":"Your monthly budget for every job in the file; the per-month budgets of jobs that are on are added up against it."},"budget_alert_pct":{"type":"integer","minimum":1,"maximum":100,"description":"Warn when that sum reaches this share of monthly_budget."},"review_interval_days":{"type":"integer","minimum":1,"maximum":3650,"default":90,"description":"A last_reviewed older than this is stale. Default 90."},"quiet_start_hour":{"type":"integer","minimum":0,"maximum":23,"description":"Quiet hours start (UTC hour). With quiet_end_hour, a writing job that runs inside them gets a warning."},"quiet_end_hour":{"type":"integer","minimum":0,"maximum":23,"description":"Quiet hours end (UTC hour, excluded)."}},"required":["content"]},"example":{"content":"format: automation/1\nowner: ops-team\ncurrency: USD\n## refund-sweep\ntrigger: every 5 minutes\nsteps: list refund requests; refund each approved request; email the customer\nscope: read refunds; write payments, email\napproval: none\nbudget: 2 per run, 50 per month\nretries: unlimited\nstatus: on\nlast_reviewed: 2026-03-01","today":"2026-10-22","approval_over":25,"quiet_start_hour":22,"quiet_end_hour":6,"monthly_budget":100}}}},"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Body over 64 KB"}}}},"/api/v1/preflight_run":{"get":{"operationId":"preflightRunGet","summary":"Go, hold or stop before an unattended run","description":"The gate to call right before an unattended run. Send the AUTOMATION.md file, the job's name, now, and this job's counts (runs and spend today, spend this month, failed runs in a row, when the last run started, the step about to run). It answers go, hold or stop, each reason with the line of the file it comes from: an error in the section, status draft or paused, an overdue review, the failure breaker, quiet hours for a job that writes, a slot that already ran or a min_gap not yet passed, too many runs today, the day's or month's budget after this run's worst case (per_run x (1 + retries)), an approval amount, and the approval line before next_step. A hold says when the run may start or that it waits for a yes. Deterministic; it starts, stops and approves nothing.","parameters":[{"name":"content","in":"query","required":true,"description":"The whole AUTOMATION.md file as text.","schema":{"type":"string"}},{"name":"job","in":"query","required":true,"description":"The job about to run: its ## name, case-insensitive.","schema":{"type":"string"}},{"name":"now","in":"query","required":true,"description":"The time of the run, as 2026-10-23T14:00:00Z. No offset means UTC; an offset converts.","schema":{"type":"string"}},{"name":"runs_today","in":"query","required":false,"description":"Runs of this job already started today (UTC day).","schema":{"type":"integer","minimum":0,"maximum":100000}},{"name":"spend_today","in":"query","required":false,"description":"What this job has spent today (UTC day), in the file's currency.","schema":{"type":"number","minimum":0,"maximum":1000000000000}},{"name":"spend_month","in":"query","required":false,"description":"What this job has spent this calendar month (UTC), in the file's currency.","schema":{"type":"number","minimum":0,"maximum":1000000000000}},{"name":"consecutive_failures","in":"query","required":false,"description":"Runs in a row that failed after all their retries; 0 after a run succeeds.","schema":{"type":"integer","minimum":0,"maximum":100000}},{"name":"last_run_at","in":"query","required":false,"description":"When the last run of this job started (UTC). Leave out before the first run.","schema":{"type":"string"}},{"name":"next_step","in":"query","required":false,"description":"The step about to run: its number, its text or the start of it. Leave out at the start of a run.","schema":{"type":"string"}},{"name":"failure_limit","in":"query","required":false,"description":"Failed runs in a row that stop the job (your failure_limit setting). Default 3.","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"review_interval_days","in":"query","required":false,"description":"A last_reviewed older than this stops the run. Default 90.","schema":{"type":"integer","minimum":1,"maximum":3650}},{"name":"quiet_start_hour","in":"query","required":false,"description":"Quiet hours start (UTC hour). With quiet_end_hour, a job that writes holds inside them.","schema":{"type":"integer","minimum":0,"maximum":23}},{"name":"quiet_end_hour","in":"query","required":false,"description":"Quiet hours end (UTC hour, excluded).","schema":{"type":"integer","minimum":0,"maximum":23}},{"name":"max_runs_per_day","in":"query","required":false,"description":"Most runs a day for one job; one more holds until 00:00 UTC.","schema":{"type":"integer","minimum":1,"maximum":100000}},{"name":"approval_over","in":"query","required":false,"description":"Your approval amount: a run whose worst case is above it holds for a yes.","schema":{"type":"number","minimum":0,"maximum":1000000000}},{"name":"writes_need_approval","in":"query","required":false,"description":"Your rule for the check of the section: any, external (default) or none.","schema":{"type":"string","enum":["any","external","none"]}}],"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"operationId":"preflightRun","summary":"Go, hold or stop before an unattended run","description":"The gate to call right before an unattended run. Send the AUTOMATION.md file, the job's name, now, and this job's counts (runs and spend today, spend this month, failed runs in a row, when the last run started, the step about to run). It answers go, hold or stop, each reason with the line of the file it comes from: an error in the section, status draft or paused, an overdue review, the failure breaker, quiet hours for a job that writes, a slot that already ran or a min_gap not yet passed, too many runs today, the day's or month's budget after this run's worst case (per_run x (1 + retries)), an approval amount, and the approval line before next_step. A hold says when the run may start or that it waits for a yes. Deterministic; it starts, stops and approves nothing.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","maxLength":60000,"description":"The whole AUTOMATION.md file as text."},"job":{"type":"string","maxLength":80,"description":"The job about to run: its ## name, case-insensitive."},"now":{"type":"string","maxLength":40,"description":"The time of the run, as 2026-10-23T14:00:00Z. No offset means UTC; an offset converts."},"runs_today":{"type":"integer","minimum":0,"maximum":100000,"default":0,"description":"Runs of this job already started today (UTC day)."},"spend_today":{"type":"number","minimum":0,"maximum":1000000000000,"default":0,"description":"What this job has spent today (UTC day), in the file's currency."},"spend_month":{"type":"number","minimum":0,"maximum":1000000000000,"default":0,"description":"What this job has spent this calendar month (UTC), in the file's currency."},"consecutive_failures":{"type":"integer","minimum":0,"maximum":100000,"default":0,"description":"Runs in a row that failed after all their retries; 0 after a run succeeds."},"last_run_at":{"type":"string","maxLength":40,"description":"When the last run of this job started (UTC). Leave out before the first run."},"next_step":{"type":"string","maxLength":300,"description":"The step about to run: its number, its text or the start of it. Leave out at the start of a run."},"failure_limit":{"type":"integer","minimum":1,"maximum":100,"default":3,"description":"Failed runs in a row that stop the job (your failure_limit setting). Default 3."},"review_interval_days":{"type":"integer","minimum":1,"maximum":3650,"default":90,"description":"A last_reviewed older than this stops the run. Default 90."},"quiet_start_hour":{"type":"integer","minimum":0,"maximum":23,"description":"Quiet hours start (UTC hour). With quiet_end_hour, a job that writes holds inside them."},"quiet_end_hour":{"type":"integer","minimum":0,"maximum":23,"description":"Quiet hours end (UTC hour, excluded)."},"max_runs_per_day":{"type":"integer","minimum":1,"maximum":100000,"description":"Most runs a day for one job; one more holds until 00:00 UTC."},"approval_over":{"type":"number","minimum":0,"maximum":1000000000,"description":"Your approval amount: a run whose worst case is above it holds for a yes."},"writes_need_approval":{"type":"string","enum":["any","external","none"],"default":"external","description":"Your rule for the check of the section: any, external (default) or none."}},"required":["content","job","now"]},"example":{"content":"format: automation/1\nowner: billing-team\ncurrency: USD\n## invoice-reminders\ntrigger: cron 0 14 * * mon-fri\nsteps: read overdue invoices; draft one reminder per customer; send the reminders\nscope: read invoices; write drafts, outbox\napproval: before send the reminders\nbudget: 0.50 per run, 1 per day, 12 per month\nretries: 1, backoff 10m fixed\ntimeout: 15m\nstatus: on\nlast_reviewed: 2026-10-01","job":"invoice-reminders","now":"2026-10-23T14:00:00Z","spend_month":9.5,"last_run_at":"2026-10-22T14:00:02Z","next_step":"3","quiet_start_hour":22,"quiet_end_hour":6}}}},"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Body over 64 KB"}}}},"/api/v1/automation_starter":{"get":{"operationId":"automationStarterGet","summary":"Get a starter AUTOMATION.md file","description":"Serves five ready AUTOMATION.md files for common unattended jobs: daily-report (read only, on a schedule, with a budget), inbox-triage (labels and drafts, sends wait for a yes before the send step), nightly-sync (writes, with capped retries, backoff and a timeout), invoice-reminders (a spend cap per run, day and month, a time outside quiet hours, contact limits, a yes before the send), alert-watch (an event trigger, min_gap as the rate limit, escalation that waits for a yes). Each is a complete file with one job in status draft and a note on when to use it and what to change; the result includes its jobs and the check_automation result under the default rules (no errors). Without kind it lists them. Names and amounts are made up; it runs, schedules and approves nothing.","parameters":[{"name":"kind","in":"query","required":false,"description":"Which starter: daily-report (read only, on a schedule, with a budget), inbox-triage (labels and drafts, sends wait for a yes before the send step), nightly-sync (writes, with capped retries, backoff and a timeout), invoice-reminders (a spend cap per run, day and month, a time outside quiet hours, contact limits, a yes before the send), alert-watch (an event trigger, min_gap as the rate limit, escalation that waits for a yes). Leave it out for the list.","schema":{"type":"string","enum":["daily-report","inbox-triage","nightly-sync","invoice-reminders","alert-watch"]}}],"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"operationId":"automationStarter","summary":"Get a starter AUTOMATION.md file","description":"Serves five ready AUTOMATION.md files for common unattended jobs: daily-report (read only, on a schedule, with a budget), inbox-triage (labels and drafts, sends wait for a yes before the send step), nightly-sync (writes, with capped retries, backoff and a timeout), invoice-reminders (a spend cap per run, day and month, a time outside quiet hours, contact limits, a yes before the send), alert-watch (an event trigger, min_gap as the rate limit, escalation that waits for a yes). Each is a complete file with one job in status draft and a note on when to use it and what to change; the result includes its jobs and the check_automation result under the default rules (no errors). Without kind it lists them. Names and amounts are made up; it runs, schedules and approves nothing.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string","enum":["daily-report","inbox-triage","nightly-sync","invoice-reminders","alert-watch"],"description":"Which starter: daily-report (read only, on a schedule, with a budget), inbox-triage (labels and drafts, sends wait for a yes before the send step), nightly-sync (writes, with capped retries, backoff and a timeout), invoice-reminders (a spend cap per run, day and month, a time outside quiet hours, contact limits, a yes before the send), alert-watch (an event trigger, min_gap as the rate limit, escalation that waits for a yes). Leave it out for the list."}}},"example":{"kind":"inbox-triage"}}}},"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Body over 64 KB"}}}},"/api/v1/parse_automation":{"get":{"operationId":"parseAutomationGet","summary":"Parse an AUTOMATION.md file to JSON","description":"Reads an AUTOMATION.md file (sent as a string) with the same parser the other tools use and returns its canonical JSON: the header, then every job sorted by name with its trigger, steps (in order, each with the class of its first listed verb), scope (sorted), approval (with the gated step's number), budget (per run, per day, per month and currency), retries, timeout, min_gap, owner, status, last_reviewed and the line of each key, plus the values it could not read and a fingerprint that stays the same when only the order or layout changes. Every field is described in fields. It judges nothing: check_automation does that.","parameters":[{"name":"content","in":"query","required":true,"description":"The whole AUTOMATION.md file as text.","schema":{"type":"string"}}],"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"operationId":"parseAutomation","summary":"Parse an AUTOMATION.md file to JSON","description":"Reads an AUTOMATION.md file (sent as a string) with the same parser the other tools use and returns its canonical JSON: the header, then every job sorted by name with its trigger, steps (in order, each with the class of its first listed verb), scope (sorted), approval (with the gated step's number), budget (per run, per day, per month and currency), retries, timeout, min_gap, owner, status, last_reviewed and the line of each key, plus the values it could not read and a fingerprint that stays the same when only the order or layout changes. Every field is described in fields. It judges nothing: check_automation does that.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","maxLength":60000,"description":"The whole AUTOMATION.md file as text."}},"required":["content"]},"example":{"content":"format: automation/1\nowner: ops-team\ncurrency: USD\n## refund-sweep\ntrigger: every 5 minutes\nsteps: list refund requests; refund each approved request; email the customer\nscope: read refunds; write payments, email\napproval: none\nbudget: 2 per run, 50 per month\nretries: unlimited\nstatus: on\nlast_reviewed: 2026-03-01"}}}},"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Body over 64 KB"}}}},"/api/v1/schedule_math":{"get":{"operationId":"scheduleMathGet","summary":"Run times, counts and overlaps from a schedule","description":"Turns a cron expression or an interval (as written in the file's trigger line) plus a runtime into the next N run times in UTC, runs per day and per 30 days, the smallest gap between runs, and whether runs overlap (runtime longer than the gap) and how many can be in flight at once. Intervals are counted from 00:00 UTC on the start date. Pure calendar arithmetic; it schedules nothing.","parameters":[{"name":"trigger","in":"query","required":true,"description":"The trigger line: \"cron 0 6 * * *\", \"*/20 6-18 * * 1-5\" or \"every 15 minutes\". Event triggers have no schedule.","schema":{"type":"string"}},{"name":"runtime","in":"query","required":false,"description":"How long one run takes: a duration such as \"25m\", \"1h30m\" or \"90s\", or a plain number of minutes. Default 10m.","schema":{"type":"string"}},{"name":"from","in":"query","required":false,"description":"Start instant: a date (midnight UTC) or a time such as 2026-10-22T08:00:00Z; a time with no offset is read as UTC. Runs strictly after it are listed. Default: now.","schema":{"type":"string"}},{"name":"count","in":"query","required":false,"description":"How many run times to list. Default 10.","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"timeout","in":"query","required":false,"description":"The job's timeout, such as \"15m\"; checked against the gap too.","schema":{"type":"string"}}],"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"operationId":"scheduleMath","summary":"Run times, counts and overlaps from a schedule","description":"Turns a cron expression or an interval (as written in the file's trigger line) plus a runtime into the next N run times in UTC, runs per day and per 30 days, the smallest gap between runs, and whether runs overlap (runtime longer than the gap) and how many can be in flight at once. Intervals are counted from 00:00 UTC on the start date. Pure calendar arithmetic; it schedules nothing.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"trigger":{"type":"string","maxLength":200,"description":"The trigger line: \"cron 0 6 * * *\", \"*/20 6-18 * * 1-5\" or \"every 15 minutes\". Event triggers have no schedule."},"runtime":{"type":"string","maxLength":40,"default":"10m","description":"How long one run takes: a duration such as \"25m\", \"1h30m\" or \"90s\", or a plain number of minutes. Default 10m."},"from":{"type":"string","maxLength":40,"description":"Start instant: a date (midnight UTC) or a time such as 2026-10-22T08:00:00Z; a time with no offset is read as UTC. Runs strictly after it are listed. Default: now."},"count":{"type":"integer","minimum":1,"maximum":100,"default":10,"description":"How many run times to list. Default 10."},"timeout":{"type":"string","maxLength":40,"description":"The job's timeout, such as \"15m\"; checked against the gap too."}},"required":["trigger"]},"example":{"trigger":"cron */20 6-18 * * 1-5","runtime":"25m","from":"2026-10-22T08:00:00Z","count":6,"timeout":"30m"}}}},"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Body over 64 KB"}}}},"/api/v1/run_budget":{"get":{"operationId":"runBudgetGet","summary":"A month of runs with retries against a budget","description":"Runs per month times cost per run, with retries and a failure rate per attempt, against the monthly budget: the expected and worst-case monthly cost, what is left, the run and the day on which the budget runs out, how many runs still fail after all retries, and what one more retry would add. Every number comes from the request; it reads no bills and spends nothing.","parameters":[{"name":"runs_per_month","in":"query","required":true,"description":"Scheduled runs in the month (schedule_math gives runs_per_month for a cron or interval).","schema":{"type":"number","minimum":0,"maximum":1000000000}},{"name":"cost_per_run","in":"query","required":true,"description":"Cost of one successful attempt, in the file's currency.","schema":{"type":"number","minimum":0,"maximum":1000000000}},{"name":"retries","in":"query","required":false,"description":"Retries after a failed attempt. Default 0.","schema":{"type":"integer","minimum":0,"maximum":100}},{"name":"failure_rate","in":"query","required":false,"description":"Share of attempts that fail, 0 to 1 (values above 1 are read as a percent). Default 0.","schema":{"type":"number","minimum":0,"maximum":100}},{"name":"monthly_budget","in":"query","required":true,"description":"The per-month budget for this job.","schema":{"type":"number","minimum":0,"maximum":1000000000000}},{"name":"failed_attempt_cost","in":"query","required":false,"description":"Cost of a failed attempt. Default: the same as cost_per_run.","schema":{"type":"number","minimum":0,"maximum":1000000000}},{"name":"days_in_month","in":"query","required":false,"description":"Days in the month, to turn the run that goes over into a day. Default 30.","schema":{"type":"integer","minimum":28,"maximum":31}},{"name":"currency","in":"query","required":false,"description":"A three-letter code, used only to label the result.","schema":{"type":"string"}}],"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"operationId":"runBudget","summary":"A month of runs with retries against a budget","description":"Runs per month times cost per run, with retries and a failure rate per attempt, against the monthly budget: the expected and worst-case monthly cost, what is left, the run and the day on which the budget runs out, how many runs still fail after all retries, and what one more retry would add. Every number comes from the request; it reads no bills and spends nothing.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"runs_per_month":{"type":"number","minimum":0,"maximum":1000000000,"description":"Scheduled runs in the month (schedule_math gives runs_per_month for a cron or interval)."},"cost_per_run":{"type":"number","minimum":0,"maximum":1000000000,"description":"Cost of one successful attempt, in the file's currency."},"retries":{"type":"integer","minimum":0,"maximum":100,"default":0,"description":"Retries after a failed attempt. Default 0."},"failure_rate":{"type":"number","minimum":0,"maximum":100,"default":0,"description":"Share of attempts that fail, 0 to 1 (values above 1 are read as a percent). Default 0."},"monthly_budget":{"type":"number","minimum":0,"maximum":1000000000000,"description":"The per-month budget for this job."},"failed_attempt_cost":{"type":"number","minimum":0,"maximum":1000000000,"description":"Cost of a failed attempt. Default: the same as cost_per_run."},"days_in_month":{"type":"integer","minimum":28,"maximum":31,"default":30,"description":"Days in the month, to turn the run that goes over into a day. Default 30."},"currency":{"type":"string","maxLength":3,"pattern":"^[A-Za-z]{3}$","description":"A three-letter code, used only to label the result."}},"required":["runs_per_month","cost_per_run","monthly_budget"]},"example":{"runs_per_month":720,"cost_per_run":0.05,"retries":2,"failure_rate":0.1,"monthly_budget":30,"currency":"USD"}}}},"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Body over 64 KB"}}}},"/api/v1/blast_radius":{"get":{"operationId":"blastRadiusGet","summary":"Exposure of a job, and the step to gate","description":"From a job's steps, scope and approval line (as written in the file), a 0 to 100 exposure number with its formula: points per step by what its verbs do (read, write, send, spend, delete), less what an approval gates, scaled by how many write targets there are and whether any looks sensitive. Names the step to gate (the first unattended step that sends, spends or deletes) and the exposure if it were. A reading of the text, not a safety assessment.","parameters":[{"name":"steps","in":"query","required":true,"description":"The ordered steps, separated by semicolons or line breaks: \"pull orders; build the summary; send the summary\".","schema":{"type":"string"}},{"name":"scope","in":"query","required":false,"description":"\"read a, b; write c, d\" or none.","schema":{"type":"string"}},{"name":"approval","in":"query","required":false,"description":"none, \"before <step>\" or \"over <amount>\".","schema":{"type":"string"}},{"name":"budget_per_run","in":"query","required":false,"description":"The per-run budget, so \"over <amount>\" can be read against it.","schema":{"type":"number","minimum":0,"maximum":1000000000}}],"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"operationId":"blastRadius","summary":"Exposure of a job, and the step to gate","description":"From a job's steps, scope and approval line (as written in the file), a 0 to 100 exposure number with its formula: points per step by what its verbs do (read, write, send, spend, delete), less what an approval gates, scaled by how many write targets there are and whether any looks sensitive. Names the step to gate (the first unattended step that sends, spends or deletes) and the exposure if it were. A reading of the text, not a safety assessment.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"steps":{"type":"string","maxLength":4000,"description":"The ordered steps, separated by semicolons or line breaks: \"pull orders; build the summary; send the summary\"."},"scope":{"type":"string","maxLength":1000,"default":"none","description":"\"read a, b; write c, d\" or none."},"approval":{"type":"string","maxLength":200,"default":"none","description":"none, \"before <step>\" or \"over <amount>\"."},"budget_per_run":{"type":"number","minimum":0,"maximum":1000000000,"description":"The per-run budget, so \"over <amount>\" can be read against it."}},"required":["steps"]},"example":{"steps":"pull yesterday's orders; build the summary; send the summary to the ops channel","scope":"read orders, metrics; write reports","approval":"none"}}}},"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Body over 64 KB"}}}},"/api/v1/automation_template":{"get":{"operationId":"automationTemplateGet","summary":"A ready AUTOMATION.md file","description":"Builds a complete AUTOMATION.md file for one job from a few arguments: name, owner, trigger, steps and scope, with a budget, retries, backoff, timeout and status. The approval line defaults to a gate before the first step that sends, spends or deletes, and the per-month budget to the per-run budget times the runs in the next 30 days. The file is linted before it is returned. It writes text only; it saves, schedules and runs nothing.","parameters":[{"name":"name","in":"query","required":true,"description":"The job's name, such as \"nightly-report\".","schema":{"type":"string"}},{"name":"owner","in":"query","required":true,"description":"Who answers for the job: a person or team name.","schema":{"type":"string"}},{"name":"trigger","in":"query","required":true,"description":"\"cron 0 6 * * *\", \"every 15 minutes\" or \"on order.created\".","schema":{"type":"string"}},{"name":"steps","in":"query","required":true,"description":"The ordered steps, separated by semicolons or line breaks.","schema":{"type":"string"}},{"name":"scope","in":"query","required":false,"description":"\"read a, b; write c\" or none.","schema":{"type":"string"}},{"name":"approval","in":"query","required":false,"description":"none, \"before <step>\" or \"over <amount>\". Default: before the first step that sends, spends or deletes, else none.","schema":{"type":"string"}},{"name":"budget_per_run","in":"query","required":false,"description":"Budget per run in the file's currency. Default 0.","schema":{"type":"number","minimum":0,"maximum":1000000000}},{"name":"budget_per_month","in":"query","required":false,"description":"Budget per month. Default: budget_per_run x runs in the next 30 days.","schema":{"type":"number","minimum":0,"maximum":1000000000000}},{"name":"currency","in":"query","required":false,"description":"Three-letter code the file states for every amount. Default USD.","schema":{"type":"string"}},{"name":"retries","in":"query","required":false,"description":"Retries per run. Default 2.","schema":{"type":"integer","minimum":0,"maximum":20}},{"name":"backoff","in":"query","required":false,"description":"Backoff between retries, such as \"30s\" or \"5m\". Default 5m.","schema":{"type":"string"}},{"name":"backoff_kind","in":"query","required":false,"description":"How the backoff grows. Default exponential.","schema":{"type":"string","enum":["fixed","linear","exponential"]}},{"name":"timeout","in":"query","required":false,"description":"Timeout per run, such as \"15m\". Default 15m.","schema":{"type":"string"}},{"name":"status","in":"query","required":false,"description":"on, paused or draft. Default draft: turn it on after the person says yes.","schema":{"type":"string","enum":["on","paused","draft"]}},{"name":"today","in":"query","required":false,"description":"The date written as updated and last_reviewed. Default: today.","schema":{"type":"string"}}],"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"operationId":"automationTemplate","summary":"A ready AUTOMATION.md file","description":"Builds a complete AUTOMATION.md file for one job from a few arguments: name, owner, trigger, steps and scope, with a budget, retries, backoff, timeout and status. The approval line defaults to a gate before the first step that sends, spends or deletes, and the per-month budget to the per-run budget times the runs in the next 30 days. The file is linted before it is returned. It writes text only; it saves, schedules and runs nothing.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":80,"description":"The job's name, such as \"nightly-report\"."},"owner":{"type":"string","maxLength":80,"description":"Who answers for the job: a person or team name."},"trigger":{"type":"string","maxLength":200,"description":"\"cron 0 6 * * *\", \"every 15 minutes\" or \"on order.created\"."},"steps":{"type":"string","maxLength":4000,"description":"The ordered steps, separated by semicolons or line breaks."},"scope":{"type":"string","maxLength":1000,"default":"none","description":"\"read a, b; write c\" or none."},"approval":{"type":"string","maxLength":200,"description":"none, \"before <step>\" or \"over <amount>\". Default: before the first step that sends, spends or deletes, else none."},"budget_per_run":{"type":"number","minimum":0,"maximum":1000000000,"default":0,"description":"Budget per run in the file's currency. Default 0."},"budget_per_month":{"type":"number","minimum":0,"maximum":1000000000000,"description":"Budget per month. Default: budget_per_run x runs in the next 30 days."},"currency":{"type":"string","maxLength":3,"default":"USD","description":"Three-letter code the file states for every amount. Default USD."},"retries":{"type":"integer","minimum":0,"maximum":20,"default":2,"description":"Retries per run. Default 2."},"backoff":{"type":"string","maxLength":40,"default":"5m","description":"Backoff between retries, such as \"30s\" or \"5m\". Default 5m."},"backoff_kind":{"type":"string","enum":["fixed","linear","exponential"],"default":"exponential","description":"How the backoff grows. Default exponential."},"timeout":{"type":"string","maxLength":40,"default":"15m","description":"Timeout per run, such as \"15m\". Default 15m."},"status":{"type":"string","enum":["on","paused","draft"],"default":"draft","description":"on, paused or draft. Default draft: turn it on after the person says yes."},"today":{"type":"string","maxLength":10,"pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"The date written as updated and last_reviewed. Default: today."}},"required":["name","owner","trigger","steps"]},"example":{"name":"nightly-report","owner":"ops-team","trigger":"cron 0 6 * * *","steps":"pull yesterday's orders; build the summary; send the summary to the ops channel","scope":"read orders, metrics; write reports","budget_per_run":0.4,"currency":"USD","today":"2026-10-22"}}}},"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Body over 64 KB"}}}},"/api/v1/build_settings":{"get":{"operationId":"buildSettingsGet","summary":"Write your settings into the skill","description":"Turns a preset and settings into the sections written at the top of AUTOMATION.md. Every setting is a number or a fixed choice; the catalog is at https://automation.md/api/v1/settings. Returns the sections as Markdown, the settings as JSON, a link to the skill with them written in and a one-line install. Out-of-range numbers are clamped with a note. Nothing is stored. Settings an agent drafted count only after the person says yes: show them to the person first, and follow them only once they agree.","parameters":[{"name":"preset","in":"query","required":false,"description":"Starting point: core, recommended, strict. Applied first; each setting overrides it.","schema":{"type":"string","enum":["core","recommended","strict"]}},{"name":"approval_over","in":"query","required":false,"description":"Ask before any run that may spend more than (number). Default 25. Out-of-range values are clamped.","schema":{"type":"number","minimum":0,"maximum":1000000}},{"name":"writes_need_approval","in":"query","required":false,"description":"Writes need an approval: any (Any write), external (Sends, publishes, deploys, payments and deletions), none (None inside scope and budget). Optional; unset clears it.","schema":{"type":"string","enum":["any","external","none","unset"]}},{"name":"max_retries","in":"query","required":false,"description":"Most retries per run (retries). Default 3. Out-of-range values are clamped.","schema":{"type":"integer","minimum":0,"maximum":20}},{"name":"default_timeout_minutes","in":"query","required":false,"description":"Timeout when a job states none (minutes). Default 15. Out-of-range values are clamped.","schema":{"type":"integer","minimum":1,"maximum":1440}},{"name":"max_timeout_minutes","in":"query","required":false,"description":"Longest timeout (minutes). Optional; unset clears it. Out-of-range values are clamped.","schema":{"type":"integer","minimum":1,"maximum":1440}},{"name":"max_runs_per_day","in":"query","required":false,"description":"Most runs a day for one job (runs). Optional; unset clears it. Out-of-range values are clamped.","schema":{"type":"integer","minimum":1,"maximum":1440}},{"name":"failure_limit","in":"query","required":false,"description":"Stop a job after this many failed runs in a row (runs). Optional; unset clears it. Out-of-range values are clamped.","schema":{"type":"integer","minimum":1,"maximum":20}},{"name":"monthly_budget","in":"query","required":false,"description":"Monthly budget for every job in the file (number). Default 100. Out-of-range values are clamped.","schema":{"type":"number","minimum":0,"maximum":10000000}},{"name":"budget_alert_pct","in":"query","required":false,"description":"Warn when the file's monthly budgets reach (%). Optional; unset clears it. Out-of-range values are clamped.","schema":{"type":"integer","minimum":10,"maximum":100}},{"name":"review_interval_days","in":"query","required":false,"description":"Review every job at least every (days). Default 90. Out-of-range values are clamped.","schema":{"type":"integer","minimum":7,"maximum":365}},{"name":"quiet_start_hour","in":"query","required":false,"description":"Quiet hours start (UTC) (h). Optional; unset clears it. Out-of-range values are clamped.","schema":{"type":"integer","minimum":0,"maximum":23}},{"name":"quiet_end_hour","in":"query","required":false,"description":"Quiet hours end (UTC) (h). Optional; unset clears it. Out-of-range values are clamped.","schema":{"type":"integer","minimum":0,"maximum":23}},{"name":"strictness","in":"query","required":false,"description":"Check strictness: lenient (Lenient: missing keys are warnings), standard (Standard: missing keys are errors), strict (Strict: warnings fail the check too). Optional; unset clears it.","schema":{"type":"string","enum":["lenient","standard","strict","unset"]}},{"name":"format","in":"query","required":false,"description":"section (default): the settings sections only; skill: the whole skill file too.","schema":{"type":"string","enum":["section","skill"]}}],"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"operationId":"buildSettings","summary":"Write your settings into the skill","description":"Turns a preset and settings into the sections written at the top of AUTOMATION.md. Every setting is a number or a fixed choice; the catalog is at https://automation.md/api/v1/settings. Returns the sections as Markdown, the settings as JSON, a link to the skill with them written in and a one-line install. Out-of-range numbers are clamped with a note. Nothing is stored. Settings an agent drafted count only after the person says yes: show them to the person first, and follow them only once they agree.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"preset":{"type":"string","enum":["core","recommended","strict"],"description":"Starting point: core, recommended, strict. Applied first; each setting overrides it."},"approval_over":{"type":"number","minimum":0,"maximum":1000000,"description":"Ask before any run that may spend more than (number). Default 25. Out-of-range values are clamped."},"writes_need_approval":{"type":"string","enum":["any","external","none","unset"],"description":"Writes need an approval: any (Any write), external (Sends, publishes, deploys, payments and deletions), none (None inside scope and budget). Optional; unset clears it."},"max_retries":{"type":"integer","minimum":0,"maximum":20,"description":"Most retries per run (retries). Default 3. Out-of-range values are clamped."},"default_timeout_minutes":{"type":"integer","minimum":1,"maximum":1440,"description":"Timeout when a job states none (minutes). Default 15. Out-of-range values are clamped."},"max_timeout_minutes":{"type":"integer","minimum":1,"maximum":1440,"description":"Longest timeout (minutes). Optional; unset clears it. Out-of-range values are clamped."},"max_runs_per_day":{"type":"integer","minimum":1,"maximum":1440,"description":"Most runs a day for one job (runs). Optional; unset clears it. Out-of-range values are clamped."},"failure_limit":{"type":"integer","minimum":1,"maximum":20,"description":"Stop a job after this many failed runs in a row (runs). Optional; unset clears it. Out-of-range values are clamped."},"monthly_budget":{"type":"number","minimum":0,"maximum":10000000,"description":"Monthly budget for every job in the file (number). Default 100. Out-of-range values are clamped."},"budget_alert_pct":{"type":"integer","minimum":10,"maximum":100,"description":"Warn when the file's monthly budgets reach (%). Optional; unset clears it. Out-of-range values are clamped."},"review_interval_days":{"type":"integer","minimum":7,"maximum":365,"description":"Review every job at least every (days). Default 90. Out-of-range values are clamped."},"quiet_start_hour":{"type":"integer","minimum":0,"maximum":23,"description":"Quiet hours start (UTC) (h). Optional; unset clears it. Out-of-range values are clamped."},"quiet_end_hour":{"type":"integer","minimum":0,"maximum":23,"description":"Quiet hours end (UTC) (h). Optional; unset clears it. Out-of-range values are clamped."},"strictness":{"type":"string","enum":["lenient","standard","strict","unset"],"description":"Check strictness: lenient (Lenient: missing keys are warnings), standard (Standard: missing keys are errors), strict (Strict: warnings fail the check too). Optional; unset clears it."},"format":{"type":"string","enum":["section","skill"],"description":"section (default): the settings sections only; skill: the whole skill file too."}}},"example":{"preset":"recommended"}}}},"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Body over 64 KB"}}}},"/api/v1/whats_new":{"get":{"operationId":"whatsNewGet","summary":"What's new here, and what's next","description":"What changed on automation.md and when, what is being built, when to check back, and the other .md sites. Pass since (a date) to get only newer entries, for example the updated date of the skill you have. Reads a list kept with the code; fetches nothing and stores nothing.","parameters":[{"name":"since","in":"query","required":false,"description":"Only entries after this date (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"planned","in":"query","required":false,"description":"Include what is being built and the ideas being weighed. Default true.","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"operationId":"whatsNew","summary":"What's new here, and what's next","description":"What changed on automation.md and when, what is being built, when to check back, and the other .md sites. Pass since (a date) to get only newer entries, for example the updated date of the skill you have. Reads a list kept with the code; fetches nothing and stores nothing.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"since":{"type":"string","maxLength":10,"pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Only entries after this date (YYYY-MM-DD)."},"planned":{"type":"boolean","default":true,"description":"Include what is being built and the ideas being weighed. Default true."}}},"example":{"since":"2026-10-01"}}}},"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Body over 64 KB"}}}}},"components":{"schemas":{"Result":{"type":"object","additionalProperties":true,"properties":{"tool":{"type":"string"},"summary":{"type":"string"},"disclaimer":{"type":"string"},"terms":{"type":"string"}},"required":["disclaimer","terms"]},"Problem":{"type":"object","properties":{"error":{"type":"string"},"hint":{"type":"string"},"docs":{"type":"string"},"disclaimer":{"type":"string"},"terms":{"type":"string"}},"required":["error","disclaimer","terms"]}}}}