s1.oddments.ai
https://s1.oddments.ai/v1/expandTurn 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. WHAT THIS DOES NOT DO, stated up front. (1) It consults no calendar, holiday feed or exception list. It expands exactly the rule you send, so a cancellation you did not encode is invisible to it. (2) Timezone answers are only as current as the tzdata version reported in every response. A zone whose rules change after that release is computed on the old rules. (3) cron is the 5-field POSIX form only, as published in the request schema. No seconds field and no vendor extensions. (4) The signature proves origin and integrity, not correctness. (5) Rules are capped at 25 per call and 500 occurrences per rule. A request over either is refused with a 400 invalid_rule before any expansion happens. Free preview endpoint at /v1/preview.
Reliability & health
Uptime and response time from our own unpaid probes, plus the reliability score built from them.
Uptime
69.7% avgResponse time
p50 963ms · p95 1257msData table
| Bucket | Uptime | Probes | Response time |
|---|---|---|---|
| 8/13/2026, 7:00:00 PM | 100% | 1 | 945ms |
| 8/13/2026, 8:00:00 PM | 100% | 1 | 995ms |
| 8/13/2026, 9:00:00 PM | 100% | 1 | 1036ms |
| 8/13/2026, 10:00:00 PM | 100% | 1 | 971ms |
| 8/13/2026, 11:00:00 PM | 100% | 1 | 988ms |
| 8/14/2026, 12:00:00 AM | 100% | 1 | 994ms |
| 8/14/2026, 2:00:00 AM | 100% | 1 | 1013ms |
| 8/14/2026, 3:00:00 AM | 100% | 1 | 2241ms |
| 8/14/2026, 4:00:00 AM | 100% | 1 | 764ms |
| 8/14/2026, 5:00:00 AM | 100% | 1 | 963ms |
| 8/14/2026, 6:00:00 AM | 100% | 1 | 963ms |
| 8/14/2026, 7:00:00 AM | 100% | 1 | 784ms |
| 8/14/2026, 9:00:00 AM | 100% | 1 | 823ms |
| 8/14/2026, 10:00:00 AM | 100% | 1 | 971ms |
| 8/14/2026, 11:00:00 AM | 100% | 1 | 981ms |
| 8/14/2026, 12:00:00 PM | 100% | 1 | 976ms |
| 8/14/2026, 1:00:00 PM | 100% | 1 | 1007ms |
| 8/14/2026, 3:00:00 PM | 100% | 1 | 822ms |
| 8/14/2026, 4:00:00 PM | 100% | 1 | 2200ms |
| 8/14/2026, 5:00:00 PM | 100% | 1 | 991ms |
| 8/14/2026, 6:00:00 PM | 100% | 1 | 948ms |
| 8/14/2026, 7:00:00 PM | 100% | 1 | 1587ms |
| 8/14/2026, 8:00:00 PM | 100% | 1 | 977ms |
| 8/14/2026, 10:00:00 PM | 100% | 1 | 805ms |
| 8/14/2026, 11:00:00 PM | 100% | 1 | 881ms |
| 8/15/2026, 12:00:00 AM | 100% | 1 | 960ms |
| 8/15/2026, 1:00:00 AM | 100% | 1 | 959ms |
| 8/15/2026, 2:00:00 AM | 100% | 1 | 927ms |
| 8/15/2026, 3:00:00 AM | 100% | 1 | 1009ms |
| 8/15/2026, 4:00:00 AM | 100% | 1 | 918ms |
| 8/15/2026, 6:00:00 AM | 100% | 1 | 940ms |
| 8/15/2026, 7:00:00 AM | 100% | 1 | 962ms |
| 8/15/2026, 8:00:00 AM | 100% | 1 | 765ms |
| 8/15/2026, 9:00:00 AM | 100% | 1 | 968ms |
| 8/15/2026, 10:00:00 AM | 100% | 1 | 812ms |
| 8/15/2026, 11:00:00 AM | 100% | 1 | 787ms |
| 8/15/2026, 12:00:00 PM | 100% | 1 | 766ms |
| 8/15/2026, 2:00:00 PM | 100% | 1 | 777ms |
| 8/15/2026, 3:00:00 PM | 100% | 1 | 969ms |
| 8/15/2026, 4:00:00 PM | 100% | 1 | 940ms |
| 8/15/2026, 5:00:00 PM | 100% | 1 | 723ms |
| 8/15/2026, 6:00:00 PM | 100% | 1 | 996ms |
| 8/15/2026, 7:00:00 PM | 100% | 1 | 961ms |
| 8/15/2026, 9:00:00 PM | 100% | 1 | 975ms |
| 8/15/2026, 10:00:00 PM | 100% | 1 | 1037ms |
| 8/15/2026, 11:00:00 PM | 100% | 1 | 943ms |
| 8/16/2026, 12:00:00 AM | 100% | 1 | 996ms |
| 8/16/2026, 1:00:00 AM | 100% | 1 | 1005ms |
| 8/16/2026, 2:00:00 AM | 100% | 1 | 940ms |
| 8/16/2026, 4:00:00 AM | 100% | 1 | 720ms |
| 8/16/2026, 5:00:00 AM | 100% | 1 | 936ms |
| 8/16/2026, 6:00:00 AM | 100% | 1 | 976ms |
| 8/16/2026, 7:00:00 AM | 100% | 1 | 1018ms |
| 8/16/2026, 8:00:00 AM | 0% | 1 | — |
| 8/16/2026, 9:00:00 AM | 0% | 1 | — |
| 8/16/2026, 11:00:00 AM | 0% | 1 | — |
| 8/16/2026, 12:00:00 PM | 0% | 1 | — |
| 8/16/2026, 1:00:00 PM | 0% | 1 | — |
| 8/16/2026, 2:00:00 PM | 0% | 1 | — |
| 8/16/2026, 3:00:00 PM | 0% | 1 | — |
| 8/16/2026, 4:00:00 PM | 0% | 1 | — |
| 8/16/2026, 6:00:00 PM | 0% | 1 | — |
| 8/16/2026, 7:00:00 PM | 0% | 1 | — |
| 8/16/2026, 8:00:00 PM | 0% | 1 | — |
| 8/16/2026, 9:00:00 PM | 0% | 1 | — |
| 8/16/2026, 10:00:00 PM | 0% | 1 | — |
| 8/16/2026, 11:00:00 PM | 0% | 1 | — |
| 8/17/2026, 1:00:00 AM | 0% | 1 | — |
| 8/17/2026, 2:00:00 AM | 0% | 1 | — |
| 8/17/2026, 3:00:00 AM | 0% | 1 | — |
| 8/17/2026, 4:00:00 AM | 0% | 1 | — |
| 8/17/2026, 5:00:00 AM | 0% | 1 | — |
| 8/17/2026, 6:00:00 AM | 0% | 1 | — |
| 8/18/2026, 7:00:00 AM | 0% | 1 | — |
| 8/19/2026, 7:00:00 AM | 0% | 1 | — |
| 8/20/2026, 7:00:00 AM | 0% | 1 | — |
- Availability
- 44
- Latency
- 75
- Security
- 100
- Transparency
- 61
- Activity
- 9
How often it was reachable when we probed it (weight 35%).
How quickly it answers when it is up — fast scores high (weight 20%).
Whether it serves over working TLS / https (weight 15%).
Whether the operator disclosed what it does — description, schema, identity (weight 15%).
Observed on-chain payments to this endpoint's wallet — transactions, volume, and distinct paying wallets over the last month (weight 15%; not yet measured when we have not seen its wallet settle).
Confidence 18% — how much probe evidence backs this score. A thin history is flagged, not hidden.
See the scoring methodology for exactly how each number is computed.
Payment
- Currencies
- USDC
- Networks
- base
- Facilitator
- unknown
- SDK
- unknown
Operator
- Company
- inferred — unknown
- Jurisdiction
- —
- Registrar
- Cloudflare, Inc
- Domain registered
- 2026-08-05
- Hosting network
- —
- Hosting country
- —
Operator context is derived from public RDAP/TLS records and unverified. Company and country are only available for endpoints that publish them (an OV/EV TLS certificate or a non-redacted domain record); most endpoints are CDN-fronted and disclose neither.
On-chain activity (base)
Payments per day
last payment 8/15/2026Data table
| Day | Payments | Volume (USD) | Paying wallets |
|---|---|---|---|
| 8/6/2026 | 1 | 0.02 | 1 |
| 8/11/2026 | 4 | 0.08 | 1 |
| 8/13/2026 | 1 | 0.02 | 1 |
| 8/14/2026 | 1 | 0.02 | 1 |
| 8/15/2026 | 1 | 0.02 | 1 |
Only payments settled on chains and facilitators we index.
Response schema
{
"properties": {
"receipt": {
"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": {
"algorithm": {
"description": "Ed25519",
"type": "string"
},
"canonicalization": {
"description": "the byte-exact rule used before signing",
"type": "string"
},
"endpoint": {
"description": "the path that produced the response",
"type": "string"
},
"engine": {
"description": "library and tzdata versions used, signed",
"type": "object"
},
"input_sha256": {
"description": "SHA-256 of the canonicalized request body",
"type": "string"
},
"issued_at": {
"description": "ISO-8601 UTC, signed",
"type": "string"
},
"key_id": {
"description": "first 16 hex chars of SHA-256(public_key_b64); identifies which signing key was used",
"type": "string"
},
"output_sha256": {
"description": "SHA-256 of the canonicalized response body with 'receipt' removed",
"type": "string"
},
"price": {
"description": "what was charged; 'free' on the preview endpoint",
"type": "string"
},
"public_key_b64": {
"description": "base64-encoded raw Ed25519 public key that verifies signature_b64. Not itself a signed field -- trust it only after checking it (or key_id) against the current or previous key published at /.well-known/oddments-receipts.json.",
"type": "string"
},
"receipt_version": {
"description": "currently 'oddments-receipt/1'",
"type": "string"
},
"service": {
"description": "the service name that issued this receipt, e.g. 'Recurrence Expander'",
"type": "string"
},
"signature_b64": {
"description": "base64-encoded Ed25519 signature over the canonical JSON of the fields named in signed_fields",
"type": "string"
},
"signed_fields": {
"description": "exactly which fields the signature covers",
"items": {
"type": "string"
},
"type": "array"
},
"verify": {
"description": "public key URL, verifier script URL, and what it does and does not prove",
"type": "object"
}
},
"required": [
"receipt_version",
"input_sha256",
"output_sha256",
"signature_b64",
"signed_fields",
"key_id",
"algorithm"
],
"type": "object"
},
"results": {
"description": "one entry per input rule, in input order",
"items": {
"properties": {
"anomalies": {
"description": "the distinct occurrence flags seen across this rule's occurrences (nonexistent_local, ambiguous_local), sorted; empty if none",
"items": {
"type": "string"
},
"type": "array"
},
"count": {
"description": "number of occurrences returned for this rule",
"type": "integer"
},
"crosses_dst_transition": {
"description": "true if this rule's occurrences do not all share the same utc_offset, i.e. a DST transition falls within the expanded range",
"type": "boolean"
},
"id": {
"description": "echoed from the request",
"type": "string"
},
"kind": {
"description": "'cron' or 'rrule'",
"type": "string"
},
"occurrences": {
"description": "the expanded instants for this rule, in generation order, one per requested count",
"items": {
"properties": {
"flags": {
"description": "e.g. nonexistent (spring forward), ambiguous (fall back)",
"items": {
"type": "string"
},
"type": "array"
},
"is_dst": {
"description": "whether daylight saving was in effect at this occurrence",
"type": "boolean"
},
"local": {
"description": "ISO-8601 local wall time",
"type": "string"
},
"utc": {
"description": "exact UTC instant",
"type": "string"
},
"utc_offset": {
"description": "the UTC offset in effect at this occurrence, format +HH:MM or -HH:MM",
"type": "string"
}
},
"type": "object"
},
"type": "array"
},
"tz": {
"description": "the IANA zone this rule's occurrences were expanded in, echoed from the request",
"type": "string"
}
},
"type": "object"
},
"type": "array"
},
"total_occurrences": {
"description": "sum of occurrence counts across all results in this response",
"type": "integer"
}
},
"required": [
"results",
"total_occurrences",
"receipt"
],
"type": "object"
}