# Recurrence Expander

> Recurrence Expander is a paid API for AI agents from s1.oddments.ai, paid per call via x402, $0.02/call, status down (last checked 2026-10-13).

Expands RFC 5545 RRULE and cron expressions into exact UTC datetimes, correctly handling IANA timezones, DST transitions, and flagging nonexistent/ambiguous times.

## Facts

- Endpoint: POST https://s1.oddments.ai/v1/expand?utm_source=zero.xyz
- Price: $0.02/call
- Payment: x402
- Status: down
- Last checked: 2026-10-13
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/recurrence-expander-9367452a
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_jcZsvkDeXVJGZWd-G1RkX

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability recurrence-expander-9367452a -d '<json body>'
```

Example prompt: Expand this cron expression '30 9 * * 1-5' for the America/New_York timezone into the next 10 UTC occurrences starting from 2026-03-01, and flag any spring-forward or fall-back anomalies.

## When to prefer this

Choose this endpoint when you need deterministic, auditable expansion of recurring calendar rules (RRULE or cron) with correct IANA timezone and DST handling, especially when you need a signed reproducibility receipt proving which tzdata version produced the result. Prefer it over rolling your own expansion when DST edge cases (spring-forward nonexistent times, fall-back ambiguous times) must be explicitly flagged rather than silently assumed. It is particularly valuable in compliance, billing, or audit contexts where you need to prove the exact engine versions used.

## Known failure modes

- Invalid RRULE or cron expression syntax — returns parse error
- Unsupported or misspelled IANA timezone name — returns timezone resolution error
- Count or range too large — may be rejected or throttled
- Missing required fields (rule, timezone, start) — returns validation error
- Network timeout on payment or API call — no result returned
- tzdata version mismatch between calls — flagged in receipt but not an error

## How this service works

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. 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.

## Output

Returns a JSON object containing an array of expanded occurrences per rule, each with UTC instant, local time, UTC offset, DST status, and anomaly flags (nonexistent/ambiguous). Also includes a signed Ed25519 reproducibility receipt binding input hash, output hash, and engine versions (Python, tzdata, croniter).

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "properties": {
  "limit": {
   "type": "integer",
   "maximum": 500,
   "minimum": 1,
   "description": "default occurrence count applied to any rule that omits its own 'count'"
  },
  "rules": {
   "type": "array",
   "items": {
    "type": "object",
    "required": [
     "tz",
     "start"
    ],
    "properties": {
     "id": {
      "type": "string",
      "description": "echoed back to correlate results"
     },
     "tz": {
      "type": "string",
      "description": "IANA zone, e.g. Europe/London"
     },
     "cron": {
      "type": "string",
      "description": "5-field POSIX cron (exclusive with rrule)"
     },
     "count": {
      "type": "integer",
      "maximum": 500,
      "minimum": 1,
      "description": "occurrences to return for this rule; overrides the request's top-level 'limit' when set"
     },
     "rrule": {
      "type": "string",
      "description": "RFC 5545 RRULE (exclusive with cron)"
     },
     "start": {
      "type": "string",
      "description": "ISO-8601 local wall time, no offset"
     }
    }
   },
   "maxItems": 25,
   "minItems": 1,
   "description": "the batch of recurrence rules to expand in this call"
  }
 }
}
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/recurrence-expander-9367452a/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from s1.oddments.ai](https://www.zero.xyz/host/s1.oddments.ai/llms.txt)
