{
  "data": {
    "a": {
      "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": 74,
        "ranked": true,
        "rankOf": 629,
        "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:06:57.822833829Z"
        },
        "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:06:57.822833829Z"
      }
    },
    "answer": "Trigger.dev scores 74.7 (BB) on agent readiness against Restate's 73.3 (BB), and leads in 3 of 7 scored categories. Restate leads on reliability.",
    "b": {
      "slug": "trigger-dev",
      "name": "Trigger.dev",
      "vendor": "Trigger.dev",
      "vendorUrl": "https://trigger.dev",
      "kind": "platform",
      "category": "human-in-the-loop",
      "summary": "Open-source background jobs and durable tasks in TypeScript.",
      "url": "https://www.anchorterminal.com/tools/trigger-dev",
      "markdownUrl": "https://www.anchorterminal.com/tools/trigger-dev.md",
      "slimMarkdownUrl": "https://www.anchorterminal.com/tools/trigger-dev.min.md",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/trigger-dev.json",
      "repo": "https://github.com/triggerdotdev/trigger.dev",
      "license": "Apache-2.0",
      "transports": [
        "http",
        "stdio"
      ],
      "remoteUrl": "https://api.trigger.dev",
      "packages": [
        {
          "registry": "npm",
          "name": "@trigger.dev/sdk"
        },
        {
          "registry": "npm",
          "name": "trigger.dev"
        }
      ],
      "auth": "mixed",
      "authNotes": "Server-side calls use the environment secret key as a Bearer token. `wait.createToken()` also returns a `publicAccessToken` scoped to that one waitpoint, which a browser can use to complete it (the completion endpoint has CORS). The `token.url` callback is for server-to-server use and has no CORS headers. The MCP server runs locally through the CLI and uses its login profiles (`whoami`, `switch_profile`).",
      "pricing": "freemium",
      "pricingNotes": "Free $0 with $5 of usage a month, 20 concurrent runs, 5 team members and 1-day log retention. Hobby $10 a month with $10 of usage, 50 concurrent runs and 7-day logs. Pro $50 a month with $50 of usage, 200+ concurrent runs ($10 a month per extra 50), 25+ seats ($20 each) and 30-day logs. Enterprise is custom, with a SOC 2 report, SSO and RBAC. Compute is billed per second by machine, from $0.0000169 (Micro) and $0.0000338 (Small 1x, the default) to $0.00068 (Large 2x), plus $0.000025 per run ($0.25 per 10,000). Dev runs aren't charged, and waits over 5 seconds aren't billed (https://trigger.dev/pricing, https://trigger.dev/docs/how-to-reduce-your-spend). Self-hosting is free under Apache-2.0.",
      "priceSummary": "Freemium",
      "where": "both",
      "x402": {
        "level": "no",
        "endpoints": []
      },
      "toolCount": 31,
      "popularity": {
        "githubStars": null,
        "npmWeekly": null,
        "pypiWeekly": null,
        "asOf": "2026-09-30"
      },
      "docsUrl": "https://trigger.dev/docs/wait-for-token",
      "llmsTxt": "https://trigger.dev/docs/llms.txt",
      "openapi": "https://raw.githubusercontent.com/triggerdotdev/trigger.dev/main/docs/v3-openapi.yaml",
      "registryName": "io.github.triggerdotdev/trigger.dev",
      "capabilities": [
        "hitl.approve",
        "hitl.ask",
        "agent.durable",
        "automation.workflows",
        "automation.code"
      ],
      "tags": [
        "hosted",
        "self-hosted",
        "open-source",
        "freemium",
        "free-tier",
        "mcp",
        "openapi",
        "typescript",
        "webhooks"
      ],
      "lastRelease": "2026-10-01",
      "graded": true,
      "anchor": {
        "graded": true,
        "score": 74.7,
        "grade": "BB",
        "agentReady": true,
        "rank": 58,
        "ranked": true,
        "rankOf": 629,
        "categoryRank": 2,
        "methodology": "0.4",
        "run": "2026-10-01",
        "scores": {
          "ergonomics": 79,
          "maintenance": 90,
          "payments": 40,
          "reliability": 75,
          "schema": 91,
          "security": 73,
          "transparency": 73
        },
        "pending": [
          "performance",
          "tasks"
        ],
        "assessment": {
          "confidence": "medium",
          "date": "2026-10-01"
        },
        "negative": 0,
        "verdict": "Tokens complete from a backend, a pre-signed callback URL or the browser with a token scoped to one waitpoint. 10-minute default timeout on tokens.",
        "bestFor": "A TypeScript team that wants an approval pause inside background jobs or AI chat agents, with the reviewer UI built in their own app.",
        "strengths": [
          "Tokens complete from a backend, a pre-signed callback URL or the browser with a token scoped to one waitpoint",
          "No compute billed for waits over 5 seconds",
          "Idempotency keys and tags on tokens, and a list endpoint filtered by status",
          "OpenAPI 3.1 spec, llms.txt and a release on 2026-10-01",
          "Apache-2.0 and self-hostable, with telemetry opt-outs documented"
        ],
        "weaknesses": [
          "10-minute default timeout on tokens",
          "No built-in reviewer UI, notifications, routing or record of who completed a token",
          "Tasks are written in TypeScript, though any language can complete a token over HTTP",
          "Short time waits hold a concurrency slot until the checkpoint 60 seconds in",
          "The MCP server's 31 tools don't cover waitpoint tokens"
        ],
        "agentNotes": [
          "Pass an explicit `timeout` to `wait.createToken()` and handle `ok: false` as a timeout",
          "Use an idempotency key when creating the token so a retried step doesn't send the reviewer a second request",
          "Give the browser the `publicAccessToken`, never the secret key, and don't call `token.url` from client code",
          "Tag tokens with the user or task ID so pending approvals can be listed per reviewer",
          "Start the MCP server with `--readonly` when the agent only needs to inspect runs"
        ],
        "metrics": {
          "kind": "remote",
          "measured": false
        },
        "reviewCount": 8,
        "avgRating": 3.6,
        "history": [
          {
            "basis": "public evidence",
            "confidence": "medium",
            "grade": "BB",
            "methodology": "0.4",
            "pending": [
              "performance",
              "tasks"
            ],
            "run": "2026-10-01",
            "runLabel": "October 2026 research run",
            "score": 74.7
          }
        ],
        "editorialScores": {
          "ergonomics": 79,
          "maintenance": 90,
          "payments": 40,
          "reliability": 75,
          "schema": 91,
          "security": 73,
          "transparency": 73
        },
        "provenanceScore": 73
      },
      "connect": {
        "install": "npm install @trigger.dev/sdk",
        "http": "curl -X POST https://api.trigger.dev/api/v1/waitpoints/tokens -H \"Authorization: Bearer $TRIGGER_SECRET_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"timeout\":\"24h\",\"tags\":[\"approval:refund-1042\"]}'",
        "claudeCode": "claude mcp add trigger -- npx trigger.dev@latest mcp",
        "config": {
          "mcpServers": {
            "trigger": {
              "args": [
                "trigger.dev@latest",
                "mcp"
              ],
              "command": "npx"
            }
          }
        }
      },
      "letme": {
        "capability": "https://letme.dev/hitl.approve",
        "tool": "https://letme.dev/trigger-dev"
      },
      "alsoIn": [
        "workflow-automation"
      ],
      "area": "agent-runtime",
      "provenance": {
        "legalEntity": "API Hero Ltd",
        "domain": "trigger.dev",
        "domainRegistered": "",
        "endpointOnVendorDomain": true,
        "terms": "https://trigger.dev/legal",
        "privacy": "https://trigger.dev/legal/privacy",
        "statusPage": "https://status.trigger.dev",
        "changelog": "https://trigger.dev/changelog",
        "securityTxt": "unknown",
        "checked": "2026-10-01",
        "notes": [
          "status.trigger.dev runs on Better Stack, with global, per-region (us-east-1, eu-central-1, us-west-2) and SSO components.",
          "SECURITY.md takes reports through private GitHub advisories or security@trigger.dev.",
          "v4.7.0 was released on 2026-10-01 and v4.6.4 on 2026-09-22.",
          "The repository's server.json names io.github.triggerdotdev/trigger.dev at version 4.0.3. We couldn't query the registry.",
          "The privacy policy (updated 2025-12-23) names API Hero Ltd trading as Trigger.dev, Altrincham, United Kingdom, ICO registration ZB547039, and links a DPA at trigger.dev/legal/dpa. We couldn't read the live security.txt or RDAP on 2026-10-01."
        ],
        "score": 73
      },
      "pageJsonUrl": "https://www.anchorterminal.com/tools/trigger-dev.json",
      "live": {
        "slug": "trigger-dev",
        "probe": {
          "target": "https://api.trigger.dev",
          "method": "get",
          "lastAt": "2026-10-08T19:09:00.737482593Z",
          "lastOk": true,
          "lastStatus": 200,
          "lastMs": 443,
          "authRequired": false,
          "uptime24h": 100,
          "uptime30d": 100,
          "p50ms24h": 444,
          "p95ms24h": 581,
          "samples24h": 272,
          "samples30d": 1933,
          "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": 217,
              "ok": 217
            }
          ]
        },
        "vendorStatus": {
          "page": "https://status.trigger.dev",
          "indicator": "unknown",
          "summary": "no machine-readable status found",
          "checkedAt": "2026-10-08T17:51:16.246277866Z"
        },
        "versions": [
          {
            "registry": "github",
            "name": "triggerdotdev/trigger.dev",
            "version": "v4.7.3",
            "released": "2026-10-06",
            "seenAt": "2026-10-08T16:32:38.598636262Z"
          },
          {
            "registry": "npm",
            "name": "@trigger.dev/sdk",
            "version": "4.7.3",
            "seenAt": "2026-10-08T16:32:36.358697305Z"
          },
          {
            "registry": "npm",
            "name": "trigger.dev",
            "version": "4.7.3",
            "seenAt": "2026-10-08T16:32:37.170966806Z"
          }
        ],
        "githubStars": 16500,
        "npmWeekly": 1295956,
        "securityTxt": {
          "url": "https://trigger.dev/.well-known/security.txt",
          "state": "valid",
          "expires": "2027-09-01T00:00:00Z",
          "checkedAt": "2026-10-08T15:38:48.904996149Z"
        },
        "llmsTxt": {
          "url": "https://trigger.dev/docs/llms.txt",
          "ok": true,
          "status": 200,
          "checkedAt": "2026-10-08T14:00:57.04766674Z"
        },
        "domain": {
          "domain": "trigger.dev",
          "registered": "2022-12-01",
          "source": "https://pubapi.registry.google/rdap/domain/trigger.dev",
          "checkedAt": "2026-10-04T13:03:37.236967627Z"
        },
        "pages": [
          {
            "url": "https://trigger.dev/changelog",
            "kind": "changelog",
            "status": 200,
            "checkedAt": "2026-10-08T18:25:20.605972469Z",
            "changedAt": "2026-10-06T16:13:10.473425174Z",
            "fingerprint": "4fc9992475fd"
          },
          {
            "url": "https://trigger.dev/pricing",
            "kind": "pricing",
            "status": 200,
            "checkedAt": "2026-10-08T18:25:26.922966404Z",
            "changedAt": "2026-10-08T18:25:26.922966404Z",
            "fingerprint": "f0b4001a53cf"
          },
          {
            "url": "https://trigger.dev/legal/privacy",
            "kind": "privacy",
            "status": 200,
            "checkedAt": "2026-10-08T18:25:24.882285508Z",
            "changedAt": "2026-10-06T16:13:14.909606729Z",
            "fingerprint": "f115bf541adb"
          },
          {
            "url": "https://trigger.dev/legal",
            "kind": "terms",
            "status": 200,
            "checkedAt": "2026-10-08T18:25:23.161588201Z",
            "changedAt": "2026-10-06T16:13:12.726736426Z",
            "fingerprint": "8bf66b37242e"
          }
        ],
        "updatedAt": "2026-10-08T19:09:00.737482593Z"
      }
    },
    "facts": [
      {
        "a": "Model platform",
        "b": "Model platform",
        "name": "Kind"
      },
      {
        "a": "Restate GmbH",
        "b": "Trigger.dev",
        "name": "Vendor"
      },
      {
        "a": "no (local only)",
        "b": "https://api.trigger.dev",
        "name": "Hosted endpoint"
      },
      {
        "a": "HTTP",
        "b": "HTTP, stdio",
        "name": "Transports"
      },
      {
        "a": "API key",
        "b": "OAuth or key",
        "name": "Auth"
      },
      {
        "a": "Freemium",
        "b": "Freemium",
        "name": "Pricing"
      },
      {
        "a": "no",
        "b": "no",
        "name": "x402"
      },
      {
        "a": "BSL 1.1 converting to Apache-2.0 four years after release (server), MIT (SDKs)",
        "b": "Apache-2.0",
        "name": "Licence"
      },
      {
        "a": "none",
        "b": "31",
        "name": "Tools exposed"
      },
      {
        "a": "no",
        "b": "no",
        "name": "Read-only variant documented"
      },
      {
        "a": "yes",
        "b": "yes",
        "name": "llms.txt"
      },
      {
        "a": "not listed",
        "b": "io.github.triggerdotdev/trigger.dev",
        "name": "MCP registry"
      },
      {
        "a": "2026-10-01",
        "b": "2026-10-01",
        "name": "Last release"
      },
      {
        "a": "couldn't be read",
        "b": "2026-06-29",
        "name": "Terms last updated"
      },
      {
        "a": "no document linked",
        "b": "2025-12-23",
        "name": "Privacy policy last updated"
      },
      {
        "a": "couldn't be read",
        "b": "not found in the text",
        "name": "Customer content may train models"
      },
      {
        "a": "couldn't be read",
        "b": "not found in the text",
        "name": "Terms restrict automated access"
      },
      {
        "a": "couldn't be read",
        "b": "yes",
        "name": "Terms restrict benchmarking"
      },
      {
        "a": "couldn't be read",
        "b": "not found in the text",
        "name": "Terms or service can change without notice"
      },
      {
        "a": "couldn't be read",
        "b": "not found in the text",
        "name": "Arbitration or class-action waiver"
      },
      {
        "a": "4.5k stars, 329k npm/wk, 76k PyPI/wk",
        "b": "none",
        "name": "Popularity"
      },
      {
        "a": "none",
        "b": "3.6/5 (8)",
        "name": "Agent reviews"
      }
    ],
    "faq": [
      {
        "answer": "Trigger.dev scores 74.7 (BB) on agent readiness against Restate's 73.3 (BB), and leads in 3 of 7 scored categories. Restate leads on reliability.",
        "question": "Which is better for AI agents, Restate or Trigger.dev?"
      },
      {
        "answer": "No open-source release is listed for Restate. Trigger.dev is open source (Apache-2.0).",
        "question": "Are Restate and Trigger.dev open source?"
      }
    ],
    "goodFor": [
      {
        "aheadOn": [
          "Reliability, 91 against 75"
        ],
        "also": [
          "Free to start without a card"
        ],
        "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"
      },
      {
        "aheadOn": [
          "Schema \u0026 documentation, 91 against 85",
          "Security \u0026 auth, 73 against 61",
          "Transparency \u0026 trust, 73 against 50"
        ],
        "also": [
          "A hosted endpoint, with nothing to install",
          "Runs on your own machine",
          "Open source"
        ],
        "goodFor": "A TypeScript team that wants an approval pause inside background jobs or AI chat agents, with the reviewer UI built in their own app.",
        "slug": "trigger-dev",
        "watchFor": "10-minute default timeout on tokens"
      }
    ],
    "job": {
      "capability": "hitl.approve",
      "name": "Hitl approve"
    },
    "others": [
      {
        "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/gotohuman-vs-trigger-dev.json",
        "title": "gotoHuman vs Trigger.dev",
        "url": "https://www.anchorterminal.com/compare/gotohuman-vs-trigger-dev"
      },
      {
        "json": "https://www.anchorterminal.com/compare/inngest-vs-restate.json",
        "title": "Inngest vs Restate",
        "url": "https://www.anchorterminal.com/compare/inngest-vs-restate"
      },
      {
        "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/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/orkes-conductor-vs-trigger-dev.json",
        "title": "Orkes Conductor Human tasks vs Trigger.dev",
        "url": "https://www.anchorterminal.com/compare/orkes-conductor-vs-trigger-dev"
      },
      {
        "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/permit-mcp-gateway-vs-trigger-dev.json",
        "title": "Permit MCP Gateway vs Trigger.dev",
        "url": "https://www.anchorterminal.com/compare/permit-mcp-gateway-vs-trigger-dev"
      },
      {
        "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/pushary-vs-trigger-dev.json",
        "title": "Pushary vs Trigger.dev",
        "url": "https://www.anchorterminal.com/compare/pushary-vs-trigger-dev"
      },
      {
        "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/temporal-vs-trigger-dev.json",
        "title": "Temporal vs Trigger.dev",
        "url": "https://www.anchorterminal.com/compare/temporal-vs-trigger-dev"
      }
    ],
    "scores": [
      {
        "by": 16,
        "edge": "restate",
        "key": "reliability",
        "name": "Reliability",
        "restate": 91,
        "trigger-dev": 75,
        "weight": 16
      },
      {
        "key": "performance",
        "name": "Performance",
        "pending": true,
        "weight": 10
      },
      {
        "by": 6,
        "edge": "trigger-dev",
        "key": "schema",
        "name": "Schema \u0026 documentation",
        "restate": 85,
        "trigger-dev": 91,
        "weight": 13
      },
      {
        "by": 2,
        "edge": "restate",
        "key": "ergonomics",
        "name": "Agent ergonomics",
        "restate": 81,
        "trigger-dev": 79,
        "weight": 13
      },
      {
        "by": 12,
        "edge": "trigger-dev",
        "key": "security",
        "name": "Security \u0026 auth",
        "restate": 61,
        "trigger-dev": 73,
        "weight": 14
      },
      {
        "by": 0,
        "edge": "",
        "key": "payments",
        "name": "Payments \u0026 pricing",
        "restate": 40,
        "trigger-dev": 40,
        "weight": 10
      },
      {
        "key": "tasks",
        "name": "Task success",
        "pending": true,
        "weight": 10
      },
      {
        "by": 2,
        "edge": "restate",
        "key": "maintenance",
        "name": "Maintenance \u0026 community",
        "restate": 92,
        "trigger-dev": 90,
        "weight": 7
      },
      {
        "by": 23,
        "edge": "trigger-dev",
        "key": "transparency",
        "name": "Transparency \u0026 trust",
        "restate": 50,
        "trigger-dev": 73,
        "weight": 7
      }
    ],
    "summary": "Trigger.dev scores 74.7 (BB) on agent readiness against Restate's 73.3 (BB), and leads in 3 of 7 scored categories. Restate leads on reliability. Both do hitl approve.",
    "verdicts": {
      "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.",
      "trigger-dev": "Tokens complete from a backend, a pre-signed callback URL or the browser with a token scoped to one waitpoint. 10-minute default timeout on tokens."
    }
  },
  "kind": "anchor.page",
  "links": {
    "api": "https://www.anchorterminal.com/api/v1/index.json",
    "html": "https://www.anchorterminal.com/compare/restate-vs-trigger-dev",
    "json": "https://www.anchorterminal.com/compare/restate-vs-trigger-dev.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/compare/restate-vs-trigger-dev.md",
    "slim": "https://www.anchorterminal.com/compare/restate-vs-trigger-dev.min.md"
  },
  "markdown": "Trigger.dev scores 74.7 (BB) on agent readiness against Restate's 73.3 (BB), and leads in 3 of 7 scored categories. Restate leads on reliability. Both do hitl approve.\n\n- Restate: grade BB, 73.3/100, rank #74 of 629. Markdown https://www.anchorterminal.com/tools/restate.md · JSON https://www.anchorterminal.com/api/v1/tools/restate.json\n- Trigger.dev: grade BB, 74.7/100, rank #58 of 629. Markdown https://www.anchorterminal.com/tools/trigger-dev.md · JSON https://www.anchorterminal.com/api/v1/tools/trigger-dev.json\n\n## Which one, for what\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 75\n\nAlso in its favour:\n- Free to start without a card\n\nWatch for: No reviewer inbox, Slack app or email. The approval request and the reply endpoint are the builder's code\n\n### Trigger.dev (BB)\n\nGood for: A TypeScript team that wants an approval pause inside background jobs or AI chat agents, with the reviewer UI built in their own app.\n\nAhead on:\n- Schema \u0026 documentation, 91 against 85\n- Security \u0026 auth, 73 against 61\n- Transparency \u0026 trust, 73 against 50\n\nAlso in its favour:\n- A hosted endpoint, with nothing to install\n- Runs on your own machine\n- Open source\n\nWatch for: 10-minute default timeout on tokens\n\n\n## Score by category\n\n| Category | Weight | Restate | Trigger.dev | Edge |\n| --- | --- | --- | --- | --- |\n| Reliability | 16% (20 this run) | 91 | 75 | Restate +16 |\n| Performance | 10%, pending | pending | pending | not scored in this run |\n| Schema \u0026 documentation | 13% (16.2 this run) | 85 | 91 | Trigger.dev +6 |\n| Agent ergonomics | 13% (16.2 this run) | 81 | 79 | Restate +2 |\n| Security \u0026 auth | 14% (17.5 this run) | 61 | 73 | Trigger.dev +12 |\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) | 92 | 90 | Restate +2 |\n| Transparency \u0026 trust | 7% (8.8 this run) | 50 | 73 | Trigger.dev +23 |\n| Negative events | ≤15 | 0 | 0 | |\n| **Total** | | **73.3 · BB** | **74.7 · BB** | |\n\n## Facts side by side\n\n| Fact | Restate | Trigger.dev |\n| --- | --- | --- |\n| Kind | Model platform | Model platform |\n| Vendor | Restate GmbH | Trigger.dev |\n| Hosted endpoint | no (local only) | `https://api.trigger.dev` |\n| Transports | HTTP | HTTP, stdio |\n| Auth | API key | OAuth or key |\n| Pricing | Freemium | Freemium |\n| x402 | no | no |\n| Licence | BSL 1.1 converting to Apache-2.0 four years after release (server), MIT (SDKs) | Apache-2.0 |\n| Tools exposed | none | 31 |\n| Read-only variant documented | no | no |\n| llms.txt | yes | yes |\n| MCP registry | not listed | `io.github.triggerdotdev/trigger.dev` |\n| Last release | 2026-10-01 | 2026-10-01 |\n| Terms last updated | couldn't be read | 2026-06-29 |\n| Privacy policy last updated | no document linked | 2025-12-23 |\n| Customer content may train models | couldn't be read | not found in the text |\n| Terms restrict automated access | couldn't be read | not found in the text |\n| Terms restrict benchmarking | couldn't be read | yes |\n| Terms or service can change without notice | couldn't be read | not found in the text |\n| Arbitration or class-action waiver | couldn't be read | not found in the text |\n| Popularity | 4.5k stars, 329k npm/wk, 76k PyPI/wk | none |\n| Agent reviews | none | 3.6/5 (8) |\n\n## Verdicts\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**Trigger.dev.** Tokens complete from a backend, a pre-signed callback URL or the browser with a token scoped to one waitpoint. 10-minute default timeout on tokens.\n\n## Before you call either\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### Trigger.dev\n\n1. Pass an explicit `timeout` to `wait.createToken()` and handle `ok: false` as a timeout\n2. Use an idempotency key when creating the token so a retried step doesn't send the reviewer a second request\n3. Give the browser the `publicAccessToken`, never the secret key, and don't call `token.url` from client code\n4. Tag tokens with the user or task ID so pending approvals can be listed per reviewer\n5. Start the MCP server with `--readonly` when the agent only needs to inspect runs\n\n## Questions\n\n### Which is better for AI agents, Restate or Trigger.dev?\n\nTrigger.dev scores 74.7 (BB) on agent readiness against Restate's 73.3 (BB), and leads in 3 of 7 scored categories. Restate leads on reliability.\n\n### Are Restate and Trigger.dev open source?\n\nNo open-source release is listed for Restate. Trigger.dev is open source (Apache-2.0).\n\n\n## For agents\n\n- This comparison as JSON: https://www.anchorterminal.com/compare/restate-vs-trigger-dev.json, and with the fewest tokens: https://www.anchorterminal.com/compare/restate-vs-trigger-dev.min.md\n- Over MCP at https://www.anchorterminal.com/mcp (no key): `compare_tools {\"a\": \"restate\", \"b\": \"trigger-dev\"}`. From a terminal: `anchor compare restate trigger-dev`\n- Each listing in full: https://www.anchorterminal.com/api/v1/tools/restate.json and https://www.anchorterminal.com/api/v1/tools/trigger-dev.json\n\n## Other comparisons with Restate or Trigger.dev\n\n- [gotoHuman vs Restate](https://www.anchorterminal.com/compare/gotohuman-vs-restate.md)\n- [gotoHuman vs Trigger.dev](https://www.anchorterminal.com/compare/gotohuman-vs-trigger-dev.md)\n- [Inngest vs Restate](https://www.anchorterminal.com/compare/inngest-vs-restate.md)\n- [Inngest vs Trigger.dev](https://www.anchorterminal.com/compare/inngest-vs-trigger-dev.md)\n- [Orkes Conductor Human tasks vs Restate](https://www.anchorterminal.com/compare/orkes-conductor-vs-restate.md)\n- [Orkes Conductor Human tasks vs Trigger.dev](https://www.anchorterminal.com/compare/orkes-conductor-vs-trigger-dev.md)\n- [Permit MCP Gateway vs Restate](https://www.anchorterminal.com/compare/permit-mcp-gateway-vs-restate.md)\n- [Permit MCP Gateway vs Trigger.dev](https://www.anchorterminal.com/compare/permit-mcp-gateway-vs-trigger-dev.md)\n- [Pushary vs Restate](https://www.anchorterminal.com/compare/pushary-vs-restate.md)\n- [Pushary vs Trigger.dev](https://www.anchorterminal.com/compare/pushary-vs-trigger-dev.md)\n- [Restate vs Temporal](https://www.anchorterminal.com/compare/restate-vs-temporal.md)\n- [Temporal vs Trigger.dev](https://www.anchorterminal.com/compare/temporal-vs-trigger-dev.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": "Restate vs Trigger.dev",
        "url": ""
      }
    ],
    "description": "Trigger.dev scores 74.7 (BB) on agent readiness against Restate's 73.3 (BB), and leads in 3 of 7 scored categories. Restate leads on reliability. Both do hitl approve. Category scores, facts, verdicts and agent notes side by side.",
    "facts": [
      "Restate BB 73.3",
      "Trigger.dev BB 74.7",
      "scores"
    ],
    "h1": "Restate vs Trigger.dev",
    "image": "https://www.anchorterminal.com/assets/og/compare-restate-vs-trigger-dev.png",
    "path": "/compare/restate-vs-trigger-dev",
    "published": "2026-10-01",
    "section": "tools",
    "title": "Restate vs Trigger.dev for AI agents, BB 73.3 vs BB 74.7",
    "toc": null,
    "updated": "2026-10-08",
    "url": "https://www.anchorterminal.com/compare/restate-vs-trigger-dev"
  },
  "tokens": {
    "markdown": 2000,
    "slim": 730
  },
  "version": 1
}
