The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Cron402 listing page.
x402-native cron-as-a-service for AI agents. Agents schedule webhook calls and pay per run in USDC on Base via the x402 protocol — no accounts, no API keys. The wallet is the credential.
eip155:8453) — validated end-to-end on Sepolia first (settlement tx 0x01f7bed4…)CronJobDO). A cron-parser-computed next-run time is set as the DO's alarm() — exact to the minute for arbitrary cron expressions.paused; zero credits → exhausted.* * * * *) sweeps for missed alarms as a safety net.paused/exhausted jobs automatically.Paid endpoints are gated by @x402/hono v2 middleware:
402 Payment Required with instructions (price, network, payTo).Because the payer isn't online when an alarm fires, billing is prepaid run credits: creation includes 1 credit; packs of 1 / 10 / 100 cost $0.008 / $0.08 / $0.80. Credits never expire and top-ups are permissionless (anyone can fund any job).
Management actions (pause/resume/delete) require an EIP-712 signature over ManageJob { action, jobId, timestamp } from the payer key (±5 min validity).
| Endpoint | Auth | Price | Description |
|---|---|---|---|
POST /v1/crons | x402 | $0.008 | Create job (body: { schedule, target: { url, method?, headers?, body? }, maxRuns? }). Includes 1 run credit. |
POST /v1/crons/topup/1 | x402 | $0.008 | Add 1 credit (body: { jobId }) |
POST /v1/crons/topup/10 | x402 | $0.08 | Add 10 credits |
POST /v1/crons/topup/100 | x402 | $0.80 | Add 100 credits |
GET /v1/crons/:id | free | — | Job status, credits, last 20 executions |
POST /v1/crons/:id/pause | wallet-signed | — | Pause job |
POST /v1/crons/:id/resume | wallet-signed | — | Resume job (requires credits) |
DELETE /v1/crons/:id | wallet-signed | — | Delete job |
GET /health | free | — | Liveness probe |
POST /v1/echo | free | — | Test target for smoke tests |
Signed requests add two headers:
x-cron402-timestamp: unix ms (valid ±5 min)x-cron402-signature: EIP-712 signature, domain { name: "cron402", version: "1" }, primaryType ManageJob| Surface | URL |
|---|---|
| API (Cloudflare Workers) | https://cron402-api.user-defaults.workers.dev |
| Web (Vercel) | https://agentcron.site |
| OpenAPI spec | https://cron402-api.user-defaults.workers.dev/v1/openapi.json |
| Agent summary | https://agentcron.site/llms.txt |
| Job console | https://agentcron.site/dashboard |
Network: Base mainnet (eip155:8453) — flipped from Sepolia after a fully verified paid run. Receiving wallet secret PAY_TO_ADDRESS is set on the Worker. Facilitator: Coinbase CDP hosted (CDP_API_KEY_ID/CDP_API_KEY_SECRET secrets set; JWT auth implemented in src/cdp-auth.ts). D1 database cron402 (id b7e05d96-4737-4aa4-ab52-badcfacb3a22) holds the schema from both migrations.
Bazaar: bazaar extensions are declared via @x402/extensions/bazaar (info.input.type: "http"); listing appears after a successful CDP settle that echoes the extension — do not claim currently indexed until validated.
Pass optional notifyUrl when creating a job. After every fire, cron402 POSTs to it:
Notifications are best-effort (10s timeout, never affect scheduling).
/dashboard connects any injected EIP-1193 wallet (MetaMask etc.). Load a job by id to see status/credits/executions; pause/resume/delete request an eth_signTypedData_v4 signature over ManageJob — exactly what agents sign, just through a browser wallet.
cron402-mcp)Ten tools for any MCP client, designed so a small model can schedule a cron without burning money on mistakes:
| Tool | Cost | Purpose |
|---|---|---|
cron402_guide | free | The full procedure, prices and rules — what a model reads first |
check_wallet | free | Address, network, USDC/ETH balance, runs affordable |
preview_schedule | free | Validate a schedule, show the next 5 UTC run times |
create_cron | $0.008 | Create a job (includes 1 credit) |
topup_cron | $0.008–$0.80 | Add 1 / 10 / 100 credits |
get_cron | free | Status, credits, last 20 executions |
list_crons | free | Jobs created from this machine, with live status |
pause_cron · resume_cron · delete_cron | free | EIP-712 signed management |
What makes it usable by weak models:
"every 15 minutes", "every weekday at 9am", "every monday at 5pm", "weekly", or raw cron. Ambiguous input ("every 2 weeks", "at teatime") fails loudly with a suggested fix instead of silently scheduling the wrong time.timezone and the time-of-day is converted to the UTC cron the API stores, with the DST caveat spelled out in the response.preview_schedule costs nothing, and create_cron re-validates locally so a malformed schedule never reaches a paid request.PAID with the exact amount, and every response carries a next_step telling the model not to call them twice.{ ok, error, next_step } for insufficient funds, an unreachable API, a job owned by another wallet, or a localhost target.~/.cron402/jobs.json (override with CRON402_STATE_DIR) and list_crons reads them back.CRON402_PRIVATE_KEY no longer kills the server; free tools keep working and the paid ones explain what to configure.Paid calls flow through x402 automatically; management actions are signed locally.
skills/cron402)skills/cron402/SKILL.md teaches an agent the whole workflow — check wallet → preview → confirm → create → top up — plus the rules that keep it from double-charging. Drop it into any project:
See skills/README.md for other clients.
Install from npm:
MCP client config (Cursor / Claude Desktop):
Local dev from repo:
See packages/mcp/PUBLISHING.md for release instructions.
Env (optional overrides): CRON402_NETWORK (eip155:8453 mainnet default, eip155:84532 for Sepolia), CRON402_API_URL, CRON402_ABRA_PROJECT (default ai-cron-site). If CRON402_PRIVATE_KEY is already set in the environment, the vault lookup is skipped.
Agent wallet: 0xfD4AE5BD56d9BB939B95CCb870E0c97B62E0dC30 — stored encrypted in the abracadabra vault as ai-cron-site / EVM_PRIVATE_KEY. (It replaced 0x269B9678…, which was rotated out after its key was briefly committed to this repo and swept; never hardcode the key, read it from the vault.) On mainnet it needs mainnet USDC (0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913) + a little ETH for gas. This is the payer; revenue flows to the Worker's PAY_TO_ADDRESS secret.
Prereqs: Node 22+, pnpm 9+, Wrangler (bundled).
With SKIP_PAYMENTS=1 (local only), paid routes skip x402 verification and identify the payer via the x-payer header.
Quality gates: pnpm lint (Biome), pnpm check (tsc + svelte-check), pnpm build.
Edit apps/api/wrangler.jsonc: replace the placeholder database_id with the real one.
⚠️ Durable Object class
CronJobDOusesnew_sqlite_classes— if you rename it or add classes later, bump the migration tag.
Vars live in wrangler.jsonc / dashboard:
| Var | Values | Notes |
|---|---|---|
X402_NETWORK | eip155:84532 (sepolia) · eip155:8453 (mainnet) | must match payTo network |
SKIP_PAYMENTS | unset in prod! | only for local testing |
FACILITATOR_URL | facilitator base URL | see below |
Facilitator options
https://x402.org/facilitator — open, no auth, testnet only.CDP_API_KEY_ID + CDP_API_KEY_SECRET; the Worker then automatically switches to CdpFacilitatorClient (apps/api/src/facilitator.ts), which generates a per-request CDP JWT bound to each endpoint (/verify, /settle, /supported) via the uris claim. JWT signing is implemented on jose/WebCrypto in apps/api/src/cdp-auth.ts and supports both Ed25519 and EC (ES256) CDP keys.
FACILITATOR_URL if CDP exposes a different base path; default is https://api.cdp.coinbase.com/platform/v2/x402./docs on the site (uses @x402/fetch + Coinbase Agentic Wallet) pointed at your deployed Worker URL.402 → sign → retry succeeds, job appears, first fire lands within one minute, settlement logged in D1:PAY_TO_ADDRESS is a mainnet-controlled addressX402_NETWORK=eip155:8453packages/shared/src/index.ts (PRICE_PER_RUN_USD, pack prices in apps/api/src/index.ts TOPUP_PACKS)GET /v1/crons/:id; execution rows include status code, latency, error text.PRICE_PER_RUN_USD in shared + TOPUP_PACKS in the API together..dev.vars, .env* are gitignored; never commit keys.