{"openapi":"3.1.0","info":{"title":"Recurrence Expander","description":"Turn RFC 5545 RRULEs and cron expressions into exact UTC instants. IANA timezones and daylight saving are handled correctly. The two hard cases are flagged by name. A spring-forward time that never happens is flagged nonexistent. A fall-back time that happens twice is flagged ambiguous. Results are deterministic and reproducible. Every response reports the tzdata and library versions it used. Every response also carries an Ed25519-signed reproducibility receipt. The receipt binds the input hash, the output hash and the engine versions. WHAT YOU ARE NOT BUYING: secrecy. You can expand the rule yourself and check every instant we return. The fee buys current timezone data, the two daylight-saving edge cases handled rather than assumed, and a reproducible record of which versions produced the answer. Free preview endpoint at /v1/preview.\n\nOperated by Oddments. Paid per call in USDC on Base via x402.","version":"1.0.0","x-guidance":"POST /v1/expand expands RFC 5545 RRULEs and cron expressions into exact UTC instants for an IANA timezone, flagging DST-nonexistent and ambiguous wall times. Try /v1/preview free first: same response shape, 1 rule, 3 occurrences."},"paths":{"/":{"get":{"summary":"Index","operationId":"index__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/errors":{"get":{"summary":"Error Taxonomy","description":"R3 item 7. Free, so a buyer can read the failure modes before paying.","operationId":"error_taxonomy_v1_errors_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oddments-receipts.json":{"get":{"summary":"Receipt Key","operationId":"receipt_key__well_known_oddments_receipts_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/verify_receipt.py":{"get":{"summary":"Verifier Script","description":"The buyer-side checker, served as source. Handing the checker the check\nis the entire leg-6 argument; making them write it is not.","operationId":"verifier_script_verify_receipt_py_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/preview":{"post":{"summary":"Free preview: same shape, 1 rule, 3 occurrences","description":"Free sample. Same response shape as the paid endpoint, small limits.","operationId":"preview_v1_preview_post","responses":{"200":{"description":"Expanded occurrences, with a signed reproducibility receipt","content":{"application/json":{"schema":{"type":"object","properties":{"results":{"type":"array","description":"one entry per input rule, in input order","items":{"type":"object","properties":{"id":{"type":"string","description":"echoed from the request"},"tz":{"type":"string"},"kind":{"type":"string","description":"'cron' or 'rrule'"},"count":{"type":"integer"},"crosses_dst_transition":{"type":"boolean"},"anomalies":{"type":"array","items":{"type":"string"}},"occurrences":{"type":"array","items":{"type":"object","properties":{"local":{"type":"string","description":"ISO-8601 local wall time"},"utc":{"type":"string","description":"exact UTC instant"},"utc_offset":{"type":"string"},"is_dst":{"type":"boolean"},"flags":{"type":"array","items":{"type":"string"},"description":"e.g. nonexistent (spring forward), ambiguous (fall back)"}}}}}}},"total_occurrences":{"type":"integer"},"receipt":{"type":"object","description":"Ed25519 reproducibility receipt over this exact request/response pair. Present on every response from both the paid and the free endpoint. Proves origin and integrity, not correctness. Verify with the public key at /.well-known/oddments-receipts.json and the script at /verify_receipt.py.","properties":{"receipt_version":{"type":"string","description":"currently 'oddments-receipt/1'"},"service":{"type":"string"},"endpoint":{"type":"string","description":"the path that produced the response"},"price":{"type":"string","description":"what was charged; 'free' on the preview endpoint"},"issued_at":{"type":"string","description":"ISO-8601 UTC, signed"},"input_sha256":{"type":"string","description":"SHA-256 of the canonicalized request body"},"output_sha256":{"type":"string","description":"SHA-256 of the canonicalized response body with 'receipt' removed"},"engine":{"type":"object","description":"library and tzdata versions used, signed"},"key_id":{"type":"string"},"algorithm":{"type":"string","description":"Ed25519"},"public_key_b64":{"type":"string"},"signature_b64":{"type":"string"},"signed_fields":{"type":"array","items":{"type":"string"},"description":"exactly which fields the signature covers"},"canonicalization":{"type":"string","description":"the byte-exact rule used before signing"},"verify":{"type":"object","description":"public key URL, verifier script URL, and what it does and does not prove"}},"required":["receipt_version","input_sha256","output_sha256","signature_b64","signed_fields","key_id","algorithm"]}},"required":["results","total_occurrences","receipt"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"rules":{"type":"array","minItems":1,"maxItems":25,"items":{"type":"object","properties":{"id":{"type":"string","description":"echoed back to correlate results"},"cron":{"type":"string","description":"5-field POSIX cron (exclusive with rrule)"},"rrule":{"type":"string","description":"RFC 5545 RRULE (exclusive with cron)"},"tz":{"type":"string","description":"IANA zone, e.g. Europe/London"},"start":{"type":"string","description":"ISO-8601 local wall time, no offset"},"count":{"type":"integer","minimum":1,"maximum":500}},"required":["tz","start"]}},"limit":{"type":"integer","minimum":1,"maximum":500}},"required":["rules"]},"example":{"rules":[{"id":"standup","cron":"30 9 * * 1-5","tz":"America/New_York","start":"2026-03-06T00:00:00","count":5}]}}}}}},"/v1/expand":{"post":{"summary":"Expand recurrence rules to exact UTC instants (paid)","description":"Paid endpoint. Payment is enforced by the x402 middleware ahead of this.","operationId":"expand_paid_v1_expand_post","responses":{"200":{"description":"Expanded occurrences, with a signed reproducibility receipt","content":{"application/json":{"schema":{"type":"object","properties":{"results":{"type":"array","description":"one entry per input rule, in input order","items":{"type":"object","properties":{"id":{"type":"string","description":"echoed from the request"},"tz":{"type":"string"},"kind":{"type":"string","description":"'cron' or 'rrule'"},"count":{"type":"integer"},"crosses_dst_transition":{"type":"boolean"},"anomalies":{"type":"array","items":{"type":"string"}},"occurrences":{"type":"array","items":{"type":"object","properties":{"local":{"type":"string","description":"ISO-8601 local wall time"},"utc":{"type":"string","description":"exact UTC instant"},"utc_offset":{"type":"string"},"is_dst":{"type":"boolean"},"flags":{"type":"array","items":{"type":"string"},"description":"e.g. nonexistent (spring forward), ambiguous (fall back)"}}}}}}},"total_occurrences":{"type":"integer"},"receipt":{"type":"object","description":"Ed25519 reproducibility receipt over this exact request/response pair. Present on every response from both the paid and the free endpoint. Proves origin and integrity, not correctness. Verify with the public key at /.well-known/oddments-receipts.json and the script at /verify_receipt.py.","properties":{"receipt_version":{"type":"string","description":"currently 'oddments-receipt/1'"},"service":{"type":"string"},"endpoint":{"type":"string","description":"the path that produced the response"},"price":{"type":"string","description":"what was charged; 'free' on the preview endpoint"},"issued_at":{"type":"string","description":"ISO-8601 UTC, signed"},"input_sha256":{"type":"string","description":"SHA-256 of the canonicalized request body"},"output_sha256":{"type":"string","description":"SHA-256 of the canonicalized response body with 'receipt' removed"},"engine":{"type":"object","description":"library and tzdata versions used, signed"},"key_id":{"type":"string"},"algorithm":{"type":"string","description":"Ed25519"},"public_key_b64":{"type":"string"},"signature_b64":{"type":"string"},"signed_fields":{"type":"array","items":{"type":"string"},"description":"exactly which fields the signature covers"},"canonicalization":{"type":"string","description":"the byte-exact rule used before signing"},"verify":{"type":"object","description":"public key URL, verifier script URL, and what it does and does not prove"}},"required":["receipt_version","input_sha256","output_sha256","signature_b64","signed_fields","key_id","algorithm"]}},"required":["results","total_occurrences","receipt"]},"example":{"results":[{"id":"standup","tz":"America/New_York","kind":"cron","count":5,"crosses_dst_transition":true,"anomalies":[],"occurrences":[{"local":"2026-03-06T09:30:00","utc":"2026-03-06T14:30:00Z","utc_offset":"-05:00","is_dst":false,"flags":[]}]}],"total_occurrences":5,"receipt":{"receipt_version":"oddments-receipt/1","service":"Recurrence Expander","endpoint":"/v1/expand","price":"$0.02","issued_at":"2026-08-06T09:32:04.259588Z","input_sha256":"5db5c3766a334acfe412d182fee09843c9d1f8cfcf5cc707f206cb4d1f8deb79","output_sha256":"43b7eb2d6aba21f1a7ac4a6c51bee6990c9d7b41645865330a67e5f328c3b239","engine":{"python":"3.12.3","croniter":"6.0.0","tzdata":"2026.3"},"key_id":"21bd7c9628fe756b","algorithm":"Ed25519","signature_b64":"MWfephbP/QDn0vHusntmDIBdK+Vm4r2Dfdgy7Sxh5yUE1C3JNwjrrqMrmygcrIjAJsAT0sDdTWducb6+lNJfBA==","signed_fields":["endpoint","engine","input_sha256","issued_at","key_id","output_sha256","price","receipt_version","service"]}}}}},"402":{"description":"Payment Required"}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.020000"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"rules":{"type":"array","minItems":1,"maxItems":25,"items":{"type":"object","properties":{"id":{"type":"string","description":"echoed back to correlate results"},"cron":{"type":"string","description":"5-field POSIX cron (exclusive with rrule)"},"rrule":{"type":"string","description":"RFC 5545 RRULE (exclusive with cron)"},"tz":{"type":"string","description":"IANA zone, e.g. Europe/London"},"start":{"type":"string","description":"ISO-8601 local wall time, no offset"},"count":{"type":"integer","minimum":1,"maximum":500}},"required":["tz","start"]}},"limit":{"type":"integer","minimum":1,"maximum":500}},"required":["rules"]},"example":{"rules":[{"id":"standup","cron":"30 9 * * 1-5","tz":"America/New_York","start":"2026-03-06T00:00:00","count":5}]}}}}}},"/.well-known/x402":{"get":{"summary":"Well Known X402","description":"Compatibility discovery document (x402scan spec section B).\n\nHost-aware: a crawler that fetched this from the legacy exe.xyz origin is\ntold about the exe.xyz resource, which is the one it can actually reach at\nthe URL it used. See `base_for`.","operationId":"well_known_x402__well_known_x402_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/metrics":{"get":{"summary":"Metrics","description":"Live probe/settlement counters, straight off the event log.","operationId":"metrics_v1_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"servers":[{"url":"https://s1.oddments.ai"}]}