Runners & Apps API
See which apps and runners are live right now - they appear because a runner registered itself, with its self-reported metadata attached.
The read-only runners and apps API backs the console's Apps view. It reflects live registrations - apps and runners appear because a runner registered, not because anything was configured by hand. There is no write surface here: runners register themselves through the SDK handshake (see runners).
| Method + path | Returns |
|---|---|
GET /apps | The project's registered apps. |
GET /runners | The project's registered runner endpoints, with metadata and liveness. |
GET /apps
Lists every app that has registered in the project, ordered by name.
| Field | Meaning |
|---|---|
name | The app name. |
createdAt | When the app was first seen (ISO 8601). |
import { createClient } from "@duraton/sdk/client";
const duraton = createClient({ url: process.env.DURATON_URL! });
const apps = await duraton.apps.list(); // App[]from duraton.client import AsyncDuratonClient
async with AsyncDuratonClient() as dx:
apps = await dx.apps.list()curl $DURATON_URL/appsGET /runners
Lists the registered runner endpoints. Pass ?app=<name> to scope to one app; omit it for every app
in the project.
| Param | Meaning | Default |
|---|---|---|
app | Restrict to one app. | all apps |
Each runner carries the metadata it reported on register. Optional fields are present only when the runner actually reported them (a runner predating a field, or one that left it unset, omits it).
| Field | Meaning |
|---|---|
runnerId | The runner's stable id, or its URL when it registered without one. |
app | The app this runner hosts. |
url | The invoke endpoint, or a conn:// pseudo-URL for a connect (WebSocket) runner. |
framework | The serve adapter in use (hono, express, next, fastify, bun, elysia, node), or connect. |
runtime | The JS runtime: node, bun, or deno. |
sdkName + version | The SDK package and version. |
region | The deployment region, when DURATON_REGION is set. |
keyFingerprint | A one-way SHA-256 prefix of the runner's invoke signing key (never the key). |
keyMatch | current, previous or mismatch, classifying the runner's signing key against the ones Duraton holds; omitted when the comparison is not possible (either side has no key). previous means the runner is still on the key it had before a rotation. |
lastSeenAt | When Duraton last saw this runner (ISO 8601): its last re-registration for a serve runner, its last socket heartbeat for a conn:// one. Either way it advances roughly every 30s while the runner is healthy. |
live | Whether lastSeenAt is inside the 90s liveness window. The rule is the same for both transports, so a conn:// runner whose process is gone reports live: false once it falls behind. A runner past the window is listed, not hidden. |
See runner liveness for what refreshes lastSeenAt on each
transport, and what a live: false runner means for routing.
Responses never include a signing key or secret - only the one-way keyFingerprint.
import { createClient } from "@duraton/sdk/client";
const duraton = createClient({ url: process.env.DURATON_URL! });
const runners = await duraton.runners.list({ app: "shop" }); // Runner[]from duraton.client import AsyncDuratonClient
async with AsyncDuratonClient() as dx:
runners = await dx.runners.list()curl "$DURATON_URL/runners?app=shop"[
{
"runnerId": "gateway-1",
"app": "shop",
"url": "https://shop.example.com/api/duraton/invoke",
"framework": "hono",
"runtime": "node",
"sdkName": "@duraton/sdk",
"version": "0.1.0",
"region": "us-east-1",
"keyFingerprint": "7f3a1b2c4d5e",
"keyMatch": "current",
"lastSeenAt": "2026-06-25T10:30:00Z",
"live": true
}
]Webhooks API
Prove a delivery happened and fix it when it did not: read the inbound and outbound delivery logs, manage source and endpoint configs, redeliver, or replay.
Flow Control
Shape how a workflow runs under load: concurrency, throttle, rate limit, debounce, batch, priority, singleton, idempotency, plus AI caps, budgets, and throttles.