Head to head · Human approval · October 2026 research run
Hatchet vs Restate
Restate scores 73.3 (BB) on agent readiness against Hatchet's 68.3 (B), and leads in 2 of 7 scored categories. Hatchet leads on transparency & trust. Both do human approval.
Best human approval and handoff for AI agents · All 45 human approval comparisons
Which one, for what
Hatchet B
Good for It suits a team already running background jobs or agent loops on Hatchet that wants an approval pause inside the same durable task, in Python, TypeScript, Go or Ruby.
Ahead on
- Transparency & trust, 71 against 50
Also in its favour
- A hosted endpoint, with nothing to install
- Runs on your own machine
- Open source
Watch for
No approver inbox, Slack or email channel, routing or reminder. The owner builds the request and the way the answer is pushed
Restate BB
Good for A team that already writes agent steps as durable handlers and wants a long, cheap wait for a human answer in TypeScript, Python, Java, Go or Rust, with the option to self-host.
Ahead on
- Reliability, 91 against 66
Also in its favour
- Agent-ready, a grade of BB or better
- Free to start without a card
Watch for
No reviewer inbox, Slack app or email. The approval request and the reply endpoint are the builder's code
Score by category
| Category | Weight this run | Hatchet | Restate | Edge |
|---|---|---|---|---|
| Reliability | 16%20 | 66 | 91 | Restate +25 |
| Performance | 10%pending | pending | pending | not scored in this run |
| Schema & documentation | 13%16.2 | 85 | 85 | even |
| Agent ergonomics | 13%16.2 | 82 | 81 | Hatchet +1 |
| Security & auth | 14%17.5 | 62 | 61 | Hatchet +1 |
| Payments & pricing | 10%12.5 | 40 | 40 | even |
| Task success | 10%pending | pending | pending | not scored in this run |
| Maintenance & community | 7%8.8 | 90 | 92 | Restate +2 |
| Transparency & trust | 7%8.8 | 71 | 50 | Hatchet +21 |
| Negative events | ≤15 | -2 | 0 | |
| Total | 68.3 · B | 73.3 · BB |
Facts side by side
| Fact | Hatchet | Restate |
|---|---|---|
| Kind | Model platform | Model platform |
| Vendor | Hatchet Technologies, Inc. | Restate GmbH |
| Hosted endpoint | https://cloud.hatchet.run | no (local only) |
| Transports | HTTP, stdio | HTTP |
| Auth | API key | API key |
| Pricing | Freemium | Freemium |
| x402 | no | no |
| Licence | MIT | BSL 1.1 converting to Apache-2.0 four years after release (server), MIT (SDKs) |
| Tools exposed | 7 | none |
| Read-only variant documented | no | no |
| llms.txt | yes | yes |
| Last release | 2026-10-08 | 2026-10-01 |
| Terms last updated | 2025-07-17 | couldn't be read |
| Privacy policy last updated | 2026-08-18 | no document linked |
| Customer content may train models | not found in the text | couldn't be read |
| Terms restrict automated access | not found in the text | couldn't be read |
| Terms restrict benchmarking | not found in the text | couldn't be read |
| Terms or service can change without notice | not found in the text | couldn't be read |
| Arbitration or class-action waiver | not found in the text | couldn't be read |
| Popularity | none | 4.5k stars, 329k npm/wk, 76k PyPI/wk |
Verdicts
Hatchet
A durable task waits for a keyed event without holding a worker slot, and resumes from its event log after a restart, in Python, TypeScript, Go or Ruby. Hatchet supplies only the pause and resume. It has no approver inbox, notification channel or record of who answered, and its MCP server cannot push the event.
Restate
An awakeable pauses a handler at no compute cost and resumes it from one HTTP request, with a durable timeout, on a free plan of 100,000 actions a month. Restate sends nothing to the approver, so the Slack message, email or inbox is the builder's code, and the published terms and privacy statement predate the paid plans.
Before you call either
Hatchet
- Put the approval wait in a durable task, and keep API calls, database reads and random values in child tasks, because the code between checkpoints is replayed
- Add a sleep condition in the same or group as the event condition to set a deadline, and treat the sleep firing first as a timeout
- Give the event a scope and the wait a lookback window when the answer can arrive before the wait starts. Both must be set together
- Filter with a CEL expression such as
input.user_id == '1234'so one approval key cannot resume another request's task - Push the answer with the SDK's event push or
POST /api/v1/tenants/{tenant}/events. The MCP server has no tool for it - Grant the MCP server one profile with
hatchet mcp auth --grant <profile>. It refuses profiles that were not granted
Restate
- Create the awakeable, send its ID inside
ctx.run, then await the promise, so a retry doesn't send a second approval request - Resolve with
POST /restate/awakeables/<id>/resolveand a JSON body, or/rejectwith a text reason, which throws a terminal error in the handler - On Restate Cloud send
Authorization: Bearer key_...tohttps://<env_id>.env.<region>.restate.cloud:8080. On a self-hosted server put an authenticating proxy in front of port 8080 - Wrap the wait in
orTimeoutand decide what a timeout means. Without it the handler waits with no limit - Retry ingress errors only on 408, 425, 429 or 5xx, and only when
x-restate-error-sourceisn'tinvocation
Questions
Which is better for AI agents, Hatchet or Restate?
Restate scores 73.3 (BB) on agent readiness against Hatchet's 68.3 (B), and leads in 2 of 7 scored categories. Hatchet leads on transparency & trust.
Are Hatchet and Restate open source?
Hatchet is open source (MIT). No open-source release is listed for Restate.
Other comparisons with Hatchet or Restate
- gotoHuman vs Hatchet
- gotoHuman vs Restate
- Hatchet vs Inngest
- Hatchet vs Orkes Conductor Human tasks
- Hatchet vs Permit MCP Gateway
- Hatchet vs Pushary
- Hatchet vs Temporal
- Hatchet vs Trigger.dev
- Hatchet vs withHuman
- Inngest vs Restate
- Orkes Conductor Human tasks vs Restate
- Permit MCP Gateway vs Restate
- Pushary vs Restate
- Restate vs Temporal
- Restate vs Trigger.dev
- Restate vs withHuman
Machine-readable
- This page as Markdown
/compare/hatchet-vs-restate.md· slim.min.md· JSON.json(or sendAccept: text/markdown) - Each listing in full
/api/v1/tools/hatchet.json·/api/v1/tools/restate.json - From a terminal
anchor compare hatchet restate(the CLI) - Over MCP
compare_tools {"a": "hatchet", "b": "restate"}at/mcp, no key