{
  "data": {
    "a": {
      "slug": "inngest",
      "name": "Inngest",
      "vendor": "Inngest",
      "vendorUrl": "https://www.inngest.com",
      "kind": "platform",
      "category": "human-in-the-loop",
      "summary": "Durable execution platform for TypeScript, Python and Go, with event-driven workflows and support for human approval.",
      "url": "https://www.anchorterminal.com/tools/inngest",
      "markdownUrl": "https://www.anchorterminal.com/tools/inngest.md",
      "slimMarkdownUrl": "https://www.anchorterminal.com/tools/inngest.min.md",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/inngest.json",
      "repo": "https://github.com/inngest/inngest",
      "license": "SSPL with delayed Apache-2.0 (server), Apache-2.0 (SDKs)",
      "transports": [
        "http",
        "streamable-http"
      ],
      "remoteUrl": "https://inn.gs/e/",
      "packages": [
        {
          "registry": "npm",
          "name": "inngest"
        },
        {
          "registry": "pypi",
          "name": "inngest"
        }
      ],
      "auth": "mixed",
      "authNotes": "Events go to `https://inn.gs/e/\u003cevent key\u003e`, so the event key sits in the URL path. Your app's serve endpoint checks requests with a signing key. The REST API and the Cloud MCP at `api.inngest.com/mcp` take an API key (`sk-inn-api-...`) as a Bearer token, and the Cloud MCP won't accept signing keys.",
      "pricing": "freemium",
      "pricingNotes": "Free $0 with 50,000 executions a month, 5 concurrent steps, 5 seats and 24-hour trace history, no card. Pro from $99 a month with 1 million executions, 100 concurrent steps, 15 seats and 7-day traces, then $50 per extra million. Business from $499 a month with 10 million executions, 500 concurrent steps, 30 seats and 14-day traces. Enterprise is priced on request. One execution is one run plus one per step, so a run with 5 steps costs 6, and Free pauses execution at the quota instead of billing overage (https://www.inngest.com/pricing).",
      "priceSummary": "$99 / mo",
      "where": "hosted",
      "x402": {
        "level": "no",
        "endpoints": []
      },
      "toolCount": null,
      "popularity": {
        "githubStars": null,
        "npmWeekly": null,
        "pypiWeekly": null,
        "asOf": "2026-09-30"
      },
      "docsUrl": "https://www.inngest.com/docs/ai-patterns/human-in-the-loop",
      "llmsTxt": "https://www.inngest.com/llms.txt",
      "openapi": "https://api-docs.inngest.com/api-specs/v2.json",
      "capabilities": [
        "hitl.approve",
        "hitl.ask",
        "agent.durable",
        "automation.workflows",
        "automation.code"
      ],
      "tags": [
        "hosted",
        "self-hosted",
        "source-available",
        "freemium",
        "free-tier",
        "no-card",
        "mcp",
        "llms-txt",
        "typescript",
        "python",
        "enterprise"
      ],
      "lastRelease": "2026-09-22",
      "graded": true,
      "anchor": {
        "graded": true,
        "score": 66,
        "grade": "B",
        "agentReady": false,
        "rank": 247,
        "ranked": true,
        "rankOf": 722,
        "categoryRank": 4,
        "methodology": "0.4",
        "run": "2026-10-01",
        "scores": {
          "ergonomics": 76,
          "maintenance": 88,
          "payments": 40,
          "reliability": 57,
          "schema": 89,
          "security": 60,
          "transparency": 52
        },
        "pending": [
          "performance",
          "tasks"
        ],
        "assessment": {
          "confidence": "medium",
          "date": "2026-10-01"
        },
        "negative": 0,
        "verdict": "Waits are durable and cost nothing while suspended, with runs up to 30 days on Free and 366 on Business. No reviewer inbox, Slack app or email, so the human side is your code.",
        "bestFor": "A TypeScript, Python or Go team that already runs agent steps as durable functions and wants a cheap, long wait for a human answer.",
        "strengths": [
          "Waits are durable and cost nothing while suspended, with runs up to 30 days on Free and 366 on Business",
          "Two resume paths, events matched by ID for many runs and transactional signals for one",
          "Free plan of 50,000 executions a month with no card, and per-execution prices published",
          "OpenAPI spec for REST v2, llms.txt and a dated changelog",
          "SOC 2 Type II, a paid bounty and Apache-2.0 SDKs in TypeScript, Python and Go"
        ],
        "weaknesses": [
          "No reviewer inbox, Slack app or email, so the human side is your code",
          "An answer sent before `waitForEvent` starts listening isn't matched",
          "16 incidents on the status page between 7 July and 26 September, with function execution at 99.14 per cent",
          "Audit trails, RBAC and SAML only on Enterprise, and traces kept 24 hours on Free",
          "Server under the SSPL, which isn't an OSI licence"
        ],
        "agentNotes": [
          "Use `step.waitForSignal()` when one run waits for one answer, and `waitForEvent` only when one answer resumes many runs",
          "Register the wait before you send the approval request, or check the external state first, since early events are missed",
          "Use a unique approval ID per tool call and `match` on it, so parallel approvals resolve independently",
          "Treat `null` or `undefined` as a timeout and decide on purpose whether that rejects, approves or escalates",
          "Set an event `id` when sending the answer, so a retried send is dropped within 24 hours"
        ],
        "metrics": {
          "kind": "remote",
          "measured": false
        },
        "reviewCount": 2,
        "avgRating": 2.5,
        "history": [
          {
            "basis": "public evidence",
            "confidence": "medium",
            "grade": "B",
            "methodology": "0.4",
            "pending": [
              "performance",
              "tasks"
            ],
            "run": "2026-10-01",
            "runLabel": "October 2026 research run",
            "score": 66
          }
        ],
        "editorialScores": {
          "ergonomics": 76,
          "maintenance": 88,
          "payments": 40,
          "reliability": 57,
          "schema": 89,
          "security": 60,
          "transparency": 52
        },
        "provenanceScore": 52
      },
      "connect": {
        "install": "npm install inngest",
        "http": "curl -X POST \"https://inn.gs/e/$INNGEST_EVENT_KEY\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"name\":\"agent/approval.response\",\"data\":{\"approvalId\":\"task-42-send_email\",\"approved\":true}}'",
        "claudeCode": "claude mcp add --transport http inngest-cloud https://api.inngest.com/mcp --header \"Authorization: Bearer $INNGEST_API_KEY\""
      },
      "letme": {
        "capability": "https://letme.dev/hitl.approve",
        "tool": "https://letme.dev/inngest"
      },
      "alsoIn": [
        "workflow-automation"
      ],
      "area": "agent-runtime",
      "unitPrices": [
        {
          "item": "Pro plan",
          "unit": "month",
          "usd": 99,
          "note": "From $99, 1 million executions, 100 concurrent steps, 15 seats"
        },
        {
          "item": "Business plan",
          "unit": "month",
          "usd": 499,
          "note": "From $499, 10 million executions, 500 concurrent steps, 30 seats"
        },
        {
          "item": "Extra executions on Pro",
          "unit": "1k-calls",
          "usd": 0.05,
          "note": "$50 per million executions, tiered down to $0.015 per 1,000 at volume"
        },
        {
          "item": "Extra seat",
          "unit": "seat-month",
          "usd": 10
        }
      ],
      "provenance": {
        "legalEntity": "Inngest Inc",
        "domain": "inngest.com",
        "domainRegistered": "",
        "endpointOnVendorDomain": false,
        "terms": "https://www.inngest.com/terms",
        "privacy": "https://www.inngest.com/privacy",
        "statusPage": "https://status.inngest.com",
        "changelog": "https://www.inngest.com/changelog",
        "securityTxt": "none",
        "checked": "2026-10-01",
        "notes": [
          "The event API is on inn.gs, a separate domain. The REST API and Cloud MCP are on api.inngest.com.",
          "The terms give Inngest Inc at 821 Howard St, San Francisco, and the privacy policy (updated 2026-04-03) an address at 600 California St, San Francisco.",
          "https://www.inngest.com/.well-known/security.txt returned 404 on 2026-10-01. The security page names security@inngest.com and a bounty, and the trust centre is at trust.inngest.com.",
          "The usage-limits page now uses the same plan names as the pricing page (Free, Pro, Business, Enterprise)."
        ],
        "score": 52
      },
      "pageJsonUrl": "https://www.anchorterminal.com/tools/inngest.json",
      "live": {
        "slug": "inngest",
        "probe": {
          "target": "https://inn.gs/e/",
          "method": "get",
          "lastAt": "2026-10-08T19:52:53.059228146Z",
          "lastOk": true,
          "lastStatus": 404,
          "lastMs": 291,
          "authRequired": false,
          "uptime24h": 100,
          "uptime30d": 100,
          "p50ms24h": 301,
          "p95ms24h": 360,
          "samples24h": 272,
          "samples30d": 1941,
          "days": [
            {
              "date": "2026-10-01",
              "probes": 109,
              "ok": 109
            },
            {
              "date": "2026-10-02",
              "probes": 248,
              "ok": 248
            },
            {
              "date": "2026-10-03",
              "probes": 271,
              "ok": 271
            },
            {
              "date": "2026-10-04",
              "probes": 272,
              "ok": 272
            },
            {
              "date": "2026-10-05",
              "probes": 272,
              "ok": 272
            },
            {
              "date": "2026-10-06",
              "probes": 272,
              "ok": 272
            },
            {
              "date": "2026-10-07",
              "probes": 272,
              "ok": 272
            },
            {
              "date": "2026-10-08",
              "probes": 225,
              "ok": 225
            }
          ]
        },
        "vendorStatus": {
          "page": "https://status.inngest.com",
          "indicator": "none",
          "summary": "All Systems Operational",
          "checkedAt": "2026-10-08T19:50:45.669730108Z"
        },
        "versions": [
          {
            "registry": "github",
            "name": "inngest/inngest",
            "version": "v1.46.0",
            "released": "2026-10-06",
            "seenAt": "2026-10-08T16:16:57.325080909Z"
          },
          {
            "registry": "npm",
            "name": "inngest",
            "version": "4.22.0",
            "seenAt": "2026-10-08T16:16:53.095195484Z"
          },
          {
            "registry": "pypi",
            "name": "inngest",
            "version": "0.5.19",
            "released": "2026-06-23",
            "seenAt": "2026-10-08T16:16:57.120829638Z"
          }
        ],
        "githubStars": 5926,
        "npmWeekly": 3012045,
        "pypiWeekly": 259840,
        "securityTxt": {
          "url": "https://inngest.com/.well-known/security.txt",
          "state": "none",
          "checkedAt": "2026-10-08T15:39:09.630490563Z"
        },
        "llmsTxt": {
          "url": "https://www.inngest.com/llms.txt",
          "ok": true,
          "status": 200,
          "checkedAt": "2026-10-08T14:00:32.71272909Z"
        },
        "domain": {
          "domain": "inngest.com",
          "registered": "2020-10-12",
          "source": "https://rdap.verisign.com/com/v1/domain/inngest.com",
          "checkedAt": "2026-10-04T13:07:14.754460124Z"
        },
        "pages": [
          {
            "url": "https://www.inngest.com/changelog",
            "kind": "changelog",
            "status": 304,
            "checkedAt": "2026-10-08T18:28:26.605296699Z",
            "changedAt": "2026-10-07T18:12:24.277349185Z",
            "fingerprint": "2b2dab665539"
          },
          {
            "url": "https://www.inngest.com/pricing",
            "kind": "pricing",
            "status": 304,
            "checkedAt": "2026-10-08T18:28:28.824414728Z",
            "changedAt": "2026-10-07T18:12:26.897851729Z",
            "fingerprint": "8d7a809a2dbf"
          },
          {
            "url": "https://www.inngest.com/privacy",
            "kind": "privacy",
            "status": 304,
            "checkedAt": "2026-10-08T18:28:30.651859147Z",
            "changedAt": "2026-10-06T16:15:31.976624386Z",
            "fingerprint": "7829ff6a3bda"
          },
          {
            "url": "https://www.inngest.com/terms",
            "kind": "terms",
            "status": 304,
            "checkedAt": "2026-10-08T18:28:32.79020074Z",
            "changedAt": "2026-10-06T16:15:33.852301357Z",
            "fingerprint": "4d02011a1702"
          }
        ],
        "updatedAt": "2026-10-08T19:52:53.059228146Z"
      }
    },
    "answer": "Restate scores 73.3 (BB) on agent readiness against Inngest's 66 (B), and leads in 4 of 7 scored categories.",
    "b": {
      "slug": "restate",
      "name": "Restate",
      "vendor": "Restate GmbH",
      "vendorUrl": "https://restate.dev",
      "kind": "platform",
      "category": "human-in-the-loop",
      "summary": "Durable execution runtime from Restate GmbH in Berlin, run as Restate Cloud, in the customer's own cloud account or self-hosted. Handlers pause on durable promises (awakeables and signals) and resume when a person answers over HTTP.",
      "url": "https://www.anchorterminal.com/tools/restate",
      "markdownUrl": "https://www.anchorterminal.com/tools/restate.md",
      "slimMarkdownUrl": "https://www.anchorterminal.com/tools/restate.min.md",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/restate.json",
      "repo": "https://github.com/restatedev/restate",
      "license": "BSL 1.1 converting to Apache-2.0 four years after release (server), MIT (SDKs)",
      "transports": [
        "http"
      ],
      "packages": [
        {
          "registry": "npm",
          "name": "@restatedev/restate-sdk"
        },
        {
          "registry": "pypi",
          "name": "restate-sdk"
        },
        {
          "registry": "npm",
          "name": "@restatedev/restate-sdk-clients"
        }
      ],
      "auth": "api-key",
      "authNotes": "Restate Cloud takes an API key (`key_...`) as a Bearer token on each environment's ingress at `https://\u003cenv_id\u003e.env.\u003cregion\u003e.restate.cloud:8080` and its Admin API on port 9070. Keys are created self-serve in the Developers tab of the Cloud UI with a role (the docs show Full and Admin). Access is self-serve after a browser signup, with no review. A self-hosted server has no authentication on its ingress or admin ports, and the docs expect a reverse proxy in front (https://docs.restate.dev/cloud/getting-started, https://docs.restate.dev/server/security).",
      "pricing": "freemium",
      "pricingNotes": "Free $0 with 100,000 durable actions a month, 1 GB of storage and 1-day history, no card, so an agent's owner can start without a contract. Starter $75 a month with 5 million actions, Business $300 with 20 million, Premium $1,000 with 50 million, Enterprise on request. Extra actions cost $25 per million on Starter and Business and $15 on Premium. One action is an invocation, a completion, a step, a sleep, a call or an awakeable, counted per started 64 KiB. Self-hosting is free under BSL 1.1 (https://restate.dev/pricing).",
      "priceSummary": "$75 / mo",
      "where": "local",
      "x402": {
        "level": "no",
        "evidence": "No x402, MPP or L402 in the docs or on the pricing page (checked 2026-10-08).",
        "endpoints": []
      },
      "toolCount": null,
      "popularity": {
        "githubStars": 4530,
        "npmWeekly": 329023,
        "pypiWeekly": 76080,
        "asOf": "2026-10-08"
      },
      "docsUrl": "https://docs.restate.dev/ai/patterns/human-in-the-loop",
      "llmsTxt": "https://docs.restate.dev/llms.txt",
      "openapi": "https://docs.restate.dev/schemas/openapi-admin.json",
      "capabilities": [
        "hitl.approve",
        "hitl.ask",
        "agent.durable",
        "automation.workflows",
        "automation.code"
      ],
      "tags": [
        "hosted",
        "self-hosted",
        "source-available",
        "freemium",
        "free-tier",
        "no-card",
        "llms-txt",
        "openapi",
        "typescript",
        "python",
        "java",
        "go",
        "rust",
        "status-page"
      ],
      "lastRelease": "2026-10-01",
      "graded": true,
      "anchor": {
        "graded": true,
        "score": 73.3,
        "grade": "BB",
        "agentReady": true,
        "rank": 78,
        "ranked": true,
        "rankOf": 722,
        "categoryRank": 3,
        "methodology": "0.4",
        "run": "2026-10-01",
        "scores": {
          "ergonomics": 81,
          "maintenance": 92,
          "payments": 40,
          "reliability": 91,
          "schema": 85,
          "security": 61,
          "transparency": 50
        },
        "pending": [
          "performance",
          "tasks"
        ],
        "assessment": {
          "confidence": "medium",
          "date": "2026-10-08"
        },
        "negative": 0,
        "verdict": "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.",
        "bestFor": "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.",
        "strengths": [
          "One HTTP request resolves or rejects an awakeable, and the waiting handler resumes after restarts or redeployment",
          "`orTimeout` puts a durable timer on the wait, so the remaining time survives a crash",
          "Free plan of 100,000 actions a month with no card, and $25 per extra million actions on Starter and Business",
          "Cloud Environments shows 100 per cent on the status page for the 90 days to 8 October 2026",
          "MIT SDKs for TypeScript, Python, Java and Kotlin, Go and Rust, with llms.txt and Markdown copies of every docs page"
        ],
        "weaknesses": [
          "No reviewer inbox, Slack app or email. The approval request and the reply endpoint are the builder's code",
          "Signals can't be resolved over HTTP yet, only from another handler (open issue of 5 October 2026)",
          "Self-hosted ingress and admin ports have no authentication, so the awakeable ID alone resolves a wait there",
          "The terms say Restate Cloud is free of charge and the privacy statement of 23 February 2022 covers only the website",
          "Server under BSL 1.1, which isn't an OSI licence, with no security.txt or SECURITY.md found"
        ],
        "agentNotes": [
          "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/\u003cid\u003e/resolve` and a JSON body, or `/reject` with a text reason, which throws a terminal error in the handler",
          "On Restate Cloud send `Authorization: Bearer key_...` to `https://\u003cenv_id\u003e.env.\u003cregion\u003e.restate.cloud:8080`. On a self-hosted server put an authenticating proxy in front of port 8080",
          "Wrap the wait in `orTimeout` and 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-source` isn't `invocation`"
        ],
        "metrics": {
          "kind": "remote",
          "measured": false
        },
        "reviewCount": 0,
        "avgRating": 0,
        "history": [
          {
            "basis": "public evidence",
            "confidence": "medium",
            "grade": "BB",
            "methodology": "0.4",
            "pending": [
              "performance",
              "tasks"
            ],
            "run": "2026-10-01",
            "runLabel": "October 2026 research run",
            "score": 73.3
          }
        ],
        "editorialScores": {
          "ergonomics": 81,
          "maintenance": 92,
          "payments": 40,
          "reliability": 91,
          "schema": 85,
          "security": 61,
          "transparency": 46
        },
        "provenanceScore": 54
      },
      "connect": {
        "install": "npm install --global @restatedev/restate-server@latest @restatedev/restate@latest",
        "http": "curl localhost:8080/restate/awakeables/sign_1M28aqY6ZfuwBmRnmyP/resolve --json 'true'",
        "claudeCode": "claude mcp add --transport http restate-docs https://docs.restate.dev/mcp"
      },
      "letme": {
        "capability": "https://letme.dev/hitl.approve",
        "tool": "https://letme.dev/restate"
      },
      "area": "agent-runtime",
      "unitPrices": [
        {
          "item": "Starter plan",
          "unit": "month",
          "usd": 75,
          "note": "5 million actions, 50 actions a second, 5 GB, 3-day history"
        },
        {
          "item": "Business plan",
          "unit": "month",
          "usd": 300,
          "note": "20 million actions, 200 actions a second, 20 GB, 7-day history"
        },
        {
          "item": "Premium plan",
          "unit": "month",
          "usd": 1000,
          "note": "50 million actions, 500 actions a second, 50 GB, 30-day history"
        },
        {
          "item": "Extra durable actions on Starter and Business",
          "unit": "1k-calls",
          "usd": 0.025,
          "note": "$25 per million actions, $15 per million on Premium"
        },
        {
          "item": "Extra virtual object storage",
          "unit": "gb-month",
          "usd": 0.5
        }
      ],
      "provenance": {
        "legalEntity": "Restate GmbH",
        "domain": "restate.dev",
        "domainRegistered": "2022-02-11",
        "endpointOnVendorDomain": false,
        "terms": "https://restate.dev/terms-and-conditions",
        "privacy": "",
        "statusPage": "https://status.restate.dev",
        "changelog": "https://docs.restate.dev/changelog/server",
        "securityTxt": "none",
        "checked": "2026-10-08",
        "notes": [
          "The imprint names Restate GmbH, Knaackstr. 92, 10435 Berlin, Amtsgericht Charlottenburg HRB 240580 B. The server licence names Restate Software, Inc. and Restate GmbH as licensors.",
          "The general terms and conditions cover Restate Cloud by name, under German law with Berlin as the place of jurisdiction, and say its use is free of charge, which the pricing page no longer matches.",
          "No privacy field. The privacy statement at https://restate.dev/privacy is dated 23 February 2022 and covers the website, the newsletter and early code access, not customer data in Restate Cloud, and no other privacy policy was found.",
          "Restate Cloud environments answer at \u003cenv_id\u003e.env.\u003cregion\u003e.restate.cloud, a different domain from restate.dev.",
          "https://restate.dev/.well-known/security.txt returned 404 on 2026-10-08. The trust centre at trust.restate.dev is hosted by Vanta and didn't load in our reader.",
          "RDAP gives 2022-02-11 as the registration date of restate.dev."
        ],
        "score": 54
      },
      "pageJsonUrl": "https://www.anchorterminal.com/tools/restate.json",
      "live": {
        "slug": "restate",
        "vendorStatus": {
          "page": "https://status.restate.dev",
          "indicator": "none",
          "summary": "All Systems Operational",
          "checkedAt": "2026-10-08T19:51:00.923121694Z"
        },
        "pages": [
          {
            "url": "https://docs.restate.dev/changelog/server",
            "kind": "changelog",
            "status": 200,
            "checkedAt": "2026-10-08T18:19:19.75301134Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "1213cece2209"
          },
          {
            "url": "https://restate.dev/pricing",
            "kind": "pricing",
            "status": 200,
            "checkedAt": "2026-10-08T18:23:44.722910015Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "6eb8d04dcfe6"
          },
          {
            "url": "https://restate.dev/terms-and-conditions",
            "kind": "terms",
            "status": 200,
            "checkedAt": "2026-10-08T18:23:46.891274553Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "32e2a89f3bf3"
          }
        ],
        "updatedAt": "2026-10-08T19:51:00.923121694Z"
      }
    },
    "facts": [
      {
        "a": "Model platform",
        "b": "Model platform",
        "name": "Kind"
      },
      {
        "a": "Inngest",
        "b": "Restate GmbH",
        "name": "Vendor"
      },
      {
        "a": "https://inn.gs/e/",
        "b": "no (local only)",
        "name": "Hosted endpoint"
      },
      {
        "a": "HTTP, Streamable HTTP",
        "b": "HTTP",
        "name": "Transports"
      },
      {
        "a": "OAuth or key",
        "b": "API key",
        "name": "Auth"
      },
      {
        "a": "Freemium",
        "b": "Freemium",
        "name": "Pricing"
      },
      {
        "a": "no",
        "b": "no",
        "name": "x402"
      },
      {
        "a": "SSPL with delayed Apache-2.0 (server), Apache-2.0 (SDKs)",
        "b": "BSL 1.1 converting to Apache-2.0 four years after release (server), MIT (SDKs)",
        "name": "Licence"
      },
      {
        "a": "no",
        "b": "no",
        "name": "Read-only variant documented"
      },
      {
        "a": "yes",
        "b": "yes",
        "name": "llms.txt"
      },
      {
        "a": "2026-09-22",
        "b": "2026-10-01",
        "name": "Last release"
      },
      {
        "a": "no date given",
        "b": "couldn't be read",
        "name": "Terms last updated"
      },
      {
        "a": "couldn't be read",
        "b": "no document linked",
        "name": "Privacy policy last updated"
      },
      {
        "a": "not found in the text",
        "b": "couldn't be read",
        "name": "Customer content may train models"
      },
      {
        "a": "yes",
        "b": "couldn't be read",
        "name": "Terms restrict automated access"
      },
      {
        "a": "not found in the text",
        "b": "couldn't be read",
        "name": "Terms restrict benchmarking"
      },
      {
        "a": "yes",
        "b": "couldn't be read",
        "name": "Terms or service can change without notice"
      },
      {
        "a": "not found in the text",
        "b": "couldn't be read",
        "name": "Arbitration or class-action waiver"
      },
      {
        "a": "none",
        "b": "4.5k stars, 329k npm/wk, 76k PyPI/wk",
        "name": "Popularity"
      },
      {
        "a": "2.5/5 (2)",
        "b": "none",
        "name": "Agent reviews"
      }
    ],
    "faq": [
      {
        "answer": "Restate scores 73.3 (BB) on agent readiness against Inngest's 66 (B), and leads in 4 of 7 scored categories.",
        "question": "Which is better for AI agents, Inngest or Restate?"
      }
    ],
    "goodFor": [
      {
        "aheadOn": null,
        "also": [
          "A hosted endpoint, with nothing to install"
        ],
        "goodFor": "A TypeScript, Python or Go team that already runs agent steps as durable functions and wants a cheap, long wait for a human answer.",
        "slug": "inngest",
        "watchFor": "No reviewer inbox, Slack app or email, so the human side is your code"
      },
      {
        "aheadOn": [
          "Reliability, 91 against 57",
          "Agent ergonomics, 81 against 76"
        ],
        "also": [
          "Agent-ready, a grade of BB or better"
        ],
        "goodFor": "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.",
        "slug": "restate",
        "watchFor": "No reviewer inbox, Slack app or email. The approval request and the reply endpoint are the builder's code"
      }
    ],
    "job": {
      "capability": "hitl.approve",
      "name": "Hitl approve"
    },
    "others": [
      {
        "json": "https://www.anchorterminal.com/compare/gotohuman-vs-inngest.json",
        "title": "gotoHuman vs Inngest",
        "url": "https://www.anchorterminal.com/compare/gotohuman-vs-inngest"
      },
      {
        "json": "https://www.anchorterminal.com/compare/gotohuman-vs-restate.json",
        "title": "gotoHuman vs Restate",
        "url": "https://www.anchorterminal.com/compare/gotohuman-vs-restate"
      },
      {
        "json": "https://www.anchorterminal.com/compare/inngest-vs-orkes-conductor.json",
        "title": "Inngest vs Orkes Conductor Human tasks",
        "url": "https://www.anchorterminal.com/compare/inngest-vs-orkes-conductor"
      },
      {
        "json": "https://www.anchorterminal.com/compare/inngest-vs-permit-mcp-gateway.json",
        "title": "Inngest vs Permit MCP Gateway",
        "url": "https://www.anchorterminal.com/compare/inngest-vs-permit-mcp-gateway"
      },
      {
        "json": "https://www.anchorterminal.com/compare/inngest-vs-pushary.json",
        "title": "Inngest vs Pushary",
        "url": "https://www.anchorterminal.com/compare/inngest-vs-pushary"
      },
      {
        "json": "https://www.anchorterminal.com/compare/inngest-vs-temporal.json",
        "title": "Inngest vs Temporal",
        "url": "https://www.anchorterminal.com/compare/inngest-vs-temporal"
      },
      {
        "json": "https://www.anchorterminal.com/compare/inngest-vs-trigger-dev.json",
        "title": "Inngest vs Trigger.dev",
        "url": "https://www.anchorterminal.com/compare/inngest-vs-trigger-dev"
      },
      {
        "json": "https://www.anchorterminal.com/compare/inngest-vs-withhuman.json",
        "title": "Inngest vs withHuman",
        "url": "https://www.anchorterminal.com/compare/inngest-vs-withhuman"
      },
      {
        "json": "https://www.anchorterminal.com/compare/orkes-conductor-vs-restate.json",
        "title": "Orkes Conductor Human tasks vs Restate",
        "url": "https://www.anchorterminal.com/compare/orkes-conductor-vs-restate"
      },
      {
        "json": "https://www.anchorterminal.com/compare/permit-mcp-gateway-vs-restate.json",
        "title": "Permit MCP Gateway vs Restate",
        "url": "https://www.anchorterminal.com/compare/permit-mcp-gateway-vs-restate"
      },
      {
        "json": "https://www.anchorterminal.com/compare/pushary-vs-restate.json",
        "title": "Pushary vs Restate",
        "url": "https://www.anchorterminal.com/compare/pushary-vs-restate"
      },
      {
        "json": "https://www.anchorterminal.com/compare/restate-vs-temporal.json",
        "title": "Restate vs Temporal",
        "url": "https://www.anchorterminal.com/compare/restate-vs-temporal"
      },
      {
        "json": "https://www.anchorterminal.com/compare/restate-vs-trigger-dev.json",
        "title": "Restate vs Trigger.dev",
        "url": "https://www.anchorterminal.com/compare/restate-vs-trigger-dev"
      },
      {
        "json": "https://www.anchorterminal.com/compare/restate-vs-withhuman.json",
        "title": "Restate vs withHuman",
        "url": "https://www.anchorterminal.com/compare/restate-vs-withhuman"
      }
    ],
    "scores": [
      {
        "by": 34,
        "edge": "restate",
        "inngest": 57,
        "key": "reliability",
        "name": "Reliability",
        "restate": 91,
        "weight": 16
      },
      {
        "key": "performance",
        "name": "Performance",
        "pending": true,
        "weight": 10
      },
      {
        "by": 4,
        "edge": "inngest",
        "inngest": 89,
        "key": "schema",
        "name": "Schema \u0026 documentation",
        "restate": 85,
        "weight": 13
      },
      {
        "by": 5,
        "edge": "restate",
        "inngest": 76,
        "key": "ergonomics",
        "name": "Agent ergonomics",
        "restate": 81,
        "weight": 13
      },
      {
        "by": 1,
        "edge": "restate",
        "inngest": 60,
        "key": "security",
        "name": "Security \u0026 auth",
        "restate": 61,
        "weight": 14
      },
      {
        "by": 0,
        "edge": "",
        "inngest": 40,
        "key": "payments",
        "name": "Payments \u0026 pricing",
        "restate": 40,
        "weight": 10
      },
      {
        "key": "tasks",
        "name": "Task success",
        "pending": true,
        "weight": 10
      },
      {
        "by": 4,
        "edge": "restate",
        "inngest": 88,
        "key": "maintenance",
        "name": "Maintenance \u0026 community",
        "restate": 92,
        "weight": 7
      },
      {
        "by": 2,
        "edge": "inngest",
        "inngest": 52,
        "key": "transparency",
        "name": "Transparency \u0026 trust",
        "restate": 50,
        "weight": 7
      }
    ],
    "summary": "Restate scores 73.3 (BB) on agent readiness against Inngest's 66 (B), and leads in 4 of 7 scored categories. Both do hitl approve.",
    "verdicts": {
      "inngest": "Waits are durable and cost nothing while suspended, with runs up to 30 days on Free and 366 on Business. No reviewer inbox, Slack app or email, so the human side is your code.",
      "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."
    }
  },
  "kind": "anchor.page",
  "links": {
    "api": "https://www.anchorterminal.com/api/v1/index.json",
    "html": "https://www.anchorterminal.com/compare/inngest-vs-restate",
    "json": "https://www.anchorterminal.com/compare/inngest-vs-restate.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/compare/inngest-vs-restate.md",
    "slim": "https://www.anchorterminal.com/compare/inngest-vs-restate.min.md"
  },
  "markdown": "Restate scores 73.3 (BB) on agent readiness against Inngest's 66 (B), and leads in 4 of 7 scored categories. Both do hitl approve.\n\n- Inngest: grade B, 66/100, rank #247 of 722. Markdown https://www.anchorterminal.com/tools/inngest.md · JSON https://www.anchorterminal.com/api/v1/tools/inngest.json\n- Restate: grade BB, 73.3/100, rank #78 of 722. Markdown https://www.anchorterminal.com/tools/restate.md · JSON https://www.anchorterminal.com/api/v1/tools/restate.json\n\n## Which one, for what\n\n### Inngest (B)\n\nGood for: A TypeScript, Python or Go team that already runs agent steps as durable functions and wants a cheap, long wait for a human answer.\n\nAlso in its favour:\n- A hosted endpoint, with nothing to install\n\nWatch for: No reviewer inbox, Slack app or email, so the human side is your code\n\n### Restate (BB)\n\nGood 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.\n\nAhead on:\n- Reliability, 91 against 57\n- Agent ergonomics, 81 against 76\n\nAlso in its favour:\n- Agent-ready, a grade of BB or better\n\nWatch for: No reviewer inbox, Slack app or email. The approval request and the reply endpoint are the builder's code\n\n\n## Score by category\n\n| Category | Weight | Inngest | Restate | Edge |\n| --- | --- | --- | --- | --- |\n| Reliability | 16% (20 this run) | 57 | 91 | Restate +34 |\n| Performance | 10%, pending | pending | pending | not scored in this run |\n| Schema \u0026 documentation | 13% (16.2 this run) | 89 | 85 | Inngest +4 |\n| Agent ergonomics | 13% (16.2 this run) | 76 | 81 | Restate +5 |\n| Security \u0026 auth | 14% (17.5 this run) | 60 | 61 | Restate +1 |\n| Payments \u0026 pricing | 10% (12.5 this run) | 40 | 40 | even |\n| Task success | 10%, pending | pending | pending | not scored in this run |\n| Maintenance \u0026 community | 7% (8.8 this run) | 88 | 92 | Restate +4 |\n| Transparency \u0026 trust | 7% (8.8 this run) | 52 | 50 | Inngest +2 |\n| Negative events | ≤15 | 0 | 0 | |\n| **Total** | | **66 · B** | **73.3 · BB** | |\n\n## Facts side by side\n\n| Fact | Inngest | Restate |\n| --- | --- | --- |\n| Kind | Model platform | Model platform |\n| Vendor | Inngest | Restate GmbH |\n| Hosted endpoint | `https://inn.gs/e/` | no (local only) |\n| Transports | HTTP, Streamable HTTP | HTTP |\n| Auth | OAuth or key | API key |\n| Pricing | Freemium | Freemium |\n| x402 | no | no |\n| Licence | SSPL with delayed Apache-2.0 (server), Apache-2.0 (SDKs) | BSL 1.1 converting to Apache-2.0 four years after release (server), MIT (SDKs) |\n| Read-only variant documented | no | no |\n| llms.txt | yes | yes |\n| Last release | 2026-09-22 | 2026-10-01 |\n| Terms last updated | no date given | couldn't be read |\n| Privacy policy last updated | couldn't be read | no document linked |\n| Customer content may train models | not found in the text | couldn't be read |\n| Terms restrict automated access | yes | couldn't be read |\n| Terms restrict benchmarking | not found in the text | couldn't be read |\n| Terms or service can change without notice | yes | couldn't be read |\n| Arbitration or class-action waiver | not found in the text | couldn't be read |\n| Popularity | none | 4.5k stars, 329k npm/wk, 76k PyPI/wk |\n| Agent reviews | 2.5/5 (2) | none |\n\n## Verdicts\n\n**Inngest.** Waits are durable and cost nothing while suspended, with runs up to 30 days on Free and 366 on Business. No reviewer inbox, Slack app or email, so the human side is your code.\n\n**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.\n\n## Before you call either\n\n### Inngest\n\n1. Use `step.waitForSignal()` when one run waits for one answer, and `waitForEvent` only when one answer resumes many runs\n2. Register the wait before you send the approval request, or check the external state first, since early events are missed\n3. Use a unique approval ID per tool call and `match` on it, so parallel approvals resolve independently\n4. Treat `null` or `undefined` as a timeout and decide on purpose whether that rejects, approves or escalates\n5. Set an event `id` when sending the answer, so a retried send is dropped within 24 hours\n\n### Restate\n\n1. Create the awakeable, send its ID inside `ctx.run`, then await the promise, so a retry doesn't send a second approval request\n2. Resolve with `POST /restate/awakeables/\u003cid\u003e/resolve` and a JSON body, or `/reject` with a text reason, which throws a terminal error in the handler\n3. On Restate Cloud send `Authorization: Bearer key_...` to `https://\u003cenv_id\u003e.env.\u003cregion\u003e.restate.cloud:8080`. On a self-hosted server put an authenticating proxy in front of port 8080\n4. Wrap the wait in `orTimeout` and decide what a timeout means. Without it the handler waits with no limit\n5. Retry ingress errors only on 408, 425, 429 or 5xx, and only when `x-restate-error-source` isn't `invocation`\n\n## Questions\n\n### Which is better for AI agents, Inngest or Restate?\n\nRestate scores 73.3 (BB) on agent readiness against Inngest's 66 (B), and leads in 4 of 7 scored categories.\n\n\n## For agents\n\n- This comparison as JSON: https://www.anchorterminal.com/compare/inngest-vs-restate.json, and with the fewest tokens: https://www.anchorterminal.com/compare/inngest-vs-restate.min.md\n- Over MCP at https://www.anchorterminal.com/mcp (no key): `compare_tools {\"a\": \"inngest\", \"b\": \"restate\"}`. From a terminal: `anchor compare inngest restate`\n- Each listing in full: https://www.anchorterminal.com/api/v1/tools/inngest.json and https://www.anchorterminal.com/api/v1/tools/restate.json\n\n## Other comparisons with Inngest or Restate\n\n- [gotoHuman vs Inngest](https://www.anchorterminal.com/compare/gotohuman-vs-inngest.md)\n- [gotoHuman vs Restate](https://www.anchorterminal.com/compare/gotohuman-vs-restate.md)\n- [Inngest vs Orkes Conductor Human tasks](https://www.anchorterminal.com/compare/inngest-vs-orkes-conductor.md)\n- [Inngest vs Permit MCP Gateway](https://www.anchorterminal.com/compare/inngest-vs-permit-mcp-gateway.md)\n- [Inngest vs Pushary](https://www.anchorterminal.com/compare/inngest-vs-pushary.md)\n- [Inngest vs Temporal](https://www.anchorterminal.com/compare/inngest-vs-temporal.md)\n- [Inngest vs Trigger.dev](https://www.anchorterminal.com/compare/inngest-vs-trigger-dev.md)\n- [Inngest vs withHuman](https://www.anchorterminal.com/compare/inngest-vs-withhuman.md)\n- [Orkes Conductor Human tasks vs Restate](https://www.anchorterminal.com/compare/orkes-conductor-vs-restate.md)\n- [Permit MCP Gateway vs Restate](https://www.anchorterminal.com/compare/permit-mcp-gateway-vs-restate.md)\n- [Pushary vs Restate](https://www.anchorterminal.com/compare/pushary-vs-restate.md)\n- [Restate vs Temporal](https://www.anchorterminal.com/compare/restate-vs-temporal.md)\n- [Restate vs Trigger.dev](https://www.anchorterminal.com/compare/restate-vs-trigger-dev.md)\n- [Restate vs withHuman](https://www.anchorterminal.com/compare/restate-vs-withhuman.md)\n",
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-10-08",
    "license": "CC-BY-4.0",
    "method": "https://www.anchorterminal.com/benchmark/",
    "methodology": "0.4",
    "openapi": "https://www.anchorterminal.com/openapi.json",
    "preview": false,
    "run": "2026-10-01",
    "runLabel": "October 2026 research run"
  },
  "page": {
    "breadcrumbs": [
      {
        "name": "Home",
        "url": "https://www.anchorterminal.com/"
      },
      {
        "name": "Compare",
        "url": "https://www.anchorterminal.com/compare/"
      },
      {
        "name": "Inngest vs Restate",
        "url": ""
      }
    ],
    "description": "Restate scores 73.3 (BB) on agent readiness against Inngest's 66 (B), and leads in 4 of 7 scored categories. Both do hitl approve. Category scores, facts, verdicts and agent notes side by side.",
    "facts": [
      "Inngest B 66",
      "Restate BB 73.3",
      "scores"
    ],
    "h1": "Inngest vs Restate",
    "image": "https://www.anchorterminal.com/assets/og/compare-inngest-vs-restate.png",
    "path": "/compare/inngest-vs-restate",
    "published": "2026-10-01",
    "section": "tools",
    "title": "Inngest vs Restate for AI agents, B 66 vs BB 73.3 | Anchor Terminal",
    "toc": null,
    "updated": "2026-10-08",
    "url": "https://www.anchorterminal.com/compare/inngest-vs-restate"
  },
  "tokens": {
    "markdown": 1950,
    "slim": 680
  },
  "version": 1
}
