> **Note for Agents & LLMs**: This page has an LLM-friendly Markdown version. 
> For easier parsing and better context retention, use `/index.md` instead of `/index`.

# Jobs Done -- Cron-as-a-Service

Schedule webhooks. Ship faster.

Jobs Done is a reliable job scheduler. Register once, get an API key, and start firing cron-triggered HTTP callbacks in minutes -- no infrastructure required.

[**Get Started -- it's free**](#signup)

## Terminal Demo

```bash
# Register and get your API key
$ jobs_done user register "My App"
Name:    My App
API Key: jd_sk_8f3e...c21a

# Schedule a daily cron job
$ jobs_done cron create \
    --name "daily-report" \
    --cron "0 9 * * *" \
    --url "https://myapp.com/webhooks/daily"
{"id": 1, "name": "daily-report", "active": true}
```

---

## Features

### Everything you need to ship

A focused feature set -- no noise, no vendor lock-in.

#### [CLOCK] Persistent cron jobs
Create, pause, resume, and delete cron jobs live -- no redeploys needed. Standard 5-field cron expressions supported.

#### [RETRY] Automatic retries
Configure max attempts per job. Failed webhook calls are retried with exponential backoff.

#### [KEY] API key auth
Each user gets an isolated API key. All resources are strictly scoped -- you only see your own jobs.

#### [MAIL] One-off webhooks
Need a single fire-and-forget job? Use `POST /api/enqueue` or the CLI `enqueue` command.

#### [STATS] Job analytics
Track success, failure, and retry counts per cron job via `GET /api/users/me/stats`.

#### [BOOK] OpenAPI spec
Full OpenAPI 3.0 spec at `/api/openapi` with SwaggerUI included. Integrate in minutes with any language.

---

## How it works

### Up and running in 3 steps

#### 1. Register and get your API key

One `POST /api/users` call -- or one CLI command.

```bash
curl -X POST https://jobsdone.claudlabs.com/api/users -d '{"name":"My App"}' -H 'Content-Type: application/json'
```

#### 2. Create a cron job

Pass your webhook URL and a cron expression. We handle the rest.

```bash
curl -X POST .../api/crons -H 'X-API-Key: <key>' \
  -d '{"name":"ping","cron_expression":"* * * * *","webhook_url":"https://myapp.com/hook"}'
```

#### 3. Receive webhooks & check stats

Your endpoint receives a `POST` with the JSON body on schedule. Monitor with `GET /api/users/me/stats`.

---

## CLI & Automation

### A CLI built for developers & agents

The `jobs_done` CLI gives you full control from your terminal, CI pipeline, or LLM agent. JSON output everywhere -- pipe it, parse it, automate it.

### Key commands

```bash
# Register and get your API key
$ jobs_done user register "My App"
Name:    My App
API Key: jd_sk_8f3e...c21a

# Schedule a daily cron (fires at 09:00 UTC every day)
$ jobs_done cron create \
    --name "daily-report" \
    --cron "0 9 * * *" \
    --url "https://myapp.com/webhooks/daily"
{"id": 1, "name": "daily-report", "cron_expression": "0 9 * * *", "active": true}

# List all your cron jobs
$ jobs_done jobs list
[{"id":1,"name":"daily-report","active":true,"next_run":"2026-03-27T09:00:00Z"}]

# Enqueue a one-off job (idempotent -- safe to call multiple times)
$ jobs_done jobs enqueue \
    --id "send-welcome-email-user-123" \
    --url "https://myapp.com/webhooks/welcome"
{"logic_id": "send-welcome-email-user-123", "status": "scheduled"}
```

### [BOT] LLM & agent-friendly

Every command outputs clean JSON -- perfect for piping into `jq`, scripting in CI, or driving from an AI agent. Pass `--output json` to suppress any decorative output. The CLI is stateless and reads `JOBSDONE_API_KEY` from the environment -- no interactive prompts in automation mode.

---

## Docs & Best Practices

### Built for reliability

Zero infrastructure to manage. Jobs Done handles scheduling, retries, and delivery -- you just write the webhook handler.

#### [RETRY] Automatic retries & idempotency

If your webhook returns a non-2xx status code, Jobs Done automatically retries the delivery using **exponential backoff**. Your jobs run even if your server has a blip.

| Attempt | Delay |
|---------|-------|
| Attempt 1 | immediately |
| Attempt 2 | +30 seconds |
| Attempt 3 | +2 minutes |
| Attempt N | exponential backoff |

**Idempotent enqueue**: POST the same `logic_id` twice and you get the existing job back -- not a duplicate. Safe to call on every deploy or from retry loops in your own code.



## Pricing

### Pricing not defined yet

We are launching soon. Early users will get the lowest possible price -- starting at **$1/month**.

---

## Ready to schedule your first job?

No credit card required. Start in 60 seconds.

( signup form -- see HTML version )

---

## Footer

(c) 2026 Jobs Done.

- [Docs](#docs)
- [Contact](mailto:b@claudlabs.com)
