本文へ移動
runlot
リファレンスAPISchema

Schema

Describes the structure of API request and response bodies. Each schema is referenced by the API operations that use it.

ObsCapabilities

FieldTypeRequiredDescription
storebooleanYes—
featuresstring[]Yes—

ObsFilter

FieldTypeRequiredDescription
keystringYesA built-in $ key or a bare user key (dot-separated for nesting)
opstringYes—
valueobjectNoString, number or boolean; omitted for exists/not_exists

ObsCalc

FieldTypeRequiredDescription
opstringYescount, count_distinct, min, max, sum, avg, stddev, variance, or p001–p999 (two digits are percent, three per mille)
keystringNo—

ObsQuery

FieldTypeRequiredDescription
timeframeobjectNo—
viewstringNo—
datasetstringNoWhat a calculations view aggregates; inferred from the keys when omitted
filtersObsFilter[]No—
searchstringNo—
calculationsObsCalc[]No—
groupBystring[]No—
orderByobjectNo—
limitintegerNo—
granularityintegerNoSeconds per time bucket (calculations view)

ObsColumn

FieldTypeRequiredDescription
namestringYes—
kindstringYes—
keystringNo—
opstringNo—

ObsQueryResult

FieldTypeRequiredDescription
availablebooleanYes—
viewstringNo—
datasetstringNo—
fromstringNo—
tostringNo—
clampedbooleanNoThe timeframe began before the plan's retention and was shortened
columnsObsColumn[]No—
rowsobject[]NoCalculations rows are keyed by column name (t, g0…, c0…); invocations rows are ObsInvocation, events rows ObsEvent, traces rows trace summaries

ObsKey

FieldTypeRequiredDescription
keystringYes—
typestringYes—
builtinbooleanYes—
countintegerNo—

ObsKeys

FieldTypeRequiredDescription
availablebooleanYes—
viewstringNo—
sincestringNo—
untilstringNo—
keysObsKey[]No—

ObsValues

FieldTypeRequiredDescription
availablebooleanYes—
keystringNo—
valuesobject[]No—

ObsPattern

FieldTypeRequiredDescription
patternstringYes—
eventsintegerYes—
samplestringYes—
levelstringYes—
firstSeenstringYes—
newbooleanYes—
trendnumberYesEvents in the window's second half over its first half

ObsPatterns

FieldTypeRequiredDescription
availablebooleanYes—
sincestringNo—
untilstringNo—
patternsObsPattern[]No—

ObsExit

FieldTypeRequiredDescription
tsstringYes—
epochintegerYes—
generationintegerYes—
pidintegerYes—
rolestringNo—
exitCodeintegerYes—
signalstringNo—
oomKillintegerYes—
oomLevelstringNo—
peakBytesintegerNo—
limitBytesintegerNo—
causestringYes—

ObsInvocation

FieldTypeRequiredDescription
requestIdstringYes—
tsstringYes—
eventTypestringYes—
deploymentIdstringNo—
deploymentVersionintegerNo—
methodstringNo—
hoststringNo—
pathstringNo—
routestringNo—
statusintegerNo—
wallMsnumberYes—
reqBytesintegerNoRequest body bytes, when known.
respBytesintegerNoResponse body bytes, when known.
outcomestringYesResolved: a workerExited record takes its process exit's cause
recordedOutcomestringYes—
outcomeSignalstringNo—
upstreamstringNo—
wokebooleanNo—
wakeMsnumberNo—
countrystringNo—
regionstringNo—
sampledbooleanYes—
syntheticbooleanNo—
userHashstringNo—
userAgentstringNo—
attrsobjectNo—
exitObsExitNo—
cpuMsnumberNoJavaScript CPU the invocation spent, in milliseconds (thread CPU while its JavaScript ran, including its waitUntil work; database statements and runtime work between turns are not in it). Null when it was not measured: a runtime without per-request CPU, an answer front gave in the app's place, or a queue batch, whose reading cannot carry the batch's request ID.

ObsEvent

FieldTypeRequiredDescription
tsstringYes—
requestIdstringNo—
levelstringYes—
sourcestringYes—
messagestringYes—
fieldsobjectNo—
exceptionNamestringNo—
exceptionStackstringNo—
truncatedbooleanNo—
redactedbooleanNo—
weightintegerYesHow many offered events this stored one stands for (past the daily cap)
deploymentVersionintegerNo—
eventTypestringNo—

ObsSpan

FieldTypeRequiredDescription
spanIdstringYes—
parentSpanIdstringNo—
namestringYes—
kindstringYes—
startstringYes—
startOffsetMsnumberYes—
durationMsnumberYes—
statusstringYes—
peerstringNo—
attrsobjectNo—

ObsRequestView

FieldTypeRequiredDescription
availablebooleanYes—
requestIdstringNo—
invocationObsInvocationNo—
eventsObsEvent[]No—
spansObsSpan[]No—
errorsobject[]No—
historiesobject[]No—
linksobjectNo—

SavedQueryInput

FieldTypeRequiredDescription
scopestringNoFixed at creation
namestringYes—
descriptionstringNo—
tagsstring[]No—
bodyObsQueryYes—

SavedQuery

FieldTypeRequiredDescription
queryIdstringYes—
projectIdstringNo—
scopestringYes—
namestringYes—
descriptionstringYes—
tagsstring[]Yes—
bodyObsQueryYes—
createdBystringNo—
createdAtstringYes—
updatedAtstringYes—
starsintegerYes—
starredbooleanYes—

SavedQueryList

FieldTypeRequiredDescription
queriesSavedQuery[]Yes—
limitintegerYes-1 is no limit

ObsProcessor

FieldTypeRequiredDescription
typestringYes—
enabledbooleanNo—
sourcestringNo—
targetstringNo—
patternstringNo—
delimiterstringNo—
fromstringNo—
tostringNo—
keepOriginalbooleanNo—
fieldstringNo—
mappingobjectNo—
filterObsFilter[]No—
ratenumberNo—

ObsPipeline

FieldTypeRequiredDescription
processorsObsProcessor[]Yes—
versionintegerYes—
sourcestringYes—
updatedAtstringNo—

ObsScanRule

FieldTypeRequiredDescription
namestringYes—
patternstringYes—
actionstringYes—
enabledbooleanNo—

ObsScannerConfig

FieldTypeRequiredDescription
builtinsobjectNoPer built-in rule (jwt, bearer, api_key, email, card, kr_rrn): off, redact, hash or drop. Absent redacts.
rulesObsScanRule[]No—

ObsScanner

FieldTypeRequiredDescription
builtinsobjectYes—
rulesObsScanRule[]Yes—
availablestring[]Yes—
sourcestringYes—

ObsScanResult

FieldTypeRequiredDescription
resultstringYes—
droppedbooleanYes—
hitsobject[]Yes—

ObsLogMetric

FieldTypeRequiredDescription
namestringNo—
kindstringNo—
datasetstringNo—
filterObsFilter[]No—
valueKeystringNoThe numeric field a distribution records
groupBystring[]No—
enabledbooleanNo—
sourcestringNo—
updatedAtstringNo—

LogRecord

A live-tail line under format=json: the stored log event's shape

FieldTypeRequiredDescription
typestringYes—
tsstringYes—
levelstringYes—
sourcestringYes—
messagestringYes—
fieldsobjectNo—
requestIdstringNo—
epochintegerNo—
generationintegerNo—
truncatedbooleanNo—

ObsLogsConfig

FieldTypeRequiredDescription
pipelineObsProcessor[]No—
scannerObsScannerConfigNo—
logMetricsObsLogMetric[]No—

ReleaseIssueTransition

FieldTypeRequiredDescription
issueIdstringYes—
eventIdstringYes—
atstringYes—
issueAvailablebooleanYes—
eventAvailablebooleanYes—
shortIdstringNo—
titlestringNo—
statusstringNoCurrent surviving issue status

ReleaseIssuePage

FieldTypeRequiredDescription
versionintegerYes—
deploymentIdstringYes—
kindstringYes—
windowStartstringYes—
windowEndstringYes—
issuesReleaseIssueTransition[]Yes—
cursorstringNo—

ReleaseHealthRelease

FieldTypeRequiredDescription
unjoinedErrorRequestsintegerYes—
versionintegerYes—
deploymentIdstringYes—
commitstringNo—
livebooleanYes—
requestsintegerYes—
httpFailuresintegerYes—
recordedErrorRequestsintegerYes—
failedRequestsintegerYes—
unknownStatusesintegerYes—
droppedintegerYes—
observedErrorFreePercentnumberYes—
adoptionPercentnumberYes—
knownUsersintegerYes—
knownFailedUsersintegerYes—
knownUserRequestsintegerYes—
knownUsersErrorFreePercentnumberYes—
sessionsintegerNoBrowser-agent tab sessions with an attributed page view of this release in the window
erroredSessionsintegerNo—
crashFreeSessionsPercentnumberNoSessions with no reported browser error; untrusted browser claims
newIssuesintegerYes—
regressionsintegerYes—
insightstringYes—
insightReasonstringYes—

ErrorHistory

FieldTypeRequiredDescription
availablebooleanYes—
sourcestringYes—
pointsobject[]Yes—

RelatedErrorEvents

FieldTypeRequiredDescription
notestringYes—
eventsobject[]Yes—

ReleaseHealthSummary

FieldTypeRequiredDescription
releasesReleaseHealthRelease[]Yes—
windowStartstringYes—
windowEndstringYes—
populationstringYes—
coveragestringYes—
errorDefinitionstringYes—
userDefinitionstringYes—
sessionDefinitionstringNo—
crashFreeRequestsPercentnumberYes—
crashFreeUsersPercentnumberYes—
unknownLossbooleanYes—
receiptRetentionHoursintegerYes—

ReleaseHealthReceipt

FieldTypeRequiredDescription
projectIdstringYes—
deploymentIdstringYes—
requestIdstringYes—
epochintegerYes—
atstringYes—
statusintegerYes—
userHashstringNo—

ReleaseHealthLoss

FieldTypeRequiredDescription
projectIdstringYes—
deploymentIdstringYes—
countintegerYes—

ReleaseHealthReport

FieldTypeRequiredDescription
nodeIdstringYes—
batchIdstringYes—
atstringYes—
receiptsReleaseHealthReceipt[]Yes—
lossesReleaseHealthLoss[]Yes—
unknownLossintegerYes—

ReleaseHealthReportResult

FieldTypeRequiredDescription
acceptedintegerYes—
duplicateintegerYes—
rejectedintegerYes—
droppedintegerYes—

ErrorFixPreviewApproval

FieldTypeRequiredDescription
proposalShastringYes—
appliedCommitstringYes—
sourceRootstringYes—
databaseModestringYes—
policystringYes—
acknowledgeExecutionbooleanYes—
idempotencyKeystringYes—

ErrorFixPreview

FieldTypeRequiredDescription
jobIdstringYes—
proposalIdstringYes—
statestringYes—
policystringYes—
commitstringYes—
sourceRootstringYes—
databaseModestringYes—
childProjectIdstringNo—
deploymentIdstringNo—
verificationOnlybooleanYes—
publicAccessstringYes—
safeReasonstringNo—
createdAtstringYes—
expiresAtstringYes—
replayedbooleanNo—
verificationErrorFixPreviewVerificationNo—

ErrorFixPreviewVerificationApproval

FieldTypeRequiredDescription
methodstringYes—
pathstringYesAbsolute path only, no query/body/auth/cookies/redirects. A private handler-only probe, not a public URL check.
acknowledgeRequestbooleanYes—
idempotencyKeystringYes—

ErrorFixPreviewVerification

FieldTypeRequiredDescription
verificationIdstringYes—
statestringYes—
methodstringYes—
pathstringYes—
requestIdstringNo—
httpStatusintegerNo—
bodySha256stringNo—
truncatedbooleanNo—
observationSecondsintegerYes—
safeReasonstringNo—
replayedbooleanNo—

ErrorAlertRule

FieldTypeRequiredDescription
idstringYes—
namestringYes—
enabledbooleanYes—
triggerstringYesrelease sends one summary per observed live switch after its first 16 minutes: distinct new/regressed issue counts from the recorded transition ledger and at most 20 surviving issues. Opt-in; takes no threshold, window, digest or event filters.
thresholdintegerNo—
windowMinutesintegerNo—
cooldownMinutesintegerYes—
digestMinutesintegerNoOptional explicit warning-level opt-in. Omitted or 0 stays immediate. 5/15/60 uses prospective fixed UTC windows; at most 20 issue summaries per project/rule/destination/current authorized audience, with stable retry identity. Requires level warning; no backfill or broader email recipients.
environmentstringNo—
originstringNo—
levelstringNo—
assigneeUserIdstringNo—
tagsobjectNo—
destinationsstring[]Yes—

ErrorAlertDestination

FieldTypeRequiredDescription
idstringYes—
namestringYes—
kindstringYes—
enabledbooleanYes—
secretPresentbooleanYes—
versionintegerYes—

ErrorAlertDestinationInput

FieldTypeRequiredDescription
namestringYes—
kindstringYes—
enabledbooleanYes—
secretstringNoWrite-only public HTTPS URL, PagerDuty routing key, or Opsgenie API key (prefix eu: for the EU instance). Empty on update preserves the existing secret. Email never takes a secret.
acknowledgeExternalDisclosurebooleanNoRequired true when enabling an external destination. The endpoint receives minimal scrubbed issue data.

MonitorThresholds

FieldTypeRequiredDescription
alertnumberNo—
warnnumberNo—
alertRecoverynumberNoA group in alert stays there until it crosses this, when set.
warnRecoverynumberNo—

MonitorBurnWindow

FieldTypeRequiredDescription
longMinutesintegerYes—
shortMinutesintegerYes—
factornumberYes—
statestringYes—

MonitorQuery

Only the fields of the monitor's type may be set. Series types (metric, change, anomaly, apm, database, infra) take source, metric (apm, database, infra) or name and aggregation (custom), and filter. log takes filter (level, source, event_type, contains); error takes filter.origin; uptime checkId; cron the expression; slo_burn sloId and burnWindows (default 1 h/5 min at 14.4x alert, 6 h/30 min at 6x warn); composite expression (&&, ||, !, parentheses) and monitors (identifier to monitor ID or key); issue an Errors alert rule.

FieldTypeRequiredDescription
sourcestringNo—
metricstringNoapm: requests, errors, error_rate (percent), status_4xx, status_5xx, latency_avg, latency_p50, latency_p75, latency_p90, latency_p95, latency_p99, latency_p999. database: calls, errors, latency_avg, latency_p50, latency_p95, latency_p99, wait_share (percent of route wall time). infra: memory_pct, memory_bytes, psi_cpu_some, psi_mem_some, psi_mem_full, psi_io_some, oom_kills, oom_exits, high_events, cpu_throttled_us.
namestringNo—
aggregationstringNo—
filterobjectNo—
changeMinutesintegerNo—
changeModestringNo—
directionstringNo—
checkIdstringNo—
cronstringNo—
sloIdstringNo—
burnWindowsMonitorBurnWindow[]No—
expressionstringNo—
monitorsobjectNo—
ruleobjectNoAn Errors alert rule (ErrorAlertRule without id, name, enabled and destinations, which come from the monitor).

MonitorOptions

FieldTypeRequiredDescription
windowMinutesintegerNo—
frequencyMinutesintegerNo—
evaluationDelaySecondsintegerNo—
comparatorstringNo—
thresholdsMonitorThresholdsNo—
groupBystring[]NoOne alert per group, e.g. [route].
noDataobjectNo—
renotifyMinutesintegerNo—
requireFullWindowbooleanNo—
muteAfterDeployMinutesintegerNo—

Monitor

FieldTypeRequiredDescription
idstringNo—
keystringNoStable name; required in .runlot/monitors files.
namestringYes—
typestringYes—
queryMonitorQueryNo—
optionsMonitorOptionsNo—
messagestringNoTemplate: {{value}}, {{threshold}}, {{state}}, {{monitor.name}}, {{project}}, {{link}} and each group dimension such as {{route}}.
tagsstring[]No—
priorityintegerNo—
destinationsstring[]NoAlert destination IDs or names.
enabledbooleanNo—
sourcestringNo—
createdBystringNo—
createdAtstringNo—
updatedAtstringNo—

MonitorView

Type: Monitor & object

MonitorGroupState

FieldTypeRequiredDescription
keystringYes—
tagsobjectNo—
statestringYes—
sincestringYes—
valuenumberNo—
lastEvalstringYes—
lastDataAtstringNo—
notifiedAtstringNo—

MonitorDetail

Type: MonitorView & object

MonitorList

FieldTypeRequiredDescription
monitorsMonitorView[]Yes—
limitintegerYes—
codeobjectNoThe last live deployment whose .runlot/monitors were applied, and why it was refused when it was.

MonitorExport

FieldTypeRequiredDescription
monitorsMonitor[]Yes—
pathstringYes—

MonitorHistory

FieldTypeRequiredDescription
eventsobject[]Yes—
deliveriesobject[]Yes—

MonitorTestResult

FieldTypeRequiredDescription
queuedstring[]Yes—

Downtime

FieldTypeRequiredDescription
idstringNo—
scopeobjectYes—
startstringYes—
endstringNo—
recurrenceobjectNo—
messagestringNo—
createdBystringNo—
createdAtstringNo—
activebooleanNo—

DowntimeList

FieldTypeRequiredDescription
downtimesDowntime[]Yes—

SLO

FieldTypeRequiredDescription
idstringNo—
namestringYes—
descriptionstringNo—
typestringYes—
targetnumberYesPercent, e.g. 99.9.
windowsinteger[]No—
definitionobjectYes—
tagsstring[]No—
createdBystringNo—
createdAtstringNo—
updatedAtstringNo—

SLOWindow

FieldTypeRequiredDescription
daysintegerYes—
fromstringYes—
tostringYes—
totalnumberYesRequests (request SLO) or seconds (monitor SLO).
badnumberYes—
slinumberNoPercent good.
budgetRemainingnumberNoPercent of the error budget left; negative when overspent.
seriesobject[]Yes—

SLOReport

Type: SLO & object

SLOList

FieldTypeRequiredDescription
slosSLOReport[]Yes—
limitintegerYes—

ErrorAlertConfig

FieldTypeRequiredDescription
rulesErrorAlertRule[]Yes—
destinationsErrorAlertDestination[]Yes—
windowSemanticsstringYes—
customRulesReplaceDefaultMailbooleanYes—
outboxDroppedintegerYes—

ErrorAlertMailPreference

FieldTypeRequiredDescription
emailEnabledbooleanYes—

ErrorAlertDelivery

FieldTypeRequiredDescription
idstringYes—
issueIdstringYesIssue UUID for an individual delivery; empty for a cross-issue digest.
digestIdstringNo—
digestMinutesintegerNo—
issueCountintegerNoBounded number of surviving digest member issues, not billing.
releaseintegerNoDeployment version of a release summary delivery.
triggerstringYes—
statestringYes—
attemptsintegerYes—
lastErrorstringYes—
createdAtstringYes—

ErrorAlertDeliveryList

FieldTypeRequiredDescription
deliveriesErrorAlertDelivery[]Yes—

ErrorBrowserWitness

FieldTypeRequiredDescription
projectIdstringYes—
eventIdstringYes—
requestIdstringYes—
releasestringYes—
pageHashstringYes—
ipHashstringYes—

SignInBrand

docs/custom-sign-in.md §12.3. Every field optional; empty is the default.

FieldTypeRequiredDescription
namestringNo—
logostringNohttp(s) URL
colorstringNo—
logoDarkstringNohttps URL
themestringNo—
layoutstringNo—
buttonShapestringNo—
backgroundobjectNo—
copyobjectNo—
linksobjectNo—
defaultLangstringNo—
methodsstring[]No—

AuthBranding

FieldTypeRequiredDescription
brandSignInBrandYes—
effectiveMethodsstring[]Yes—

RepoRefs

FieldTypeRequiredDescription
defaultBranchstringYesThe repository's current default branch. If this ever disagrees with Repo.defaultBranch, this value is the correct one.
refsobject[]Yes—

RepoTreeEntry

FieldTypeRequiredDescription
namestringYes—
pathstringYesPath relative to the repository root
kindstringYes—
sizeintegerYesSize in bytes. Files only — directories are 0
oidstringYes—

RepoTree

FieldTypeRequiredDescription
refstringYes—
commitstringYes—
pathstringYes—
entriesRepoTreeEntry[]Yes—
truncatedbooleanYesTrue when the directory had more than 1000 entries and the list was cut short

RepoBlob

FieldTypeRequiredDescription
refstringYes—
commitstringYes—
pathstringYes—
oidstringYes—
sizeintegerYes—
binarybooleanYesThe file is binary (a NUL byte, or not valid UTF-8). content is empty
tooLargebooleanYesThe file exceeds 1 MiB, so content is not included
contentstringYes—

RepoCommit

FieldTypeRequiredDescription
oidstringYes—
messagestringYes—
authorstringYes—
emailstringYes—
timestampstringYes—

RepoName

A repository name. It becomes a URL path segment, so it cannot contain .. or a slash, and it cannot start with a dot. It is broader than a project name — uppercase letters, dots and underscores are allowed.

Type: string

RepoVisibility

Who can read the repository. New repositories are private. public means anyone may clone it anonymously.

Type: string

TokenScope

What a token may do over git, derived from its scopes when it is issued. A token inherits its owner's permissions and can only narrow them, never widen them.

repo:none is a token carrying no repository scope at all — a deploy-only CI credential. It clones nothing private and pushes nothing.

Type: string

OAuthTokenResponse

RFC 6749 §5.1.

FieldTypeRequiredDescription
access_tokenstringYesAn Ed25519 JWT (RFC 9068). Fifteen minutes.
token_typestringYes—
expires_inintegerYesSeconds. It is present so a client refreshes ahead of time instead of discovering expiry as a 401 in the middle of something.
refresh_tokenstringYesRotated: using one invalidates it and returns the next.
scopestringYes—

OAuthError

RFC 6749 §5.2. Not this document's error envelope: /oauth/token and /oauth/revoke are read by generic OAuth clients that cannot parse ours.

FieldTypeRequiredDescription
errorstringYes—
error_descriptionstringNo—

OAuthGrant

One connected app, as /account/apps lists it (docs/studio.md §8.4).

FieldTypeRequiredDescription
sidstringYesThe grant's session id. It is the sid claim in every access token it minted, and what revocation is keyed by.
clientIdstringYes—
clientNamestringYes—
deviceNameobjectYesWhat the device called itself when it connected. Null for a client that did not say.
scopesApiScope[]Yes—
createdAtstringYes—
lastUsedAtobjectYesNull when the grant has never been used — a sign-in that was never followed by a call.

ApiScope

One permission a personal access token carries. Scopes are checked on every route: the token acts as its owner, subject to that person's organization role, and the scope set then narrows what they may do with this particular credential.

scopewhat it opens
project:readprojects, deployments, logs, usage, secret names, cron, queues (overview, history, peek), hostnames, the deployment access policy
errors:readerror issues, events, settings and stored diagnoses, without other project reads
errors:piiadmin-only masked replays. Implies errors:read, never deploy
observability:reada project's metrics, traces and logs, its caps, export destinations and data page. Implied by project:read
observability:piiuser hashes and emails, IPs where stored, replays and unscrubbed fields in observability data. Implies observability:read
observability:adminobservability configuration: exports, rehydration, per-project role overrides and the audit trail. Implies observability:read
deploydeploy, rollback, create a project, write and delete secrets, purge and redrive a queue
db:readthe connection string, the wire credentials list, generations, operations
db:writeissue a wire credential, export, restore, drop the database. Implies db:read
repo:readclone and fetch over HTTPS, and the repository browse routes
repo:writepush, and create, rename or delete a repository. Implies repo:read
org:admineverything the person can do — members, billing, domains, DNS, granting storage/email/AI

project:read continues to include ordinary error reads for compatibility, but not errors:pii. Full org:admin tokens include both. Sensitive replay reads still require the admin organization role. OAuth clients do not gain these PAT scopes.

Any route not listed in the table requires org:admin.

deploy does not include project:read. project:read opens your worker's logs, which can contain anything your code prints, so a deploy credential does not get them unless you ask. A CI token that needs both names both: --scope deploy --scope project:read.

Type: string

Repo

FieldTypeRequiredDescription
repoIdstringYes—
orgSlugSlugYes—
projectSlugYesThe project this repository belongs to. Names are unique within a project.
nameRepoNameYes—
visibilityRepoVisibilityYes—
defaultBranchstringYesThe repository's default branch. This is a cached copy; if it ever disagrees with the repository itself, the repository wins and this value is corrected later.
sizeBytesintegerYesApproximate repository size, used for quota enforcement.
lastPushedAtstringNo—
createdAtstringYes—
cloneUrlstringNoThe HTTPS clone URL, https://<git-domain>/<org>/<project>/<repo>.git. Empty string when git hosting has no domain configured.
sshUrlstringNoThe SSH clone URL, git@<git-ssh-host>:<org>/<project>/<repo>.git. Empty string when git hosting has no SSH host configured.

RefUpdate

FieldTypeRequiredDescription
refstringYes—
oldstringNoThe oid the ref pointed to before. Null means the ref was created. This is what you need to recover commits lost to a force-push.
newstringNoThe oid the ref points to now. Null means the ref was deleted
forcedbooleanYesThe push was a non-fast-forward. There are no protected branches yet, so such a push is recorded rather than blocked.
actorUserstringNo—
createdAtstringYes—

DeployHook

FieldTypeRequiredDescription
enabledbooleanYes—
branchstringYesThe branch a push must update for a build to start. When configured is false this is the repository's default branch, offered as a suggested value rather than a setting that has been saved.
rootDirstringYesThe subdirectory the build runs in. Empty is the repository root.
configuredbooleanYesFalse when no hook has been set up. enabled: false with configured: true is a hook that was set up and then switched off.
updatedAtstringNo—

Build

FieldTypeRequiredDescription
buildIdstringYes—
commitShastringYes—
branchstringYes—
statestringYesThe build's current state. cancelled is not a failure: either someone stopped the build, or a newer push to the same branch superseded it while it was still queued.
errorstringYesWhy the build ended, as a code; empty on success — timeout, clone_failed, no_build_script, install_failed, build_failed, deploy_failed, minutes_exhausted, toolchain_missing, superseded, cancelled, internal. The full explanation is in the build log.
minutesnumberYesWall-clock minutes the build occupied a builder, not CPU minutes. This is what counts against your build allowance.
startedAtstringNo—
finishedAtstringNo—
createdAtstringYes—
deploymentIdstringNoThe deployment this build produced. Set only when the build succeeded.

SSHKey

FieldTypeRequiredDescription
keyIdstringYes—
namestringYes—
keyTypestringYes—
fingerprintstringYesThe key's fingerprint. It is unique across all of Runlot, so the same key cannot be added twice.
createdAtstringNo—
lastUsedAtstringNo—

AccessToken

FieldTypeRequiredDescription
tokenIdstringYesThe token's id. It is also the middle part of the token string itself (runlot_pat_<id>_<secret>), so you can match a token you hold to a row here.
namestringYes—
scopeTokenScopeYes—
scopesApiScope[]YesThe token's full permission set. scope above is what these mean for git access.
orgstringNoThe org this token is restricted to, as a slug. null means the token is not restricted to any one org.
projectstringNoThe project this token is restricted to. Implies org.
createdAtstringYes—
expiresAtstringNo—
lastUsedAtstringNoWhen the token was last used. Recorded at most once per minute per token, so it can lag real use by up to a minute.
revokedAtstringNo—

AccessTokenCreated

FieldTypeRequiredDescription
tokenIdstringYes—
namestringYes—
scopeTokenScopeYes—
scopesApiScope[]Yes—
orgstringNo—
projectstringNo—
tokenstringYesThe token itself, returned in this response only and never again. Only a hash of it is stored, so it cannot be recovered later. Copy it now.
expiresAtstringNo—

Slug

A short lowercase name. It becomes a single hostname label — a project is served at <name>.<org>.<app-domain> — so it must follow DNS naming rules.

Type: string

Error

FieldTypeRequiredDescription
errorobjectYes—

Session

A finished login or half of one.

When the account has a confirmed authenticator app, the first factor does not issue a session: token and user are absent, and mfa and pending are present instead. Send pending to POST /v1/auth/totp with the six-digit code to get the real session.

The two shapes never appear together: a response carries either a token or an mfa marker, never both.

FieldTypeRequiredDescription
tokenstringNo—
expiresAtstringNoWhen the session expires — or, on an mfa response, when pending expires
userUserNo—
mfastringNoThe second factor this account still needs. Present only on a half-finished login
pendingstringNoA five-minute token proving the first factor succeeded. It is not a session and no other endpoint accepts it.

AuthEmailAccepted

FieldTypeRequiredDescription
acceptedbooleanYes—

TotpStatus

FieldTypeRequiredDescription
enabledbooleanYesEvery login to this account requires a code from a confirmed authenticator app
enrollmentPendingbooleanYesEnrollment was started but never confirmed. Finish it with the code from the QR already scanned; starting again invalidates that one.
enabledAtstringNo—
recoveryCodesLeftintegerYesHow many unused recovery codes remain. The codes themselves cannot be listed again
orgsRequiringSlug[]YesSlugs of this person's organizations that require the second factor

TotpEnrollment

FieldTypeRequiredDescription
secretstringYesThe base32 shared secret, for an app that cannot scan a QR code. Readable here and nowhere else.
uristringYesotpauth://totp/runlot:<email>?secret=…&issuer=runlot — the string the QR encodes

TotpRecoveryCodes

FieldTypeRequiredDescription
recoveryCodesstring[]YesTen single-use recovery codes, returned once. They cannot be read again, so save them somewhere safe now.

User

FieldTypeRequiredDescription
userIdstringYes—
providerstringYesThe oldest login method linked to this account, kept as its primary provider
providersstring[]YesAll login methods linked to this user, oldest first
subjectstringYes—
emailobjectNo—
nameobjectNo—

Org

FieldTypeRequiredDescription
orgIdstringYes—
slugSlugYes—
namestringYes—
personalbooleanYes—

OrgMembership

Type: Org & object

AppCertState

Whether this organization's default app addresses can be opened yet.

A default address is three labels — <project>.<org>.<app-domain> — so a single *.<app-domain> certificate cannot cover it and each organization gets its own *.<org>.<app-domain>. That certificate is issued after the organization exists, which leaves a window where an address we have already told you about cannot be opened at all: the edge holds no certificate for that name and drops the TLS handshake, which browsers report as ERR_SSL_VERSION_OR_CIPHER_MISMATCH. Nothing can be written inside that error, so this field is how you learn about the window — show it next to the address rather than letting someone click through to a browser error page.

  • pending — being issued. The default addresses do not answer yet. It normally clears in well under a minute; it is retried with backoff.
  • active — issued. The address answers.
  • failed — issuance gave up for now. It is retried when the control plane restarts. Treat it as "will not open" rather than as a slow pending, and contact support if it persists.
  • none — this deployment issues no wildcard for app addresses, which is the local and development shape. Nothing to wait for — never render this as "not ready".

A custom domain is not covered by this field. Those have their own per-name certificate and their own state machine, and they appear in urls only once they are serving.

Type: string

Notification

FieldTypeRequiredDescription
idintegerYes—
kindstringYesWhat the notification is about. This is a stable value to branch on; the human-readable wording is produced separately by the dashboard and by email.
projectNamestringNoIf this is a project-related notification, the name of that project. Absent for org-level notifications (project_limit)
keystringYesA deduplication key within a kind. At most one notification is created per (kind, key) in 24 hours.
detailobjectYesExtra values, which differ by kind. project_limit is {limit, count}, a usage alert is {bytes, capBytes}, an operation alert is {opId, opKind, reason?}, cron_failed is {cron, reason, scheduledAt}, queue_failed is {queue, reason, runs}, queue_ops_cap is {used, limit, plan}, new_device is {app, clientId, device}, error_issue_new is {issueId, shortId, title, origin} and app_out_of_memory is {issueId, limitMiB, peakMiB, release}. monitor_alert is {monitorId, monitorName, monitorKind, monitorState, monitorGroup, monitorValue, monitorThreshold, monitorMessage, monitorLink}.
createdAtstringYes—
sentAtstringNoWhen the notification email was sent. Absent if it is queued or none was sent.

Project

FieldTypeRequiredDescription
projectIdstringYes—
orgSlugSlugYes—
nameSlugYes—
hostnamesstring[]Yes—
urlsstring[]Nohostnames as full, reachable URLs. The scheme and port depend on the environment (https://… in production, http://…:8787 locally), so use these rather than building URLs yourself. A default address is listed here while appCertState is pending — it is the address, and it is about to start working. Read that field before presenting one of these as something to click.
appCertStateAppCertStateNo—
createdAtstringYes—
disabledAtstringNoSet while the project is disabled. A disabled project does not serve requests and takes no new backups; its data and its existing backups are kept. It does not count toward the plan's project limit.
deleteAfterstringNoWhen a disabled project is deleted for good — one year after disabledAt. Enabling it before then cancels this. Admins are emailed 30, 7 and 1 days ahead.

ProjectDisabled

FieldTypeRequiredDescription
projectIdstringYes—
disabledbooleanYes—
disabledAtstringNo—
deleteAfterstringNo—
changedbooleanYes—

ProjectDetail

Type: Project & object

Placement

FieldTypeRequiredDescription
statestringYes—
epochintegerYes—
homeNodeobjectNo—
suspendedbooleanYesWhether the project is suspended. This is independent of state — a suspended project can still be active, and lifting the suspension returns it to serving.

ProjectOverview

Everything the project home page shows, in one response.

FieldTypeRequiredDescription
liveOverviewDeployment | nullYesThe deployment currently serving traffic. Null before the first deployment.
deploymentsOverviewDeployment[]YesRecent deployments, newest first. Up to 5 — use listDeployments for all of them.
deploymentCountintegerYesTotal number of deployments for this project.
databaseOverviewDatabaseYes—
featuresOverviewFeaturesYes—
customHostnamesintegerYesHow many custom hostnames the project has, including unverified ones.
reposintegerYesNumber of repositories in this project.
notificationsNotification[]YesThis project's recent notifications, newest first. Up to 5.

OverviewDeployment

A deployment in the overview. Same shape as Deployment, including actor.

Type: Deployment

OverviewDatabase

FieldTypeRequiredDescription
grantedbooleanYesWhether the project has a database. Every project has one unless it was deleted.
lastBackupAtstringNoWhen the most recent backup generation was taken. Absent if there is none yet.
lastCheckedAtstringNoWhen backup last checked the database. If the database has not changed, no new generation is taken but this timestamp still moves — so a backup that is healthy but idle keeps updating it.
generationsintegerYesHow many backup generations exist

OverviewFeatures

Which of the project's resources are on. Every one is on unless somebody turned it off.

FieldTypeRequiredDescription
databasebooleanYes—
storagebooleanYes—
emailbooleanYes—
authbooleanYes—

DeploymentUploadEntry

One entry of an incremental upload's file list. A regular file carries sha256 (lowercase hex) and size; a directory carries type: dir and a path ending in /.

FieldTypeRequiredDescription
pathstringYes—
sha256stringNo—
sizeintegerNo—
typestringNo—

DeploymentUpload

FieldTypeRequiredDescription
uploadIdstringYes—
missingstring[]Yessha256 hashes the server does not hold yet. Upload these, then commit.
expiresAtstringYes—

Deployment

FieldTypeRequiredDescription
deploymentIdstringYes—
versionintegerYes—
artifactShastringYesSHA-256 (hex) of the deployment bundle tarball
createdAtstringYes—
createdByobjectNo—
livebooleanYes—
actorstringNoDisplay name of the person who deployed — their name, else their email, else their provider subject. Returned in lists and overviews only, and empty when the deployer is not a known user.
manifestManifestNoThe manifest exactly as it passed validation. Absent for older deployments.
bundleBytesintegerNoThe bundle size after unpacking, not the compressed size.
bundleFilesintegerNoNumber of entries in the bundle (files + directories).
gitCommitstringNoThe commit hash the CLI reported at deploy time. For display only; not verified.
gitMessagestringNoThe first line of the commit message, up to 200 characters.
gitBranchstringNo—
gitDirtybooleanNoWhether the deployment shipped with uncommitted changes. If true, gitCommit does not describe the deployed code exactly.
warningsstring[]NoConditions that did not refuse the deploy: a declared framework the bundle contradicts, or a recognised framework deployed without runWorkerFirst: false.

The one address Studio hands to a person who is not a developer (docs/studio.md §6.9).

A preview's own hostname is <preview>--<project>.<org>.<app-domain>. The -- is what keeps a preview name from colliding with a project name and it is right for a CLI user, but it is not a link to send to somebody — and it carries the project's name, which the author of a half-finished app may not want published. So a shared preview gets a second hostname, and this is it.

The label is 12 characters of lowercase base32 ([a-z2-7], 60 bits). It contains no hyphen — that is why the project name is not in it, since a slug may contain one — and it is the only thing between the link and the app, so it is minted from a CSPRNG.

It lives under share.<app-domain>, not under an org, so it cannot collide with a project or preview name. share is a reserved org slug for that reason.

FieldTypeRequiredDescription
labelstringYesThe 12-character label. Minted once and kept across shares.
hostnamestringYes<label>.share.<app-domain>.
urlstringYesThe address to hand out. Built by the server — the scheme and port are a deployment matter.
previewSlugNoThe preview the link currently resolves to (studio, or studio-<branch>). Present so that "the link works but shows the wrong branch" is diagnosable.
createdAtstringYes—
rotatedAtstringNoWhen the label was last re-minted. Absent if it never was.

DeploymentMigrations

Whether the control plane applied this deployment's migrations/, and how far it got.

Present only on deployments the control plane migrates — today that is a preview deployed with db=branch. Absent means the schema is the client's to apply, which is what runlot deploy does.

applied with total: 0 is the answer for a bundle that carries no migrations at all; it is a state rather than an absence so that a caller waiting on this can tell "not started yet" from "there is nothing to run".

FieldTypeRequiredDescription
statestringYespending — not started, or waiting for the preview's database branch to finish being poured. A database that could not be reached also returns here, so that the next sweep retries: an unreachable node is not a failed migration. failed — one file threw, and it is named in failedName. Nothing after it ran.
totalintegerYesHow many migration files the bundle carries.
appliedintegerYesHow many of them went through.
failedNamestringNoThe file that threw, as 0003_posts. Only on failed.
detailstringNoThe database's own message, truncated. Only on failed.
startedAtstringYes—
finishedAtstringNoAbsent while pending or running.

Preview

One preview of a project. A preview behaves like a project of its own — it has its own hostname, deployments, access policy and usage — and this schema carries what is specific to being a preview: its parent, its database mode, and when it expires.

Creating one past the plan's per-project preview limit answers 409 preview_limit.

FieldTypeRequiredDescription
previewIdstringYes—
nameSlugYesWhat the user called it (--preview feat-42).
hostnamestringYesThe preview's hostname, <preview>--<project>.<org>.<app-domain>. Preview and project are joined into a single label so the hostname stays covered by the organization's wildcard certificate.
urlstringNoThe preview's full URL — https:// plus hostname. Use this rather than building it yourself.
dbModestringYesHow the preview gets a database. branch gives it its own copy, poured from the parent's latest backup generation. shared points it at production's database, so a destructive statement in the preview is destructive in production. none gives it no env.db at all.
statestringYesThe preview's lifecycle state. Copying a database takes as long as a restore, so a preview can sit in creating for a while and its hostname answers 503 until it is ready. Read this value rather than inferring readiness from the hostname.
deploymentIdstringNoThe deployment serving the preview. Null until its first deployment lands.
versionintegerNoThe preview's own version counter. It is independent of the parent's, and promoting does not carry it over.
sourceGenerationstringNoThe backup generation the preview's database was copied from. Null for shared and none, and also for a branch preview of a project that had no generation yet — that preview simply starts with an empty database.
createdAtstringYes—
expiresAtstringNoWhen the preview will be deleted. Derived from lastRequestAt and the organization's current plan, and recomputed on every request — so upgrading the plan extends previews that already exist.
lastRequestAtstringNoWhen the preview last served a request. Expiry is measured from here, not from createdAt, so a preview you keep using keeps living. It starts at createdAt, so a preview nobody ever opened still expires.

CronRun

One run of one scheduled job. A run that never started — because the previous run was still going, or because it came up past its grace period — is recorded too, with outcome: skipped and no durationMs.

FieldTypeRequiredDescription
cronstringYesThe cron expression exactly as you wrote it. It identifies the schedule.
namestringNoThe name the live deployment gives this expression in triggers.names. Absent when it has none. It is the current name, so renaming a schedule relabels its past runs too.
scheduledAtstringYesThe time the expression named, and the value your handler receives as controller.scheduledTime. It identifies the run: the same run is never recorded twice.
startedAtstringYesWhen the run began. If the project was idle, this is before it woke up, and the wake time is included in durationMs.
durationMsobjectNoWall-clock duration of the run, wake-up time included. Null when nothing ran (outcome: skipped).
outcomestringYesHow the run ended. ok succeeded. failed means your code is at fault — it threw, or the worker exports no scheduled handler. error means the run never reached your handler at all, for example the project could not be woken or the wall-clock bound was hit. skipped means the run was intentionally not started.
reasonstringNoWhy the run ended as it did, as a code. For failed it is workerd's own outcome (exception, canceled). Runlot's own codes are timeout, fire_failed, no_socket, wake_failed, overlap, too_late, schedule_changed and agent_shutdown. An agent_shutdown attempt was interrupted by the platform; the occurrence remains pending and may be retried under the same scheduledAt.
detailstringNoOne line of extra human-readable context, when there is any. May be empty.
requestIdstringNoThe request ID of this run's invocation record — the same value the worker received as the runlot-request-id header, so the history row, the invocation record and the logs your handler wrote under it name one run. Absent on rows recorded before request IDs existed.

CronSchedule

FieldTypeRequiredDescription
cronstringYes—
namestringNoThe name from triggers.names, when the live deployment gives one.
nextRunAtstringNoWhen this schedule fires next. Absent when the expression can never fire again; deploys reject such expressions, so only an old deployment can carry one.
lastRunCronRunNoThe most recent run of this schedule, taken from the full history rather than the current page.
monitorCronMonitorNo—

CronMonitor

Passive monitoring of the schedule's start check-ins and completion reports. This does not run or retry the handler. A missed check-in means no start check-in was received, not proof the job did not run. Platform observation gaps are unknown, never successful checks. Always present for declared schedules on current servers.

FieldTypeRequiredDescription
statestringYes—
reasonstringNoThe observation or gap code, such as no_start_checkin, no_completion_within_budget, not_judged_yet, cp_restart, platform_quarantine, redeploy, placement_change, node_agent_restart, node_not_active, project_not_active or catchup_limit.
sincestringNo—
lastObservedAtstringNoThe newest scheduled occurrence seen to start or complete.
evaluatedUntilstringNo—
runningobjectNo—
missedCronMonitorIncidentNo—
timeoutCronMonitorIncidentNo—
gapobjectNo—
windowobjectYes—

CronMonitorIncident

FieldTypeRequiredDescription
issueIdstringNoThe Runlot Errors issue opened for this incident.
openedAtstringYes—
scheduledAtstringNo—

CronSummary

How the last windowHours went, counted by outcome.

FieldTypeRequiredDescription
windowHoursintegerYes—
okintegerYes—
failedintegerYes—
erroredintegerYes—
skippedintegerYes—

ErrorErasureResult

FieldTypeRequiredDescription
eventsErasedintegerYes—
issuesDeletedintegerYes—
replaysDeletedintegerYes—
aiOutputsRemovedintegerYes—
aggregatesPreservedbooleanYes—

ErrorIssue

FieldTypeRequiredDescription
issueIdstringYes—
shortIdstringYesA short, stable name within the project, such as ERR-1A2B
titlestringYes—
culpritstringNoWhere it happened: the top in-app frame, else the route
typestringYesThe exception type, or a platform kind such as OutOfMemory
originstringYes—
levelstringYes—
statusstringYes—
substatusstringYesnew · ongoing · regressed · escalating, or empty when not unresolved
firstSeenstringYes—
lastSeenstringYes—
countintegerYesEvery occurrence, including ones whose body was not stored
userCountintegerYes—
firstReleaseintegerNo—
lastReleaseintegerNo—
resolvedAtstringNo—
resolvedInReleaseintegerNo—
resolveCommitstringNoExact hosted-repository commit selected for resolution
resolveCommitPendingbooleanNoStill unresolved until a clean live deployment contains this commit
archiveModestringNo—
archiveEventsintegerNo—
archiveUsersintegerNo—
archiveNewEventsintegerNoWeighted new arrivals while this issue is an archived routing target; moving merge history does not advance it
archiveNewUsersintegerNoDistinct reported user IDs on new arrivals in this archive window, not lifetime-new customers; erasure preserves the anonymous count
archivedUntilstringNo—
trendinteger[]YesOccurrences per hour over the last 24 hours, oldest first
assigneeUserIdstringNoThe org member the issue is assigned to
mergedIntostringNoSet on a merged source: the issue that now receives its events
titleCustombooleanNoThe title came from a project fingerprint rule, not from the event

ErrorComment

FieldTypeRequiredDescription
commentIdstringYes—
authorUserIdstringNo—
authorstringYes—
bodystringYes—
createdAtstringYes—

ErrorCommentPage

FieldTypeRequiredDescription
commentsErrorComment[]Yes—

ErrorSimilar

FieldTypeRequiredDescription
labelstringYesAlways "shared stack hints"
issuesobject[]Yes—

ErrorFingerprintRule

FieldTypeRequiredDescription
matchTypestringNoRE2 on the primary exception type
matchMessagestringNoRE2 on the primary exception message
matchModulestringNoRE2 on the innermost in-app frame's file
matchFunctionstringNoRE2 on the innermost in-app frame's function
tagsobjectNo—
fingerprintstring[]Yes"{{ default }}" stands for the built-in key
titlestringNo—

ErrorFingerprintRules

FieldTypeRequiredDescription
rulesErrorFingerprintRule[]Yes—

ErrorIssuePage

FieldTypeRequiredDescription
issuesErrorIssue[]Yes—
cursorstringNo—
keepDaysintegerYes—

ErrorIssueUpdate

FieldTypeRequiredDescription
statusstringYes—
resolveInstringNo—
resolveCommitstringNoRequired with resolveIn commit; repository is selected by the server. Remains unresolved/pending until exact or descendant commit is clean and live.
archiveEventsintegerNoArchive until this many new weighted arrivals. Mutually exclusive with archiveUsers and archiveUntil.
archiveUsersintegerNoArchive until this many distinct reported IDs on new arrivals, not lifetime-new users. Erased identities are not retained or recounted in an older archive window.
archiveUntilstringNoescalating, or a duration such as 24h

ErrorActivity

FieldTypeRequiredDescription
atstringYes—
kindstringYes—
actorstringNo—
detailstringNo—

ErrorTagCount

FieldTypeRequiredDescription
valuestringYes—
countintegerYes—

ErrorIssueDetail

FieldTypeRequiredDescription
issueErrorIssueYes—
latestEventErrorEventNo—
activityErrorActivity[]Yes—
tagsobjectYes—

ErrorEventSummary

FieldTypeRequiredDescription
eventIdstringYes—
timestampstringYes—
requestIdstringNo—
releaseintegerNo—
messagestringYes—
userIdstringNo—
urlstringNo—

ErrorEventPage

FieldTypeRequiredDescription
eventsErrorEventSummary[]Yes—
cursorstringNo—

ErrorFrame

FieldTypeRequiredDescription
functionstringNo—
filestringNo—
lineintegerNo—
columnintegerNo—
in_appbooleanYes—
debug_idstringNoSource map debug ID; resolved only inside this event's deployment
mapped_filestringNo—
mapped_lineintegerNo—
mapped_columnintegerNo—
mapped_functionstringNo—
context_linestringNo—
pre_contextstring[]No—
post_contextstring[]No—

ErrorException

FieldTypeRequiredDescription
typestringYes—
valuestringNo—
mechanismstringNo—
handledbooleanYes—
framesErrorFrame[]NoOutermost first, innermost last

ErrorBreadcrumb

FieldTypeRequiredDescription
timestampstringYes—
categorystringYes—
levelstringNo—
messagestringNo—
dataobjectNo—

ErrorEvent

One stored error event (docs/customer-error-tracking.md §4). Field names are snake_case.

FieldTypeRequiredDescription
event_idstringYes—
project_idstringYes—
originstringYes—
timestampstringYes—
levelstringYes—
request_idstringNo—
handlerstringNo—
deploymentstringNoThe deployment version the event came from
environmentstringNo—
messagestringNo—
exceptionsErrorException[]NoOutermost last
breadcrumbsErrorBreadcrumb[]No—
requestobjectNo—
userobjectNo—
tagsobjectNo—
contextsobjectNo—

ErrorInsights

FieldTypeRequiredDescription
eventIdstringNoActual stored occurrence analyzed. Explicit-selection clients require an exact match; omitted for no stored body or older CPs.
availablebooleanYes—
unavailablestringNono_event · no_frames · no_release · no_deployment · no_commit · dirty_tree · no_repo · ambiguous_repo · git_unavailable · repo_empty · git_error · commit_not_found
reasonstringNo—
releaseintegerNo—
commitstringNoThe deployment's full 40-hex commit; a short id is never resolved (commit_not_found)
previousCommitstringNoThe previous deployment's commit, only when it is clean and full and bounds the suspect range
repoobjectNo—
sourceContextsErrorInsightSourceContext[]Yes—
suspectsErrorInsightSuspectsNo—
codeownersFilestringNo—
ownersErrorInsightOwners[]Yes—

ErrorInsightSourceContext

FieldTypeRequiredDescription
frameintegerYesOrdinal in the server-filtered Git request, not an original/display stack index.
exceptionIndexintegerNoOptional zero-based exception index in the exact stored event. Absent on older CPs; never infer it from frame order.
frameIndexintegerNoOptional zero-based frame index in that stored exception's original frame array, before UI reversal/grouping.
pathstringYes—
lineintegerNo—
preContextstring[]No—
contextLinestringNo—
postContextstring[]No—
unavailablestringNono_file · unsafe_path · too_large · binary · no_line

ErrorInsightSuspects

FieldTypeRequiredDescription
commitsErrorSuspectCommit[]Yes—
rangeCommitsintegerYes—
rangeTruncatedbooleanNo—
hideTruncatedbooleanNo—
noPreviousbooleanNoNo previous release commit: the range is the release's most recent ancestors
unavailablestringNoprevious_release_unusable (the previous deployment has no clean, full commit, so no range and nobody named) · previous_commit_not_found · empty_range
notesstring[]No—

ErrorSuspectCommit

FieldTypeRequiredDescription
hashstringYes—
messagestringYes—
authorNamestringYesThe commit's own claim, unverified
authorTimestringYes—
authorVerifiedbooleanYesAlways false
memberUserIdstringNoPresent only when the commit email is the verified email of exactly one org member
authorEmailstringNoPresent only with memberUserId
filesstring[]Yes—
filesTruncatedbooleanNo—
confidencestringYesline: the commit last changed the frame's line; file: it only touched the file
framesobject[]Yes—

ErrorInsightOwners

FieldTypeRequiredDescription
sourcestringNoFirst matching .runlot/errors.json ownership rule, else the top in-app frame's CODEOWNERS rule. Unmapped handles grant nothing.
pathstringYes—
handlesstring[]YesRaw CODEOWNERS handles; email handles only when they map to a verified org member
memberUserIdsstring[]No—
hiddenEmailsintegerNo—
ruleLineintegerNo—
patternstringNo—

UptimeCheckInput

FieldTypeRequiredDescription
namestringYes—
urlstringYeshttps on port 443; the host must be one of the project's active addresses.
methodstringNoDefault GET.
headersobjectNoHost, Cookie, Authorization, hop-by-hop and Runlot-* headers are refused.
intervalMinutesintegerNoDefault 5 (15 on Free). Free runs at most every 15 minutes (403 plan_required).
timeoutMsintegerNoDefault 10000.
expectStatusMinintegerNoDefault 200.
expectStatusMaxintegerNoDefault 399. Redirects are not followed; a 3xx is the answer and is judged by this range.
bodyContainsstringNoMust appear in the first 64 KiB of the body. GET only.
maxLatencyMsintegerNo—
enabledbooleanNoDefault true.
assertionsUptimeAssertion[]NoChecked on the single request's answer.
stepsUptimeStep[]NoA multi-step API check: the steps replace the single request, run in order within timeoutMs, and carry extracted values forward as {{name}}.

UptimeRun

FieldTypeRequiredDescription
atstringYes—
okbooleanYes—
statusintegerNo—
latencyMsintegerYes—
reasonstringNo—
certDaysLeftintegerNoDays until the leaf certificate expires; within 14 a CertificateExpiring warning is raised, at most weekly.

UptimeCheck

Type: UptimeCheckInput & object

UptimeCheckList

FieldTypeRequiredDescription
checksUptimeCheck[]Yes—
limitintegerYesChecks allowed per project on this plan.

UptimeRunList

FieldTypeRequiredDescription
runsUptimeRun[]Yes—

ErrorOwnershipIdentity

FieldTypeRequiredDescription
userIdstringYes—
labelstringYesDisplay label only, never identity proof.
subjectstringYesCanonical positive signed-64-bit GitHub numeric ID.
githubLoginstringNoThe account's current GitHub login, from a lookup no older than 24 hours. Absent when none is fresh. A CODEOWNERS @handle equal to it assigns to this member without a manual pin.

ErrorOwnershipSnapshot

FieldTypeRequiredDescription
deploymentIdstringYes—
versionintegerYes—
repoIdstringYes—
commitstringYes—

ErrorOwnershipPinInput

FieldTypeRequiredDescription
deploymentIdstringYes—
repoIdstringYes—
commitstringYes—
selectorstringYesLiteral individual @handle, normalized lowercase. No @org/team, whitespace or consecutive hyphens.
userIdstringYes—
subjectstringYesExisting linked GitHub ID belonging to this current org member.
acknowledgeManualBindingbooleanYesManual policy pin, not provider-verified current handle proof.

ErrorOwnershipPin

FieldTypeRequiredDescription
deploymentIdstringYes—
repoIdstringYes—
commitstringYes—
selectorstringYes—
userIdstringYes—
providerstringYes—
subjectstringYes—
createdAtstringYes—
revokedAtstringNo—

ErrorOwnershipPolicy

FieldTypeRequiredDescription
identitiesErrorOwnershipIdentity[]Yes—
snapshotsErrorOwnershipSnapshot[]Yes—
pinsErrorOwnershipPin[]Yes—
identitiesTruncatedbooleanYes—
snapshotsTruncatedbooleanYes—
pinsTruncatedbooleanYes—

ErrorCapturePolicy

FieldTypeRequiredDescription
versionintegerYes—
consoleErrorsbooleanYes—
retainUserEmailbooleanYesRetain structured event user.email only, independently of feedback email. Requires acknowledgePII when enabled.
retainFeedbackEmailbooleanNoDefaults to false. Retain the optional unverified email explicitly supplied with browser feedback, independently of retainUserEmail. Not an account identity; Runlot sends no mail to it. Requires acknowledgePII when enabled. Ordinary feedback reads omit email; explicit admin/errors:pii reads may include it only while this option is enabled.
scrubPatternsstring[]Yes—
filtersobjectYes—
browserExcludedRoutesstring[]Yes—

ErrorCapturePolicyView

FieldTypeRequiredDescription
policyErrorCapturePolicyYes—
filteredobject[]Yes—

ErrorSettingsUpdate

FieldTypeRequiredDescription
monthlyCapobjectNo—
spanDailyCapobjectNoCompleted delivered DB/HTTP spans per UTC day. null: plan allowance; -1: no cap (Pro). Counts do not estimate missing gateway batches; sampled detail does not change the unit.
responseErrorsbooleanNo—
browserEnabledbooleanNo—
autoAssignbooleanNoAdmin opt-in; default false. Only new/unassigned issues; omitted leaves existing settings unchanged.
performanceErrorPerformanceThresholdsNo—

ErrorPerformanceThresholds

Per-project performance detector thresholds (docs/customer-error-tracking.md §10). An absent field is the detector's default. On a PUT the object replaces the stored overrides whole; {} resets every one. Omitting performance leaves them.

FieldTypeRequiredDescription
nPlusOneMinCallsintegerNoSequential calls of one statement shape (default 5)
nPlusOneMinTotalMsintegerNoTheir total duration (default 50)
consecutiveHttpMinintegerNoSequential outbound fetches (default 3)
consecutiveHttpEachMsintegerNoEach one at least this long (default 100)
slowQueryP95MsintegerNop95 over 24 hourly buckets must be past this bound (default 500); a histogram bound, never interpolated
slowQueryMinCallsintegerNoCalls in the window (default 50)
disabledstring[]No—

ErrorPerformanceEffective

FieldTypeRequiredDescription
nPlusOneMinCallsintegerYes—
nPlusOneMinTotalMsintegerYes—
consecutiveHttpMinintegerYes—
consecutiveHttpEachMsintegerYes—
slowQueryP95MsintegerYes—
slowQueryMinCallsintegerYes—
nPlusOneOffbooleanYes—
consecutiveHttpOffbooleanYes—
slowQueryOffbooleanYes—

ErrorSettings

FieldTypeRequiredDescription
autoAssignbooleanNoOff by default. Suggest owners from clean Git snapshots; autoassign new/unassigned issues only after admin opt-in. Never overwrites manual assignment or grants access.
monthlyCapobjectYesnull: the plan's included amount. -1: no cap (Pro and above). Platform events are never capped.
includedintegerYes—
usedMonthintegerYes—
spanDailyCapobjectNo—
spansIncludedintegerNoDaily per-project span allowance: Free 200000, Pro 2000000
spansObservedDayintegerNo—
spendingLimitCentsintegerNoOrganization monthly overage spending limit in cents; includes errors/replays/spans
spanSamplePercentintegerNoSuccessful span detail sampling; error/candidate traces and counts are kept.
planstringYes—
responseErrorsbooleanYesWhether a 5xx answer without a thrown error becomes a ResponseError issue
browserEnabledbooleanNoWhether the browser agent may be injected into this project's pages (docs/customer-error-tracking.md §12). Defaults to true. It can only turn the agent off: injection also needs the org to be on Pro, a live deployment, and a manifest without observability.browser: false. A change reaches the app at the next routing-map refresh, with no deploy. Always present on a GET. On a PUT, absent leaves it unchanged; true below Pro is 403 plan_required, false is allowed on every plan.
performanceErrorPerformanceThresholdsNo—
performanceEffectiveErrorPerformanceEffectiveNo—

ErrorFixProposal

FieldTypeRequiredDescription
proposalIdstringYes—
issueIdstringYes—
eventIdstringNoThe stored event whose frames chose the files
statestringYes—
modelstringYes—
repoIdstringNo—
repoNamestringNo—
baseCommitstringNoThe full commit the files were read at
proposalShastringNoSHA-256 over the repository, the base commit and every file's path, old and new content. An apply must quote it.
filesobject[]Yes—
explanationstringYes—
usageobjectYes—
chargedintegerYesMicrocents
balanceintegerNoThe org's AI balance after the call, in microcents; only on the answer to the call that paid
authorstringNo—
createdAtstringYes—
finishedAtstringNo—
expiresAtstringYesAfter this it cannot be applied
replayedbooleanNo—
errorCodestringNoWhy a failed proposal failed: truncated, invalid_output, path_not_allowed, no_fix, …
safeReasonstringNo—
appliedobjectNo—

ErrorFixApplyResult

FieldTypeRequiredDescription
proposalIdstringYes—
proposalShastringYes—
branchstringYesrunlot/autofix/<proposal>
commitstringYes—
baseCommitstringYes—
createdbooleanYesfalse when the same change was already on the branch

BrowserVitalBucket

FieldTypeRequiredDescription
hourstringYes—
metricstringYes—
samplesintegerYes—
totalnumberYes—
minimumnumberYes—
maximumnumberYes—
histograminteger[]Yes—
upperBoundsnumber[]Yes—

BrowserTelemetryDay

FieldTypeRequiredDescription
daystringYes—
acceptedintegerYes—
feedbackintegerYesAccepted feedback observations including later expired or erased pending messages
droppedAttemptsintegerYesCP technical-fuse refusal attempts, not unique people

BrowserTelemetrySummary

FieldTypeRequiredDescription
originstringYes—
untrustedbooleanYes—
vitalsBrowserVitalBucket[]Yes—
daysBrowserTelemetryDay[]Yes—
technicalDailyLimitintegerYes—
technicalFeedbackDailyLimitintegerYes—
vitalRetentionDaysintegerYes—
feedbackRetentionDaysintegerYes—
percentilesstringYes—
pricingstringYes—

BrowserFeedback

FieldTypeRequiredDescription
feedbackIdstringYes—
eventIdstringYes—
requestIdstringYes—
releaseintegerYes—
messagestringYes—
emailstringNoOptional unverified email explicitly supplied with feedback, not an account identity. Present only for an authorized includePII=true read while retainFeedbackEmail is enabled; omitted from ordinary replies. Runlot sends no mail to it.
receivedAtstringYes—
originstringYes—
verifiedbooleanYes—

BrowserFeedbackList

FieldTypeRequiredDescription
feedbackBrowserFeedback[]Yes—

ErrorReplaySettings

FieldTypeRequiredDescription
enabledbooleanYesThe project's replay switch. Defaults to true.
monthlyCapobjectYesnull: the plan's included amount. -1: no cap (Pro). 0: collection off.
planstringYes—
supportedbooleanYesWhether the plan has replay (Pro)
browserEnabledbooleanYesThe browser agent's switch; off turns replay off
effectivebooleanYesWhether pages are offered the recorder now
includedintegerYes—
usedMonthintegerYesComplete replays this month
billableMonthintegerYesReplays this month past the included amount. Counted, not charged.
retentionDaysintegerYes—
pricingstringYesNo price is set; nothing is charged

ErrorReplay

FieldTypeRequiredDescription
replayIdstringYes—
eventIdstringYesThe browser error event it was recorded for
requestIdstringYesThe request that rendered the page
releaseintegerYes—
startstringYes—
endstringYes—
framesintegerYes—
chunksintegerYes—
bytesintegerYes—
maxLiveNodesintegerYes—
truncatedbooleanYesThe page had more than 1,000 elements or deeper than 32, and the rest was not recorded
expiresAtstringYes—
kindstringYes—
maskingstringYes—

ErrorReplayBatch

One batch of the masked structural replay format, version 1 (internal/errorreplay). It names no project, user or URL. Frames carry the viewport, the scroll and nodes of {id, p, tag, r: [x, y, w, h], s?, it?, txt?, val?}, where tag is one of a fixed list, s holds only enums and numbers, and txt/val are always [masked].

FieldTypeRequiredDescription
vintegerYes—
replay_idstringYes—
event_idstringYes—
seqintegerYes—
lastbooleanYes—
framesobject[]Yes—

ErrorDiagnosis

FieldTypeRequiredDescription
diagnosisIdstringYes—
issueIdstringYes—
eventIdstringNoThe stored event the diagnosis read
statestringYes—
summarystringYes—
causesobject[]Yes—
suggestedFixstringYes—
confidencestringYes—
modelstringYes—
usageobjectYes—
chargedintegerYesWhat the call cost, in microcents (1/1,000,000 of a cent)
balanceintegerNoThe organization's AI balance after this call, in microcents. Only on the answer to the call that paid.
authorstringNo—
createdAtstringYes—
finishedAtstringNo—
replayedbooleanNoA stored answer returned for a repeated key; nothing was charged
errorCodestringNoWhy a failed diagnosis failed
errorMessagestringNo—

CronOverview

FieldTypeRequiredDescription
schedulesCronSchedule[]YesThe schedules the live deployment declares. Empty means the project has no schedules.
runsCronRun[]YesNewest first.
summaryCronSummaryYes—
keepDaysintegerYesHow far back the run history goes on this org's plan, in days. It always reflects the plan's current value.

QueueRun

One delivered batch of one queue. There is one row per batch, not per message: the four counters add up to the batch. A batch that never reached your handler has delivered > 0 and zeros everywhere else, which means those messages went back to the queue untouched.

FieldTypeRequiredDescription
queuestringYes—
startedAtstringYes—
finishedAtstringNoAbsent for a batch that never began (outcome: skipped).
durationMsobjectNoWall clock, wake included. null when nothing ran.
deliveredintegerYesHow many messages were leased into this batch.
ackedintegerYes—
retriedintegerYes—
deadintegerYesHow many left for the dead-letter queue, or were dropped because there is none.
outcomestringYesThe same four outcomes as CronRun.outcome, split by who has to act. failed is your code — it threw, or the worker exports no queue handler. error means the batch never reached your handler (no socket, a project that would not wake, a transport failure, or the time bound) and is ours to fix. skipped means delivery was deliberately not attempted.
reasonstringNoA short code, never a sentence. For failed it is workerd's own outcome (exception, canceled). Runlot-side codes are no_socket, wake_failed, drive_failed, timeout, consumers_changed.
detailstringNoOne line of human-readable context when there is one. May be empty.
requestIdstringNoThe request ID of this batch's invocation record — the same value the worker received as the runlot-request-id header, so the history row, the invocation record and the logs your handler wrote under it name one batch. Absent on rows recorded before request IDs existed.

QueueConsumer

A consumer's settings as the deployment declares them, with defaults filled in.

FieldTypeRequiredDescription
maxBatchSizeintegerYes1–100, default 10.
maxBatchTimeoutintegerYesSeconds, 1–60, default 5.
maxRetriesintegerYes0–10, default 3.
deadLetterQueuestringNoWhere a message goes once it is out of retries. Absent means it is deleted instead.

QueueDepth

Queue depth split three ways rather than given as one total. A queue that is all delayed is working normally; a queue that is all inflight is stuck. A single number cannot tell those apart.

FieldTypeRequiredDescription
visibleintegerYesCould be delivered right now.
delayedintegerYesWaiting on its own delay or backoff.
inflightintegerYesLeased to a handler that has not answered yet.

QueueStatus

FieldTypeRequiredDescription
queuestringYes—
producersstring[]YesThe binding names (env.<BINDING>) that send into this queue.
consumerQueueConsumerNoAbsent for a queue nothing drains — a fan-out target, or a dead-letter queue nobody consumes.
deadLetterForstring[]NoThe queues whose dead-letter queue this one is. Non-empty is what makes redrive apply to this row.
depthQueueDepthNoAbsent when the project's database could not be read (QueueOverview.depthError).
deadLettersintegerNoHow many messages sit in this queue's dead-letter queue. Absent without one, or when the depth is unknown.
lastRunQueueRunNoThe most recent batch of this queue, taken from the whole history and not just the page below it.

QueueSummary

How the last windowHours went, counted by outcome.

FieldTypeRequiredDescription
windowHoursintegerYes—
okintegerYes—
failedintegerYes—
erroredintegerYes—
skippedintegerYes—

QueueOverview

FieldTypeRequiredDescription
queuesQueueStatus[]YesThe queues the live deployment declares, in declaration order. Empty means no queues.
runsQueueRun[]YesNewest first, across every queue.
summaryQueueSummaryYes—
keepDaysintegerYesHow far back the history goes on this org's plan, in days (30 free, 365 pro).
opsTodayintegerYesThe project's queue operations today (UTC). A send is one, a delivery is one. 0 when the depth could not be read.
opsCapintegerYesThe plan's daily bound (free 10,000, pro 1,000,000). Past it, send throws QueueLimitError until 00:00 UTC.
depthErrorstringNoPresent when the project's database could not be read. The declarations and the history are still answered.

QueueMessage

One message as peekQueue shows it. preview is a clipped rendering of the body, never the body.

FieldTypeRequiredDescription
idstringYesThe message id, as a string. It is valid only while the message exists.
attemptsintegerYesDeliveries so far in this queue.
contentTypestringYes—
enqueuedAtstringYes—
visibleAtstringYesWhen it becomes deliverable. In the past for a visible message.
inflightbooleanYesLeased to a handler right now.
previewstringYesThe first 200 characters of the body, or <n bytes> for a binary one.

VectorNamespace

FieldTypeRequiredDescription
namespacestringYes—
countintegerYes—
dimensionsintegerNoThe width every vector in the namespace has. Absent when the namespace holds more than one width, which search refuses.

DurableObjectUsage

Durable Object counts and storage sizes for this project. Counts are always exact. Sizes are summed from the nodes holding your objects, so read them together with complete and measuredAt.

FieldTypeRequiredDescription
countintegerYesHow many Durable Objects this project has placed, across every node.
limitintegerYesThe maximum number of Durable Objects this project can place.
bytesintegerYesTotal size of the object stores, summed over the nodes that have reported. Read it with complete. When complete is false this is a lower bound, not the project's full size.
filesintegerYesStore files counted the same way, under the same caveat. It is not the object count — an object that has never written has no file.
completebooleanYesWhether every node holding this project's objects has reported its sizes. When false, bytes and files cover only part of your objects and are a lower bound. A project with no objects at all is true with zero.
measuredAtstringNoThe oldest measurement included in the totals, so it tells you how stale they may be. Absent when nothing has been reported.
nodesobjectYesThe per-node breakdown, keyed by node id. Use it to see which node is near nodeLimit, and which node's numbers are missing or stale.
nodeLimitintegerYesThe maximum number of this project's Durable Objects a single node can hold. It applies in addition to limit, so a placement can be refused while the project-wide cap still has room.

VectorOverview

FieldTypeRequiredDescription
namespacesVectorNamespace[]YesEvery namespace with vectors in it, sorted by name. Empty means nothing stored, not unknown.
countintegerYesVectors across every namespace. 0 when the store could not be read.
limitintegerYesThe plan's bound on vectors per project (free 5,000, pro 25,000). Past it, upsert throws VectorsError with code vector_limit.
dimensionsMaxintegerYesThe widest vector the store accepts (3,072).
planstringYes—
exactbooleanYesAlways true — search is exact k-NN; there is no approximate index.
readErrorstringNoPresent when the project's database could not be read. The bounds are still answered.

DatabaseEndpoint

FieldTypeRequiredDescription
hoststringYes—
portintegerYes—
databasestringYes—
sslmodestringYes—

DatabaseTokenMeta

FieldTypeRequiredDescription
userstringYes—
expiresAtstringYes—
createdAtstringYes—

DatabaseToken

FieldTypeRequiredDescription
userstringYes—
passwordstringYesIncluded only in this response.
expiresAtstringYes—
connectConnectInfoYesSame format as DatabaseConnect.connect; user/password are the values of this token.

ConnectInfo

FieldTypeRequiredDescription
hoststringYesThe project's hostname. Connections are routed to the right project by SNI, which is why this is a hostname and not a UUID.
portintegerYesThe port that accepts PostgreSQL wire connections for this project.
databasestringYesThe project UUID. Use it as the database name in your connection string.
userstringYesThe initial database role. Each project database has its own roles, so names never collide.
passwordstringYes—
sslmodestringYesConnections with sslmode=disable are rejected. TLS is required, so a client configured to disable it never connects at all.

DatabaseConnect

FieldTypeRequiredDescription
dbbooleanYes—
keyVersionintegerNoThe version of this project's data encryption key. Returned only when the database is created, and the field is absent entirely if the key could not be secured. It is not returned as 0, because keyVersion=0 already means "plaintext generation" and would wrongly suggest the backup is confirmed plaintext. When absent, the backup scheduler secures the key later.
connectConnectInfoYes—

DatabaseExport

FieldTypeRequiredDescription
projectIdstringYes—
epochintegerYesThe incarnation that created the image. Even within one project, a different epoch means a different database, so this value matters as much as the key.
nodestringYesNode that took the image
exportobjectYes—

DatabaseGenerations

FieldTypeRequiredDescription
projectIdstringYes—
epochintegerYesThe currently running incarnation. Rows in the list can belong to an older epoch.
statestringYesPlacement status (active, cold, restoring, and so on)
lastCheckedAtstringNoWhen the database was last checked for changes, even if nothing had changed. Empty means it has never been checked. This is what tells a stalled generation apart from a dead backup.
generationsGenerationRow[]YesNewest first. An empty array is an array, not null
objectsObjectBackupSetNo—

ObjectBackupSet

What a Durable Object restore would select, alongside the database generations it is not consistent with.

Unavailable is not empty. If the object half cannot be read, available is false, complete is false, and the lists are empty — which is not the same as having no object backups. The database listing is still answered either way.

FieldTypeRequiredDescription
availablebooleanYesWhether the object half could be read at all.
atomicbooleanYesAlways false. The database and the objects are not restored to one consistent instant, so do not present a single restore time for both.
restorablebooleanYesavailable && complete — eligibility, not a success guarantee. The restore call (POST /orgs/{orgSlug}/projects/{projectName}/database/restore) refuses outright when missing or gaps is non-empty, so false here means the call is not worth attempting. true means only that the preflight would pass; the restore can still fail afterwards on a holder's own store (unreachable node, a lost or corrupted archive, a digest mismatch found only when the file is read). It is also computed at this response's at, which is one instant for the whole project — a restore targets one generation's own lastAt, so re-query with ?at=<that generation's lastAt> before trusting this field for that restore.
atstringNo—
holdersstring[]YesEvery node holding an initialized object of this project.
componentsobject[]YesThe newest component at or before at, one per node.
missingstring[]YesNodes holding initialized objects with nothing archived at or before at. Their current bytes are not substituted — a restore that quietly used live bytes for a historical component would return a state that never existed.
gapsobject[]YesNodes with an object initialized strictly after their selected component but at or before at — the object existed at the restore target and the archive has no file for it. An object initialized after at is not a gap: it did not exist at the target, and a restore removes its placement instead. It is separate from missing because the two mean different things. missing is "this node has no backup"; this is "this node's backup predates some of the objects that existed at the restore target". A restore to this point would leave those objects unopenable.
completebooleanYesavailable with neither missing nor gaps. The pieces are identified and cover every object that existed at at. See restorable for whether the restore preflight would accept them; neither field promises the restore itself will succeed.
keepDaysintegerYesThe retention window in days, from the org plan's value.

GenerationRow

One backup generation of a project's database.

FieldTypeRequiredDescription
epochintegerYes—
seqintegerYesIncreases monotonically within an epoch. Restore identifies a generation by (epoch, seq).
keystringYesOffsite key (gen/<project>/<epoch>/<stamp>-<seq>.log)
bytesintegerYesThe size of the object stored offsite. An encrypted backup is larger than the plaintext. For a commit log this is the size of the logged page versions only — see imageBytes for the size of the database a restore produces.
fullbooleanYestrue when this object alone restores the database; false for a commit log, which is replayed on top of the chain that ends at prevTxnId. Restoring a log pours its whole chain (full first); the chain is resolved by the server and never crosses an epoch.
prevTxnIdintegerNoFor a commit log, the last commit of the backup it links to. 0 for a full.
imageBytesintegerYesThe size of the database a restore of this generation produces.
firstTxnIdintegerYesThe first commit this backup carries. A backup is an ordered log of the commits since the previous one, so every commit in [firstTxnId, txnId] is a restore point (RestoreRequest.txnId). A historical full may carry a range. Equal to txnId for a single-commit full or a backup with no commits.
commitCountintegerYesHow many commits this backup carries. A full backup may preserve multiple pending commits. Zero means no writes since the previous backup.
firstAtstringNoWall-clock time of the first commit carried. Absent when commitCount is 0.
lastAtstringNoWall-clock time of the last commit carried. Absent when commitCount is 0.
sha256stringYes—
plainBytesintegerNoThe size of the plaintext (feather image) inside the encrypted data. For plaintext generations, this equals bytes
keyVersionintegerNoThe encryption key version used. 0 means plaintext (a generation created without a key)
txnIdintegerYesCommit number that the image contains. 0 means unknown.
kindstringNoWhy the generation was created. Not used for decisions. park, evict and deploy are the shipment taken right before the process stops.
createdAtstringYes—
nodestringNoThe node that captured the generation
latestbooleanYesMarks the generation the project's latest-backup pointer refers to. The pointer only ever moves forward, so a later generation from an older epoch cannot claim it.
finalbooleanYesA safety copy taken right before eviction, deletion, or restore. It is listed with regular generations, but pruning does not count it.

RestoreRequest

A restore point, given in exactly one of three ways. (epoch, seq) restores to the end of that backup. txnId restores to that commit, which may be inside a backup — every backup carries the commits between it and the previous one in order, so any of them is a restore point (GenerationRow.firstTxnId … txnId). at uses stored millisecond timestamps and restores to the last commit at or before that time (RFC 3339); the resolution is one backup interval.

FieldTypeRequiredDescription
epochintegerNo—
seqintegerNo—
txnIdintegerNoA commit to restore to. Must lie inside some backup's [firstTxnId, txnId].
atstringNoRestore to the last commit at or before this time.

DeleteRequest

FieldTypeRequiredDescription
confirmstringYesMust match the project name exactly. This is the only confirmation a script running with --yes has to pass, so it is checked on the server.

OperationStarted

This response means the multi-step operation was queued (202). It does not mean it finished — check progress at …/database/operations/{opId}.

FieldTypeRequiredDescription
projectIdstringYes—
opIdstringYes—
kindstringYes—
epochintegerYes—
nodestringNo—
purgeAfterstringNoProject deletion only. When the project's data is actually destroyed. The project is already gone from every surface — this is the date the bytes stop existing. Read this value rather than computing it from a retention window.

Operation

FieldTypeRequiredDescription
opIdstringYes—
kindstringYes—
projectIdstringYes—
phasestringYesThe step currently in progress (draining, sealing, committing, and so on). It only changes when real progress is made, so it is safe to print on change.
attemptintegerNo—
deferralsintegerNo—
ownerstringNo—
terminalCodestringNoThe reason it ended. aborted means a person stopped it, and any other value is a failure. Empty with done means success.
failedAtstringNo—
errorstringNo—
donebooleanYesDoes not proceed further. terminalCode distinguishes success, failure, and abort
retryAfterSecondsintegerNoSeconds remaining until the next attempt. 0 means it is ready to process now, so this value tells waiting-for-backoff apart from actively running.

Manifest

The runlot.json inside your deployment bundle. It does not travel in the HTTP body, but it is part of the contract, so it is documented here.

FieldTypeRequiredDescription
mainobjectNoThe worker entry point's path within the bundle. If absent, this is a pure static site (the same model as Workers Static Assets).
assetsobjectNoPath to the static assets directory within the bundle
compatibilityDatestringNo—
notFoundstringNoThe answer for a path that is not in the assets. With spa, a path without an extension is served /index.html (client-side routing). The default is 404. A path with an extension is still a 404 under spa, so a missing bundle never becomes a silent 200.
observabilityobjectNoObservability switches (docs/customer-error-tracking.md, docs/customer-observability.md). Error capture runs in the worker's own isolate and is on unless errors is false: uncaught exceptions, rejected waitUntil promises, console.error(err) and runlot:errors reports become error events. Platform failures (out of memory, crashes, boot and build failures) are recorded either way. logs and traces collect each sampled invocation's console lines, exceptions and spans. Both are off unless enabled is true; the dashboard's settings take precedence over them. tags are added to every env.metrics point; routes are declared route templates such as /users/:id/orders. browser is an opt-out only (docs/customer-error-tracking.md §12): the browser agent is on by default for Pro projects, and the plan is the control plane's decision, never the bundle's. false turns injection off; true or absent changes nothing, and never turns it on for a plan that does not include it. monitors is the repository's .runlot/monitors/*.json, embedded by the CLI (docs/customer-observability.md §17.8). Each needs a key; when the deployment goes live they replace the project's repository monitors by key. Absent changes nothing; an empty list removes every repository monitor.
tail_consumersobject[]NoExports of the main module that receive this worker's traces through workerd's tail mechanism (docs/customer-observability.md §12). The plan bounds how many.
runWorkerFirstbooleanNoWho sees a request first when the project has both a worker and an assets directory. The default is true: the worker is the entry point and the disk is not consulted ahead of it. With false an exact file wins and everything else is handed to the worker — which is the order a framework's own server build (React Router, Astro, SvelteKit, Nuxt) is written against.
compatibilityFlagsstring[]NoThe workerd compatibility flags to enable for the worker. Only flags on the allow list are accepted; anything else is rejected at deploy time. Do not include experimental — it is added for you. nodejs_compat: for libraries (TypeORM, Sequelize, Knex) that require Node built-in modules (node:events, node:util, …). The CLI adds this when the bundle imports a Node built-in. runlot_isolated_preview_http_v1 is a reserved server seal found only on isolated preview artifacts. Ordinary customer deployments cannot supply it, and the flag alone grants no policy or execution permission.
modulesManifestModule[]NoA workerd module loaded separately next to the entry point. Currently only wasm — workerd blocks compiling WASM inside the bundle (for example, Prisma 7's query compiler), so WASM can only enter this way. name is exactly the specifier the worker code imports, and path is the file inside the bundle. The CLI writes one entry per .wasm import left by the bundle.
frameworkstringNoA marker that the deploy tool bundled with a framework adapter. If next, the two bindings OpenNext looks for are also rendered (ASSETS alias, WORKER_SELF_REFERENCE). Unknown values cause the deployment to be rejected.
triggersManifestTriggersNo—
queuesManifestQueuesNo—
durable_objectsManifestDurableObjectsNo—
migrationsManifestDurableObjectMigration[]NoThe append-only history that creates this project's Durable Object classes. It is top-level rather than part of a binding: a class stays created after the binding that reached it is deleted. The array is the history and its order is the order it happened in. Nothing sorts it and nothing rewrites a tag. A tag is unique across the history, every step has to create at least one class no earlier step created, and a project may have at most 32 distinct classes. Every binding's class_name has to appear in one of these steps or the deployment is refused; a class no binding reaches is accepted with a warning. Only new_classes and new_sqlite_classes are supported. renamed_classes, deleted_classes and transferred_classes are refused by name rather than ignored, so a dropped migration key can never report a successful deploy while the class the worker exports has no objects under it.
emailbooleanNoDeclares email sending and receiving. When true, the worker receives env.email, and export default { email() } becomes the receiving handler. This only makes sense if main is present — static assets alone have no code to send or receive with.
aibooleanNoDeclares the AI runtime binding. When true and the project has an AI grant, the worker receives env.ai. Declare it here so each deployment states for itself whether its code asked for the binding.
trustedCertificatesstring[]NoPEM files inside the bundle whose certificates are added to the trust store used for outbound TLS by this project's worker. Use it to reach an origin that omits its intermediate certificate. Such an origin cannot be reached at all otherwise: the handshake fails before any JavaScript runs, so nothing in the app can repair it. Every entry must sit under certs/. Each file is parsed at deploy time and an expired certificate is rejected; one inside its last 90 days is accepted with a warning. The system trust store is always kept, so this adds trust and never replaces it. Requires main.
accessManifestAccessRule[]NoPath rules that narrow the project's access policy (runlot access) for this deployment. Each request is checked against every rule whose path matches it, and every matching rule must hold; a refused request gets 403 access_rule_denied. The rules only apply while the policy is org or password. On a public project they are ignored (the deploy warns), because there is no identity to test. A visitor admitted by the shared password or the automation bypass secret satisfies only a rule with an empty require. The rules move with the deployment: rolling back restores the old list.

ManifestAccessRule

One manifest path rule (access[]).

FieldTypeRequiredDescription
pathstringYesAn absolute path. An exact path, or a prefix ending in /*, which also covers the prefix itself (/admin/* covers /admin and /admin/x). * is accepted nowhere else. Matching is case-insensitive on the cleaned request path.
requireobjectYesWhat the visitor must satisfy. Every field that is set must hold; {} admits anyone the project policy already admitted.

ManifestTriggers

Scheduled execution. It ships in the bundle exactly as you wrote it in runlot.json.

Cron is the only trigger today, but it is accepted as an object so that adding other trigger kinds later will not change what you write.

FieldTypeRequiredDescription
cronsstring[]NoA 5-field cron expression (minute hour day month weekday), in UTC. It has 1-minute granularity, with up to 5 schedules per project; the org-wide limit comes from the plan. The expression is parsed at deploy time — invalid syntax, or an expression that never fires in the future (0 0 30 2 *), returns 400. Anything that merely looks like a cron expression would otherwise deploy fine and never run. If triggers is set, main must also be set: a deployment with only static assets has no scheduled handler.
namesobjectNoA name for each schedule, keyed by its expression, shown in the dashboard and in runlot cron. Optional and per expression. Every key must be one of crons; a name is one line of at most 80 bytes.

ManifestQueues

Queues. Two lists. A project may produce into a queue it does not consume, and consume a queue it never produces into — a dead-letter queue is that case — so neither list implies the other.

Every distinct name across both lists, dead-letter queues included, counts against the per-project bound of 5; the org-wide bound comes from the plan (free 5, pro 25) and a deployment past it is refused with 400 queue_limit. Requires main and database: the messages are rows in the project's own database.

FieldTypeRequiredDescription
producersobject[]No—
consumersobject[]No—

ManifestDurableObjects

Durable Objects. One list of bindings, spelled with snake_case keys, which the rest of this manifest does not use, so that a durable_objects block can be copied in as a whole.

It ships in the bundle because the class a binding points at is a property of your code. Requires main: a Durable Object is a class the worker exports, and static-only deployments export none.

FieldTypeRequiredDescription
bindingsobject[]No—

ManifestDurableObjectMigration

One step of the Durable Object migration history.

The two kinds are not the same class. Both are stored on SQLite, but a class created as new_classes has enableSql false and never gains a SQL surface. That split follows the upstream compatibility contract and survives into the deployed configuration.

FieldTypeRequiredDescription
tagstringYesNames this step, ^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$, unique across the history. Compare tags between two deployments to see what moved; keep it printable in a log line without quoting.
new_classesstring[]NoClasses created without ctx.storage.sql (enableSql = false).
new_sqlite_classesstring[]NoClasses created with ctx.storage.sql.

ManifestModule

FieldTypeRequiredDescription
namestringYesThe specifier the worker imports. Alphanumeric and ._-, slash-separated, does not start with .. worker cannot be used because it is the entry module.
typestringYes—
pathstringYesFile path inside the bundle

Role

Roles contain one another — anything a viewer can do, a member can also do, and anything a member can do, an admin can also do.

Type: string

Member

FieldTypeRequiredDescription
userIdstringYes—
providerstringYes—
subjectstringYes—
emailobjectNo—
nameobjectNo—
roleRoleYes—
addedAtstringYes—

OrgDeleted

The answer to deleting an org. The org is already gone from every surface; purgeAfter is when its rows are erased for good. Read that date here rather than computing it, so a later settings change cannot restate it.

FieldTypeRequiredDescription
orgIdstringYes—
slugstringYes—
purgeAfterstringYes—

OrgHolding

One kind of thing the org still holds (the org_not_empty details).

FieldTypeRequiredDescription
kindstringYes—
countintegerYes—
namesstring[]NoOnly the first few, so the error message stays readable.

InviteState

expired is the result of a time comparison, not a stored state — an invite is never marked expired, its expiry time has simply passed.

Type: string

Invite

No token. The plaintext invite token is only ever sent in the invitation email and is never returned by the API.

FieldTypeRequiredDescription
inviteIdstringYes—
emailstringYes—
roleRoleYes—
stateInviteStateYes—
invitedBystringNoThe inviter's name or email.
createdAtstringYes—
expiresAtstringYes—
sentAtstringNoIf empty, the invitation email is still queued to be sent.
sendErrorstringNoThe reason the last send failed. This can remain set even after a success.

InviteView

The invite as seen by whoever holds the invite link. No authentication needed.

FieldTypeRequiredDescription
orgSlugstringYes—
orgNamestringYes—
roleRoleYes—
emailstringYesThe address the invite was sent to. It can differ from the address of the account that accepts it, and the UI should say so.
invitedBystringNo—
stateInviteStateYes—
expiresAtstringYes—

SecretName

Becomes the worker's env.<NAME>. DB and ASSETS are reserved, because they are the uppercase counterparts of the env.db and env.assets bindings, and so is any name beginning with RUNLOT_.

Type: string

SecretMeta

FieldTypeRequiredDescription
nameSecretNameYes—
versionintegerYesIncreases by 1 each time you replace the secret with a PUT.
updatedAtstringYes—

SecretList

FieldTypeRequiredDescription
secretsSecretMeta[]Yes—

LogEvent

A single line of the log stream. Distinguished by type — line is an output line, ping is a 15-second heartbeat, and end is the reason the server ended it.

FieldTypeRequiredDescription
typestringYes—
tsstringNoWhen the line was produced (line events only)
epochintegerNo—
generationintegerNoThe worker process generation. Increments each time the process is replaced.
streamstringNorunlot is a line written by the platform rather than your worker — events such as startup, exit code, and the number of dropped lines.
linestringNoWithout a trailing newline. Past 64 KiB it is truncated and truncated is set.
truncatedbooleanNo—
reasonstringNoReason for end: process_exited, client_gone, node_shutdown

LogHistoryLine

One stored log line. It is not a LogEvent: there is no type, because a stored line is never a heartbeat or an end-of-stream, and there is a seq, because the page cursor needs a tiebreaker for lines that share a timestamp.

FieldTypeRequiredDescription
tsstringYesWhen the line was produced, not when it was stored.
seqintegerYesMonotonic insert order. With ts it forms the page cursor.
epochintegerNo—
generationintegerNoThe worker process generation. Increments each time the process is replaced.
streamstringYesrunlot is a line written by the platform rather than your worker — startup, exit code, dropped-line counts, and the daily-cap marker.
linestringYes—

LogHistoryPage

FieldTypeRequiredDescription
linesLogHistoryLine[]YesNewest first.
cursorstringNoPass back as cursor for the next (older) page. Absent means there is nothing older — an empty lines with a cursor present never happens.
keepDaysintegerYesThis org's log retention, in days (Free 3, Pro 7). Use it to tell an empty page that means "nothing happened" apart from one that means "that is older than we keep".
linesPerDayintegerYesThis org's daily stored-line cap (Free 200000, Pro 2000000).

Usage

FieldTypeRequiredDescription
projectIdstringYes—
hoursintegerYes—
rowsUsageRow[]Yes—
totalsobjectYes—
dbBytesintegerYesThe most recently observed database size, in bytes. 0 if there is no observation.
objBytesintegerYesThe most recently observed object storage size, in bytes. This is a gauge, not a sum — adding it up across time buckets counts the same bytes once per hour.

ExecuteRequest

FieldTypeRequiredDescription
sqlstringYesThe statement, exactly as typed. Nothing is appended to it.
readOnlybooleanNoAbsent means true. Read-only runs inside BEGIN … READ ONLY and rolls back unconditionally; write mode runs outside a transaction so the statement commits on its own.
paramsobject[]NoValues for $1, $2, … They are sent separately from the statement text rather than pasted into it, so you never have to quote or escape a value yourself.

ExecuteResult

FieldTypeRequiredDescription
columnsstring[]YesColumn names in the order the server returned them. Empty for a statement with no result set.
rowsstring[][]YesOne entry per listed row, each an array parallel to columns. Every value is a string or null — JSON numbers are IEEE doubles, so a bigint past 2^53 would arrive rounded. null is SQL NULL; "" is the empty string.
rowCountintegerYesWhat the statement reported — rows produced or rows touched. Not rows.length: when the response is truncated the two differ, and that difference is what truncated is about.
truncatedbooleanYesthe 500-row response cap cut the result short
commandstringYesthe server's command tag (SELECT, UPDATE, CREATE TABLE …)
readOnlybooleanYesthe mode that actually ran, which can differ from the mode you asked for (absent is read-only)
elapsedMsintegerYesThe round trip as the control plane measured it. It includes connecting, so it is not the statement's own execution time.

UsageRow

FieldTypeRequiredDescription
hourstringYesstart of the time window (UTC, on the hour)
requestsintegerYes—
cpuMsintegerYes—
dbBytesintegerYes—
objBytesintegerYesgauge (last observed value)
objOpsintegerYescumulative (sum of deltas)
mailOutintegerYescumulative (sum of deltas)
mailInintegerYescumulative (sum of deltas)
aiCallsintegerYescumulative (sum of deltas)
aiTokensInintegerYescumulative (sum of deltas)
aiTokensOutintegerYescumulative (sum of deltas)
errors5xxintegerYescumulative; a subset of requests
p50MsintegerYesthis hour's median duration, derived from its histogram at read time
p99MsintegerYesthis hour's 99th percentile, same derivation
latSamplesintegerYesHow many request durations this hour's histogram holds. 0 means the hour has no percentile, which is a different fact from "the percentile is 0 ms" — a chart that cannot tell them apart draws a flat floor that never happened.
memPeakBytesobjectYesThe hour's highest memory reading of the project's cgroup, in bytes. Null when nothing measured the hour — a different fact from zero, which a chart must not draw as a floor.
memLimitBytesobjectYesThe memory limit (memory.max) in force that hour, in bytes. Null when not measured; 0 is no limit.
oomKillsintegerYesWorkers stopped that hour for exceeding the memory limit (cumulative).
memHighEventsintegerYesTimes that hour the project was throttled at its soft memory mark (memory.high) before anything was stopped — slow answers rather than failed ones (cumulative).

AIModel

One model in the AI catalog.

FieldTypeRequiredDescription
idstringYesThe string you write in env.ai.run() or env.ai.embed(). Frontier models are <provider>/<model>, value models are @runlot/<model>
kindstringYesWhat the model does. chat is env.ai.run — tokens in, tokens out. embedding is env.ai.embed — text in, a vector out: maxOutputTokens and outPerMTok are 0, and dimensions says how wide the vector is.
dimensionsintegerNoEmbedding models only: the width of the vector the model answers by default.
dimensionOptionsinteger[]NoEmbedding models only: every width env.ai.embed(model, input, { dimensions }) may ask for. Absent when only the default is answered.
taskTypesstring[]NoEmbedding models only: every value env.ai.embed(model, input, { taskType }) may carry. A task type tells the model what the vectors are for, and the same text embedded under two of them is a different vector — so a namespace has to be filled under one choice and queried under the same one. Absent when the model has no such notion (Titan has none). Leaving taskType out sends the model's own default, which is what every vector stored before this option existed was embedded under.
effortLevelsstring[]NoChat models only: every value env.ai.run(model, { reasoning: { effort } }) may carry. Absent when the model has no reasoning-effort control (@runlot/… have none), in which case asking for one is 400 bad_effort rather than a silently ignored field. The vocabularies differ by family — the OpenAI rows include none, the Claude rows do not, and Gemini has only low/medium/high. Leaving reasoning out sends the model's own default.
structuredOutputbooleanNoChat models only, present when true: env.ai.run(model, { responseFormat }) is honoured on this model. False or absent means asking for a response format is 400 format_unsupported rather than prose wearing the caller's schema. Read off each model card, so it is a per-row fact and not a family rule — Claude Haiku 4.5 has it and Claude Sonnet 5 does not, on the same endpoint.
lanestringYes—
displaystringYes—
vendorstringYeswho built the model (Anthropic, Google, Meta, and so on)
providerstringNoThe provider the call is served by. Included for frontier models only — the provider behind a value model can change.
contextTokensintegerYesthe model's own context window
maxInputTokensintegerYesThe input limit runlot allows for this model. It is the same as contextTokens for most models; where it is lower it marks a price boundary — the OpenAI models are 272,000 and Gemini 3.1 Pro is 200,000, the point past which the provider switches the whole request to a higher rate.
maxOutputTokensintegerYes—
inPerMTokintegerYesmicrocents per million input tokens
outPerMTokintegerYes—
cachedInPerMTokintegerNoThe price of cached input. Absent means the model has no cache discount and cached tokens are billed at the full input price
listPricebooleanYesWhen true, this is the provider's list price, passed straight through with no margin added.

AIStatus

FieldTypeRequiredDescription
grantedbooleanYes—
perMinuteintegerYescalls per minute, per project
concurrentintegerYesconcurrent calls, per project
maxOutputTokensintegerNo0 means the model decides
maxInputTokensintegerNo0 means the model decides
creditMicroCentsintegerYesthe org balance (can be negative)
freeDailyMicroCentsintegerNothe daily allowance, for value models only
byosbooleanNoanthropic/* and openai/* calls from the deployed app are served by a Claude or Codex subscription signed in on a Studio desktop of one of your organization's members, and no credit is charged. A desktop only serves apps whose own user turned lending on and enabled that model.
byosCreditFallbackbooleanNoWhat happens when no desktop can take the call. On, the ordinary credit path runs and the call is billed as usual; off, the call is a 503 byos_unavailable and nothing is charged.
calls24hintegerNo—
tokensIn24hintegerNo—
tokensOut24hintegerNo—
spentMicroCents24hintegerNoWhat the org spent on AI in the last 24 hours (positive = amount spent)

AIAutoTopup

FieldTypeRequiredDescription
belowMicroCentsintegerYes—
microCentsintegerYes—

AICredit

FieldTypeRequiredDescription
enabledbooleanYesfalse means AI credit is not available here — the top-up endpoints answer 501
sandboxbooleanYes—
microCentsintegerYesthe balance (can be negative)
heldMicroCentsintegerNoThe part of the balance your running apps have set aside for calls in progress. It is still yours — what a call does not use returns to the balance. Zero when nothing is held
lowMicroCentsintegerNo—
freeDailyMicroCentsintegerNo—
tiersinteger[]YesThe top-up amounts you can choose from. Auto top-up uses the same list
hasPaymentMethodbooleanYesWhen false, auto top-up cannot be turned on — your first top-up is what saves the card
autoTopupAIAutoTopupNo—
autoTopupsTodayintegerYes—
autoTopupPerDayintegerYesthe most automatic top-ups that can run in one day

StorageObject

FieldTypeRequiredDescription
keystringYesThe key as the worker writes it, without the internal project prefix.
sizeintegerYes—
typestringYesthe stored content type
modifiedstringYes—
publicbooleanYesWhether this key sits under one of the project's published prefixes.
urlstringNoThe unsigned public address, present only when public is true and this installation has a public object front. It is never a signed URL.

StorageObjectPage

FieldTypeRequiredDescription
entriesStorageObject[]Yes—
prefixesstring[]YesThe directories one level under the requested prefix, each ending in /. Pass one back as prefix.
cursorstringNoPass it back to get the next page. Absent means the end.
publicPrefixesstring[]YesThe project's published prefixes, carried on every page so a client can explain the public marks without a second call.
publicBasestringNohttps://<objects host>/<org>/<project>. Absent when this installation has no public object front.

StorageObjectSigned

FieldTypeRequiredDescription
keystringYes—
urlstringYesA signed GET. Fetch it directly; the bytes do not pass through this API.
expiresAtstringYesWhen the signature stops working. It travels with the URL so a client does not learn the lifetime from documentation and then cache past it.
sizeintegerYes—
typestringYes—
modifiedstringYes—
publicbooleanYes—

AppUser

One end user of the app (runlot_auth.users, docs/auth.md §6).

FieldTypeRequiredDescription
idstringYes—
emailstringYesLowercased. Empty for an account that has only a social identity.
namestringNo—
providersstring[]Yespassword, github, google, runlot, OIDC ids … sorted, from the linked identities.
createdAtstringYes—
lastSignInstringNoAbsent for somebody who has never signed in.
blockedbooleanYesbanned_at is set. Changing it is not on this surface.
sessionsintegerYesLive sessions only. Expired rows stay until the sweeper runs and counting them would show a signed-out person as signed in.

AppUserPage

FieldTypeRequiredDescription
usersAppUser[]Yes—
cursorstringNoPass it back to get the next page. Absent means the end.

AILedgerRow

FieldTypeRequiredDescription
kindstringYes—
lanestringYesWhich caller spent it. It is present on every row including a top-up, where it is app and means nothing.
modelstringNo—
projectstringNo—
tokensInintegerNo—
tokensOutintegerNo—
microCentsintegerYescall rows are negative
atstringYes—

EmailStatus

The project's email status.

FieldTypeRequiredDescription
grantedbooleanYesWhether email is turned on for this project.
addressstringYesThe project's mail domain. It receives everything at *@<address>.
fromstringYesSender address. The From of mail sent by env.email.send.
perHourintegerYesHourly send limit. Authentication email counts against the same limit.
sentLastHourintegerYesnumber sent in the current time window
receivedLastHourintegerYesnumber received in the current time window
sent24hintegerYesnumber sent in the last 24 hours
received24hintegerYesnumber received in the last 24 hours
mailDomainstringYesThe mail domain suffix for this installation. Email cannot be enabled if it is empty.

EmailDNSRecord

One record you publish in your own DNS. The values are computed by the server, so the dashboard, the CLI, and the documentation always agree on them.

FieldTypeRequiredDescription
typestringYes—
namestringYes—
valuestringYes—
requiredbooleanYestrue for the three DKIM CNAMEs — verification does not pass without them. false for SPF and DMARC: they improve alignment and do not gate anything, and if you already have your own SPF record you should keep it.

EmailDomain

One custom sending domain and its verification state.

FieldTypeRequiredDescription
domainstringYes—
statestringYespending — the identity exists and DKIM is not signing yet. verified — the only state env.email.send({ from }) accepts. failed — the provider gave up, or the records were not visible within 72 hours.
isDefaultbooleanYesAt most one per project.
dkimOkbooleanYesWhether DKIM is signing. This is what state is computed from.
spfOkbooleanYesChecked but never gating — a missing SPF record does not stop delivery.
lastErrorstringNoA readable reason for the current state. Empty once the domain is verified.
createdAtstringYes—
verifiedAtstringNoStamped once; it does not move on re-verification.
lastCheckedAtstringNo—
recordsEmailDNSRecord[]YesServed in every state — when a domain fails, compare what you published against this.
publishedbooleanYesTrue when the records already live in a zone we host, so there is nothing for you to publish.

MailLogEntry

One line of the email log.

FieldTypeRequiredDescription
mailIdstringYes—
projectIdstringYes—
directionstringYes—
atstringYes—
fromstringYes—
tostring[]Yes—
subjectstringYes—
outcomestringYesOutbound: sent → delivered, bounced, complained (feedback from the receiving side), or failed / Inbound: ok, rejected, no_handler, exception
detailstringNorejection sentence or error sentence — a human-readable line
authResultsstringNoAuthentication-Results of the received message
sizeBytesintegerYes—
hasRawbooleanYeswhether the original message text is kept
requestIdstringNoInbound only: the request ID of the delivery's invocation record — the value the worker received as the runlot-request-id header. Absent for outbound mail and on deliveries recorded before request IDs existed.

MailLogPage

FieldTypeRequiredDescription
entriesMailLogEntry[]Yes—
cursorstringNonext page. absent means the end
keepDaysintegerYesnumber of days this org retains

BillingStatus

FieldTypeRequiredDescription
enabledbooleanYesbilling is configured for this deployment
sandboxbooleanYestest billing environment — no real charges
planstringYes—
statusstringNoThe Pro status. Canceled stays Pro until the period ends. Granted is Pro provided by Runlot — no subscription, no charges. Free has none
periodEndstringNoend of the current billing period
hasPortalbooleanYeshas billing history, so the portal can be opened
projectCountintegerYesCurrent project count. If an org is over the Free limit after downgrading, existing projects are kept — only creating new ones is blocked
limitsobjectYes—

PlanLimits

The limits that apply to one plan

FieldTypeRequiredDescription
projectsintegerYes—
storageBytesintegerYes—
dbCapBytesintegerYesThe project Postgres size cap for this plan (Free 500 MiB, Pro 8 GiB). The dashboard's usage meter and chart read this value, and you are notified when a project passes 90% of it.
backupKeepintegerYeshow many database generations are retained
cronsintegerYes—
mailPerHourintegerYes—

StorageStatus

The state of the project's dedicated object storage.

Objects are not part of database generations — runlot pg restore does not roll back files. Read-after-write is guaranteed, but list may lag.

FieldTypeRequiredDescription
grantedbooleanYesWhether object storage is turned on for this project. When it is off, there is no bucket at all, and prefix and quotaBytes are empty.
prefixstringYesThe prefix every object of this project is stored under. It is added for you, so your own keys stay relative to it and no key you send can reach another project's storage. Empty when storage is not configured.
quotaBytesintegerYesThe quota (10 GiB on Free, 100 GiB on Pro). Once you exceed it, only put and presign(PUT) are rejected — get, list, and delete keep working, so you can always delete your way back under the cap. Without storage enabled, it is 0.
usedBytesintegerYesThe last observed byte count. It lags a little behind your writes, so usage can briefly go past the quota in between. 0 if there is no observation yet.

StoragePublicRequest

One key prefix to publish or unpublish.

FieldTypeRequiredDescription
prefixstringYesThe prefix, relative to the project's own storage — assets, assets/, or avatars/img. It is stored with a trailing slash, because matching is a plain string prefix test and assets without the slash would also open assets-private/. / means every key in the project. The empty string is refused, so an accidentally empty argument cannot publish everything by looking like a default.

StoragePublicList

The prefixes this project serves without a signature. All three verbs answer with the full list, so a screen never has to guess what the list became after a change.

FieldTypeRequiredDescription
prefixesobject[]Yes—
publicBasestringNohttps://<objects host>/<org>/<project> — the address every prefix in the list is readable under (a key assets/logo.png is at <publicBase>/assets/logo.png). It is the same value env.storage.publicUrl builds on. Absent when this deployment has no public object host, in which case nothing is served unsigned and publicUrl answers null everywhere.

AccessPolicy

Deployment access policy. Only non-secret state is returned. Passwords and bypass keys are stored as hashes, and their values are never returned by a read.

A project that has never set a policy reads as mode: public with no updatedAt.

FieldTypeRequiredDescription
modestringYespublic means anyone, org means a member or higher of the org that owns the project, password means one shared password for the project, and app means only people signed in to this app through env.auth (docs/auth-access-unify.md §3).
hasPasswordbooleanYesWhether a password is set. The value itself is never returned.
hasBypassbooleanYesWhether a bypass key for automation exists. The key is shown only once, when it is issued.
updatedAtstringNoOmitted if never set

AccessBypass

A bypass key for automation. It is returned only in this response. You cannot view it again, and issuing a new one immediately invalidates the previous key.

FieldTypeRequiredDescription
secretstringYesPassed through as-is in the Runlot-Access-Bypass header

AccessAuthorize

The URL back to the protected deployment. It carries a one-time code (60 seconds, single use, scoped to that project); following it sets a cookie and then redirects to the original URL without the code, so the code never stays in the address bar.

FieldTypeRequiredDescription
redirectstringYes—

AuthProvider

A login provider id. github and google are your own OAuth apps, runlot is Runlot's sign-in (email, Google and GitHub at Runlot), and any other id is an OIDC provider the project registered under that name.

Type: string

AuthSettings

End-user authentication settings for the project.

FieldTypeRequiredDescription
allowSignupbooleanYesWhether new signups are accepted. Turn it off to let only existing users log in — useful for invite-only apps or closing off a beta.
requireVerifiedEmailbooleanYesWhether email verification is required to log in. When enabled, unverified users cannot get a session from env.auth.user(request).
sessionDaysintegerYesThe lifetime of the session cookie, in days. Longer sessions also mean more session rows in your project database, which has a size cap: 10,000 active users on three devices each is roughly 6 MB of session data.
brandAuthBrandYes—
rlsbooleanYesAutomatic row level security. When on, env.db statements from a signed-in user run as that user (runlot_authenticated), from a signed-out visitor as runlot_anon, and from cron and queue as the owner. Tables without row level security are closed to app users. Off by default.
passwordbooleanYesThe email-and-password method. Off makes the password routes answer 404 method_disabled and hides the form; stored password hashes stay.
magicLinkbooleanYesThe email-link method. Off makes sign-in/email answer 404 method_disabled.

AuthBrand

Branding for the hosted login page. For finer-grained branding, build your own page and call the JSON login endpoints instead. If all values are empty strings, the project name and the default design are used.

FieldTypeRequiredDescription
namestringYesThe name shown on the page. Falls back to the project name if empty
logostringYesLogo image URL. Nothing is drawn if empty
colorstringYesAccent color #rrggbb. Falls back to the default accent colour when empty.

AuthProviderMeta

A single registered login provider. Secrets are not included. The client ID is a public value the browser sees anyway; the client secret is stored encrypted and is never returned in any response.

FieldTypeRequiredDescription
providerAuthProviderYes—
kindstringYesbuiltin is your own GitHub or Google OAuth app, oidc a generic OpenID Connect provider, and runlot Runlot's sign-in (no callback URL to register).
clientIdstringYesThe public id given by the provider. Empty for runlot
updatedAtstringYesWhen it was last registered or replaced
issuerstringNoFor github, the base URL of your own GitHub Enterprise Server installation (absent means github.com). For oidc, the issuer URL.
displayNamestringNoOIDC only. The button label on the hosted sign-in page
iconUrlstringNoOIDC only. The button icon on the hosted sign-in page
scopesstringNoOIDC only. Space-separated scopes requested at sign-in

AuthStatus

The project's end-user authentication status.

This API does not serve the end-user table. Those accounts live in the runlot_auth schema of the project's own Postgres, so they travel with project deletion, pg export, generational backup, and restore.

FieldTypeRequiredDescription
grantedbooleanYesWhether end-user authentication is turned on for this project. While it is off, settings holds default values and providers is an empty array.
settingsAuthSettingsYes—
providersAuthProviderMeta[]YesRegistered login providers. Sorted alphabetically by name, not by registration order
hostsstring[]YesEvery hostname this project answers on. Each host needs its own callback URL registered in the login provider's console — https://<host>/__runlot/auth/callback/<provider>. Add the callback URL to the login provider every time you connect a host. On a host you miss, login fails on that host alone, and the reason is visible only in the provider's console. The default hostname is <project>.<org>.<domain>. Register a callback URL for every host in this list — it is exactly the set of hosts this project answers on.

AuthSettingsPatch

A partial update of the settings. Only the fields you send change, so two people editing different switches at the same time do not overwrite each other.

FieldTypeRequiredDescription
settingsobjectYesA subset of AuthSettings. An empty object changes nothing

AuthProviderPut

The whole provider row; three shapes by kind:

  • builtin (default; github and google): {clientId, clientSecret}, and issuer on github only. Both credentials are required every time.
  • oidc (any other id): {kind:"oidc", issuer, clientId, clientSecret, displayName?, iconUrl?, scopes?}. issuer must be https; the CP fetches <issuer>/.well-known/openid-configuration when saving and pins its endpoints.
  • runlot (id runlot only): {kind:"runlot"} and no other field.

{"source":"managed"} is no longer accepted (400 managed_removed); use the runlot provider.

FieldTypeRequiredDescription
kindstringNo—
clientIdstringNoThe public id given by the provider. Required for builtin and oidc
clientSecretstringNoRequired for builtin and oidc. Stored encrypted. It is never returned in any response. If you lose it, issue a new one from the login provider's console and PUT it again.
issuerstringNoOn github: the base URL of your own GitHub Enterprise Server installation, for example https://github.acme.example; empty means github.com. This PUT is the whole row, so send it on every call. On google it is a 400. On oidc: required, the https issuer URL.
displayNamestringNoOIDC only. The button label
iconUrlstringNoOIDC only. An https URL of the button icon
scopesstringNoOIDC only. Space-separated; defaults to openid email profile

Hostname

A single hostname attached to the project. state progresses from pending_dns (verifying ownership) → pending_tls (issuing the certificate) → active (connected), and the failure state is error. Only records with active are included in routing.

FieldTypeRequiredDescription
hostnamestringYesName normalized to punycode and lowercase
kindstringYesdefault is the default name <project>.<org>.<app-domain>. custom is a domain of your own
statestringYes—
rolestringNoapp serves your app. login is the project's login domain: it serves the Runlot sign-in page for this project on your own name, and never the app
lastErrorstringNoThe reason the last check failed. Read it to fix your own DNS
createdAtstringYes—
verifyHostnameVerifyNo—

HostnameVerify

The two records you can add to your own DNS. Getting either one right proves ownership — the CNAME also carries the traffic, so it is the recommended option. The values are computed and returned here; read them rather than hardcoding them, because they can change.

FieldTypeRequiredDescription
cnameHostnameRecordYes—
txtHostnameRecordYes—

HostnameRecord

FieldTypeRequiredDescription
namestringYesrecord name
targetstringNoCNAME target
valuestringNoTXT value

HostnameList

FieldTypeRequiredDescription
hostnamesHostname[]Yes—

Zone

A zone in Runlot's authoritative DNS. serial increases on every change, and once publishedSerial catches up, the nameservers are answering with that content.

FieldTypeRequiredDescription
zoneIdstringYes—
orgIdstringYes—
namestringYesexample.com (lowercase punycode, no trailing dot)
serialintegerYes—
publishedSerialintegerYesThe serial last written to the zone file. If it is smaller than serial, propagation is still in progress (usually 2 seconds)
dnssecstringYes—
dsstring[]YesThe DS record for the parent zone. If Runlot is the registrar we submit it for you; otherwise it is shown here to submit yourself.
delegationstringYesResult of a periodic check: whether the registrar's NS records point to us
delegationCheckedAtstringNo—
nameserversstring[]YesThe nameservers to enter at the registrar
createdAtstringYes—

ZoneDetail

A single zone and all its records.

Type: Zone & object

RRset

A (name, type) value pair. If managedBy is set, the row was created for you and is locked in the editor — system (the zone's NS), hostname:<host> (a connected app), acme (a certificate).

FieldTypeRequiredDescription
namestringYesrelative name. @ is the apex
typestringYes—
ttlintegerYes—
recordsstring[]Yes—
managedBystringNo—
updatedAtstringYes—

ZoneList

FieldTypeRequiredDescription
zonesZone[]Yes—

DomainAvailability

Availability and price of a single name.

FieldTypeRequiredDescription
namestringYes—
availablebooleanYes—
premiumbooleanYesA name the registry prices separately. Registration and renewal prices can differ a lot
priceCentsintegerYesfirst registration, 1 year (in cents, not KRW)
renewalCentsintegerYesrenewal, 1 year

DomainContact

The registrant's contact information. It belongs to you — ICANN's verification email goes to this address, and the domain is suspended if it is not confirmed within 15 days.

FieldTypeRequiredDescription
firstNamestringYes—
lastNamestringYes—
orgstringNo—
emailstringYes—
phonestringYes—
address1stringYes—
address2stringNo—
citystringYes—
statestringNo—
zipstringYes—
countrystringYesISO 3166-1 alpha-2

Domain

A single domain. Expiry date, lock state, and nameservers are copies of the registrar's record and are refreshed every 6 hours.

FieldTypeRequiredDescription
namestringYes—
zoneIdstringNoThe Runlot zone for this domain. Always created on purchase or import
registrarstringYesexternal is a domain held in someone else's account — renewal and locking are not handled here
statestringYesThis is derived from the expiration date: expiring starts 30 days before expiration, expired covers the 30-day grace period after expiration, redemption (redemption fee) covers the following 30 days, and released comes after that. transferred_out is when the registrar reports that it is no longer in our account.
expiresAtstringNo—
autoRenewbooleanYesThis is your decision. Auto-renewal on the registrar side is always on — we renew first and bill afterwards.
lockedbooleanYesTransfer lock
nameserversstring[]Yes—
yearsintegerYes—
priceCentsintegerNothe price paid, in cents
sagaStepstringYesIf it is not done, the purchase is still in progress
sagaErrorstringNoreason it stopped. can be present even if the status is not failed
createdAtstringYes—

DomainEvent

One line of the domain's history (append-only). kind is one of purchase, register_attempt, register, register_reconciled, zone, ds, done, renew, lock, unlock, auto_renew, auth_code, state, transfer_out, import, error, and so on. Auth codes and secrets are never stored here.

FieldTypeRequiredDescription
eventIdintegerYes—
kindstringYes—
detailobjectNo—
atstringYes—

DomainDetail

Type: Domain & object

DomainList

FieldTypeRequiredDescription
domainsDomain[]Yes—
sandboxbooleanYesIf true, the registrar is a sandbox environment — nothing on this list was really registered. It is returned on the listing as well as on search, so a screen that only ever lists never shows names that look bought and are not.

License

The licence payload minus its signature, the state computed from it, and the counts against each ceiling. docs/onprem-delivery.md §6.2 is the payload's definition and §6.3 the state machine.

FieldTypeRequiredDescription
onPrembooleanYesWhether this deployment is licensed at all — true when a licence file is configured. False is SaaS, and then state is none and every surface draws nothing.
statestringYesvalid — in force. expiring — within 30 days of expiresAt; a banner and a daily notification. grace — past expiresAt and inside graceDays; nothing is refused yet. restricted — past grace, or the file is missing, or it does not parse or verify; new nodes, projects, deploys and sign-ups are refused and everything already running keeps running (§6.4). none — not an on-prem deployment.
reasonstringNoWhy the state is what it is, for the states that have a why: signature, expired, kid unknown, missing. Empty when there is nothing to explain. It is a code, not a sentence — the surfaces translate it, and a sentence from the server would arrive in one language on a trilingual screen.
customerstringNoThe licensee's name, as it is printed in the footer on every page.
tierstringNoeval, single or ha (§6.1). eval is watermarked as an evaluation.
expiresAtstringYesWhen the term ends. Null when there is no licence.
graceEndstringYesexpiresAt plus the licence's grace days — the date new deploys stop. Null when there is no licence.
maxNodesintegerYesThe node ceiling. Never 0 — the node is the unit of price (§6.1).
maxProjectsintegerYesThe project ceiling. 0 means unlimited.
maxUsersintegerYesThe user ceiling. 0 means unlimited.
featuresstring[]YesThe licensed feature names, from a closed set the binary knows (git, durable_objects, ai_byok). An unknown name is a parse error at issuance, not a silent grant of nothing.
countsobjectYesWhat the installation is actually using, for nodes 1/1 and projects 42/∞.

DashboardWidget

One panel. Exactly one source is set, and which one depends on type: timeseries, query_value, top_list, heatmap and distribution take a calculations query or a metric; table takes any query or a metric; log_stream an events or invocations query; issue_list issues; slo sloId; monitor_status monitors; markdown text; service_map nothing. A string value "$name" in a filter or a metric param is a template variable.

FieldTypeRequiredDescription
idstringNoDefault w<position>.
typestringYes—
titlestringNo—
positionobjectNo—
displayobjectNo—
queryobjectNoA §7 query: view, filters, search, calculations, groupBy, orderBy, limit, granularity. Its timeframe is ignored; the dashboard's range wins.
metricobjectNo—
issuesobjectNo—
sloIdstringNo—
monitorsobjectNo—
textstringNo—

DashboardVariable

FieldTypeRequiredDescription
namestringYes—
keystringYesThe tag key it narrows: env, version, route, region, or any tag.
defaultstringNo"*" or empty is any value.
labelstringNo—

DashboardInput

FieldTypeRequiredDescription
keystringNoStable name within the project; dashboards as code are upserted by it. May not start with builtin.
titlestringYes—
descriptionstringNo—
layoutobjectNo—
widgetsDashboardWidget[]Yes—
variablesDashboardVariable[]No—

Dashboard

Type: DashboardInput & object

DashboardSummary

FieldTypeRequiredDescription
idstringYes—
keystringYes—
titlestringYes—
descriptionstringNo—
sourcestringYes—
widgetsintegerYes—
publicbooleanYes—
sharedbooleanYes—
updatedAtstringNo—

DashboardList

FieldTypeRequiredDescription
dashboardsDashboardSummary[]Yes—
limitintegerYesCustom dashboards allowed per project; -1 is unlimited.
customintegerYes—
publicDashboardsbooleanYes—
builtinVersionintegerYes—

DashboardShare

FieldTypeRequiredDescription
tokenstringYesShown once. The link is /shared/dashboards/<token>.
publicbooleanYes—
publicDashboardsbooleanYesThe project switch; while off the link answers 404.

DashboardSettings

FieldTypeRequiredDescription
publicDashboardsbooleanYes—

WidgetDataRequest

FieldTypeRequiredDescription
fromstringNo—
tostringNo—
variablesobjectNo—

WidgetData

FieldTypeRequiredDescription
widgetIdstringYes—
typestringYes—
fromstringYes—
tostringYes—
dataobjectYesShaped by the source: {step, series:[{name, group, points:[{t,v}]}]} for metrics, the query API's answer for queries, {issues} for issue lists, {edges} for the service map, {text} for markdown.

SharedDashboard

FieldTypeRequiredDescription
titlestringYes—
descriptionstringNo—
layoutobjectNo—
widgetsDashboardWidget[]Yes—
variablesDashboardVariable[]No—
updatedAtstringNo—
metricKeepDaysintegerYes—

Marker

FieldTypeRequiredDescription
kindstringYes—
atstringYes—
versionintegerNo—
previousVersionintegerNo—
deploymentIdstringNo—
commitstringNo—
peakBytesintegerNo—
limitBytesintegerNo—

MarkerList

FieldTypeRequiredDescription
fromstringYes—
tostringYes—
markersMarker[]Yes—

Insight

FieldTypeRequiredDescription
idstringYes—
kindstringYes—
metricstringYesp95_latency, error_rate, request_rate, memory_peak, db_time, failed_requests, or pattern:<id>.
routestringNo—
startedAtstringYes—
endedAtstringNo—
magnitudenumberYesA ratio, a z-score or a count; hints.scale says which.
deploymentIdstringNo—
versionintegerNo—
hintsobjectYes—
statestringYes—
createdAtstringYes—

InsightList

FieldTypeRequiredDescription
insightsInsight[]Yes—
fullbooleanYesfalse on Free: deploy regressions only.

UptimeAssertion

FieldTypeRequiredDescription
sourcestringYes—
propertystringNoThe header name or the JSON path ($.a.b[0]).
opstringYes—
valuestringNo—

UptimeStep

FieldTypeRequiredDescription
namestringNo—
methodstringNo—
hoststringNoOne of the project's active addresses; default the check URL's host.
pathstringYesStarts with /. May use {{name}} values extracted by earlier steps.
headersobjectNoAuthorization and Cookie are allowed in steps; Host, hop-by-hop and Runlot-* are not.
secretHeadersstring[]NoHeaders whose values are sealed and read back empty; an empty value on replace keeps the stored one.
bodystringNo—
expectStatusMinintegerNo—
expectStatusMaxintegerNo—
assertionsUptimeAssertion[]No—
extractobjectNo—

ObsWindow

FieldTypeRequiredDescription
fromstringYes—
tostringYes—
stepintegerNoBucket width in seconds.
resolutionstringYes—
clampedbooleanNofrom was moved to the plan's retention.
envstringNoproduction, or preview:<branch>.

ObsRed

FieldTypeRequiredDescription
requestsintegerNo—
errorsintegerNo—
errorRatenumberNo—
statusobjectNo—
meanMsnumberNo—
p50numberNo—
p75numberNo—
p90numberNo—
p95numberNo—
p99numberNo—
p999numberNo—

ObsMetricsOverview

Type: ObsWindow & object

ObsCPUPoint

FieldTypeRequiredDescription
tstringNo—
invocationsintegerYes—
meanMsnumberNo—
p50numberNo—
p95numberNo—
p99numberNo—

ObsMetricsMemory

Type: ObsWindow & object

ObsMetricsInfrastructure

Type: ObsWindow & object

ObsCustomMetric

Type: ObsWindow & object

ObsCustomNames

FieldTypeRequiredDescription
namesobject[]No—
usageobjectNo—

ObsLearnedRoute

FieldTypeRequiredDescription
templatestringNo—
sourcestringNo—
learnedBystringNo—
pinnedbooleanNo—
rejectedbooleanNo—
firstSeenstringNo—
lastSeenstringNo—

ObsRouteStateInput

FieldTypeRequiredDescription
templatestringYesSegments: literal, :name, :name?, :name* or *.
statestringYes—

ObsRoutes

FieldTypeRequiredDescription
deploymentobjectNo—
learnedObsLearnedRoute[]No—

ObsAPMRoutes

Type: ObsWindow & object

ObsBreakdown

FieldTypeRequiredDescription
routestringNo—
requestsintegerNo—
wallMsnumberNo—
spanMsnumberNo—
basisstringNo—
overlappingbooleanNo—
partsobject[]No—

ObsServiceMap

Type: ObsWindow & object

ObsCompare

Type: ObsWindow & object

ObsTraceList

FieldTypeRequiredDescription
envstringNo—
fromstringNo—
tostringNo—
nextstringNo—
tracesobject[]No—

ObsTrace

FieldTypeRequiredDescription
traceIdstringNo—
tierstringNo—
invocationobjectNo—
spansobject[]No—
logsobject[]No—

ObsTraceFilterSpec

Every criterion given must match.

FieldTypeRequiredDescription
routestringNo—
handlerstringNo—
statusstringNoerror, a class (5xx) or a code (502).
minDurationMsnumberNo—
attrsobjectNo—

ObsTraceFilterInput

FieldTypeRequiredDescription
namestringYes—
filterObsTraceFilterSpecYes—
enabledbooleanNo—

ObsTraceFilter

FieldTypeRequiredDescription
filterIdstringNo—
namestringNo—
filterObsTraceFilterSpecNo—
enabledbooleanNo—
createdAtstringNo—
updatedAtstringNo—

ObsTraceFilterList

FieldTypeRequiredDescription
filtersObsTraceFilter[]No—
availablebooleanNo—
longRetentionDaysintegerNo—
limitintegerNo—

ObsDBQueries

FieldTypeRequiredDescription
fromstringNo—
tostringNo—
clampedbooleanNo—
retentionHoursintegerNo—
queriesobject[]No—
droppedCallsintegerNo—
waitsobjectNo—
plansobjectNo—

ObsDBQuery

FieldTypeRequiredDescription
fingerprintstringNo—
samplestringNo—
seriesobject[]No—
plansobjectNo—

ObsDBHealth

FieldTypeRequiredDescription
availablebooleanNo—
reasonstringNo—
sizeBytesintegerNo—
growthobjectNo—
tablesobject[]No—
indexesobject[]No—
deferredHnswTombstonesobject[]No—
connectionsintegerNo—
errorsobjectNo—

ObsSampling

FieldTypeRequiredDescription
logsEnabledbooleanNo—
logSampleRatenumberNo—
tracesEnabledbooleanNo—
traceSampleRatenumberNo—

ObsProfilerSettings

FieldTypeRequiredDescription
planstringYes—
allowedbooleanYesWhether the plan has the profiler (Pro).
defaultbooleanYesWhat a project that has not chosen gets.
settingbooleanYesThe stored choice; null is the default.
enabledbooleanYesWhat the next generation launches with.

ObsProfilerSettingsInput

FieldTypeRequiredDescription
enabledbooleanYestrue, false, or null for the default.

ObsProfileSummary

FieldTypeRequiredDescription
profileIdstringYes—
tsstringYesWhen the window started.
deploymentVersionintegerYes—
routestringNo—
durationMsintegerYes—
samplesintegerYesCPU samples (idle excluded).
attributedSamplesintegerNoSamples attributed to a route: taken while every request in flight had that one route. The rest are counted in the window but under no route.
intervalUsintegerYes—
symbolicatedbooleanYesWhether any frame was mapped through a source map.

ObsRUMAggregate

FieldTypeRequiredDescription
viewsintegerYes—
sessionsintegerYesNew browser sessions (page loads) among these views.
lcpP75numberNoms; null without a sample.
inpP75numberNo—
clsP75numberNoUnitless.
ttfbP75numberNo—
lcpSamplesintegerNo—
inpSamplesintegerNo—
clsSamplesintegerNo—
ttfbSamplesintegerNo—
longTasksintegerNo—
longTaskMsPerViewnumberNo—
resourcesintegerNo—
resourceMsAvgnumberNo—
fetchesintegerNo—
fetchMsAvgnumberNo—
durationMsAvgnumberNo—

ObsRUMWindow

FieldTypeRequiredDescription
fromstringYes—
tostringYes—
stepintegerYes—
resolutionstringYes—
clampedbooleanYes—
envstringNo—
notestringNo—

ObsRUMOverview

Type: ObsRUMWindow & object

ObsRUMTiming

FieldTypeRequiredDescription
kindstringYes—
partystringYes—
countintegerYes—
msAvgnumberNo—
bucketsinteger[]YesCounts at or under 100, 300, 1000, 3000 ms, and above.

ObsRUMPages

Type: ObsRUMWindow & object

ObsRUMDevices

Type: ObsRUMWindow & object

ObsRUMViewSummary

FieldTypeRequiredDescription
viewIdstringYes—
tsstringYes—
sessionIdstringYes—
requestIdstringYes—
traceIdstringNo—
serverRequestIdstringNoDocument views only: the request that rendered the page.
releaseintegerYes—
templatestringYes—
devicestringYes—
navstringYes—
softbooleanYesAn SPA route change.
seqintegerYes—
durationMsnumberYes—
lcpMsnumberNo—
inpMsnumberNo—
clsnumberNo—
ttfbMsnumberNo—
longTasksintegerYes—
longTaskMsnumberYes—
resourcesintegerYes—
resourceMsnumberNo—
thirdPartyResourcesintegerNo—
fetchesintegerYes—
fetchMsnumberNo—

ObsRUMViewList

Type: ObsRUMWindow & object

ObsRUMServerRequest

FieldTypeRequiredDescription
requestIdstringYes—
tsstringYes—
methodstringNo—
routestringNo—
statusintegerNo—
wallMsnumberNo—
linkstringYes—

ObsRUMView

Type: ObsRUMViewSummary & object

ObsProfileList

FieldTypeRequiredDescription
fromstringYes—
tostringYes—
profilesObsProfileSummary[]Yes—

ObsFlameNode

FieldTypeRequiredDescription
namestringYes—
selfintegerYesSamples whose leaf is this frame here.
totalintegerYesEvery sample under this node.
childrenObsFlameNode[]No—

ObsFlamegraph

FieldTypeRequiredDescription
fromstringYes—
tostringYes—
versionintegerNo—
routestringNo—
samplesintegerYes—
truncatedbooleanYes—
rootObsFlameNodeYes—

ObsProfileFunction

FieldTypeRequiredDescription
functionstringYes—
selfintegerYes—
totalintegerYes—
selfSharenumberYes—

ObsProfileTop

FieldTypeRequiredDescription
fromstringYes—
tostringYes—
versionintegerNo—
samplesintegerYes—
functionsObsProfileFunction[]Yes—

ObsProfileCompareRow

FieldTypeRequiredDescription
functionstringYes—
aSelfintegerYes—
bSelfintegerYes—
aSharenumberYes—
bSharenumberYes—
deltanumberYesbShare minus aShare.

ObsProfileCompare

FieldTypeRequiredDescription
fromstringYes—
tostringYes—
aintegerYes—
bintegerYes—
aSamplesintegerYes—
bSamplesintegerYes—
functionsObsProfileCompareRow[]Yes—

ObsHeapSnapshot

FieldTypeRequiredDescription
snapshotIdstringYes—
statestringYes—
deploymentVersionintegerNo—
bytesintegerYes—
requestedBystringNo—
createdAtstringYes—
finishedAtstringNo—
expiresAtstringYes—
errorstringNoWhy it failed, in a sentence a customer can act on.

ObsHeapSnapshotList

FieldTypeRequiredDescription
snapshotsObsHeapSnapshot[]Yes—

ObservabilityPermission

Type: string

ObservabilityPermissions

FieldTypeRequiredDescription
rolestringYes—
grantsObservabilityPermission[]Yes—
overriddenbooleanYesA project override replaces the role's default
effectiveObservabilityPermission[]YesThe grants this credential can use

ObservabilityRoleMember

FieldTypeRequiredDescription
userIdstringYes—
emailstringNo—
namestringNo—
rolestringYes—
defaultObservabilityPermission[]Yes—
grantsObservabilityPermission[]Yes—
overriddenbooleanYes—

ObservabilityAuditEntry

FieldTypeRequiredDescription
auditIdintegerYes—
actorstringNoThe person's email, or the operator's for a Runlot read
actorKindstringYes—
actionstringYes—
targetstringNo—
detailobjectYes—
atstringYes—

ObservabilityData

FieldTypeRequiredDescription
regionstringYesWhere this control plane keeps the data; empty when unnamed
storestringYes—
retentionobjectYes—
exportsobject[]Yes—

ObservabilityCapMeter

FieldTypeRequiredDescription
capobjectYesnull: the included amount; -1: no cap
effectiveintegerYes-1 is unlimited
includedintegerYes—
usedintegerYes—
periodstringYes—
unitPriceMicroCentsintegerYes0 on Free
billableMonthintegerYes—
projectedMonthMicroCentsintegerYesThe month at the current rate
ceilingMonthMicroCentsobjectYesThe most this cap allows in a month; null when unlimited

ObservabilityCaps

FieldTypeRequiredDescription
planstringYes—
liftablebooleanYesWhether caps can be raised or removed (Pro)
spendingLimitCentsintegerYesThe organization's monthly overage limit, which bounds every meter
logEventsDailyObservabilityCapMeterYes—
customSeriesObservabilityCapMeterYes—
rumSessionsObservabilityCapMeterYes—

ObservabilityCapsUpdate

FieldTypeRequiredDescription
logEventsDailyobjectNo—
customSeriesobjectNo—
rumSessionsobjectNo—

ObservabilityExportBucket

FieldTypeRequiredDescription
targetstringYess3: a bucket you name; storage: the project's env.storage bucket
endpointstringNohttps address of an S3-compatible service; empty is AWS
bucketstringNo—
prefixstringNo—
regionstringNo—
accessKeyIdstringNo—
secretAccessKeystringNo—
pathStylebooleanNo—

ObservabilityExport

FieldTypeRequiredDescription
exportIdstringYes—
projectIdstringYes—
kindstringYes—
namestringYes—
signalsstring[]Yes—
endpointstringNo—
headerNamesstring[]YesHeader names only; values are sealed and never returned
persistbooleanYes—
enabledbooleanYes—
bucketObservabilityExportBucketNo—
statestringYes—
failuresintegerYes—
lastErrorstringNo—
lastAttemptAtstringNo—
lastSuccessAtstringNo—
nextAttemptAtstringYes—
sentRowsintegerYes—
droppedRowsintegerYespersist:false rows dropped from a full queue
createdAtstringYes—

ObservabilityExportCreate

FieldTypeRequiredDescription
kindstringYes—
namestringNo—
signalsstring[]Yes—
endpointstringNootlp: the collector's base address; /v1/logs, /v1/traces and /v1/metrics are appended
headersobjectNo—
persistbooleanNootlp only; false exports logs and traces without storing them
bucketObservabilityExportBucketNo—

ObservabilityExportUpdate

FieldTypeRequiredDescription
namestringNo—
signalsstring[]No—
endpointstringNo—
headersobjectNo—
persistbooleanNo—
enabledbooleanNo—
bucketObservabilityExportBucketNo—

ObservabilityRehydration

FieldTypeRequiredDescription
jobIdstringYes—
exportIdstringYes—
fromstringYes—
tostringYes—
statestringYes—
objectsintegerYes—
rowsLoadedintegerYes—
bytesReadintegerYes—
truncatedbooleanYesThe job stopped at its row bound
errorstringNo—
expireAtstringNoWhen the loaded rows leave the store again
createdAtstringYes—
updatedAtstringYes—

BugReportCreate

FieldTypeRequiredDescription
messagestringNo—
projectstringNoThe project name; required when requestIds are given
requestIdsstring[]No—
sincestringNoA window such as 30m or 2h (at most 24h; default 1h)
noLogsbooleanNoAttach invocation skeletons and worker exits only
lastCommandobjectNo—
cliobjectNo—
runlotJsonobjectNorunlot.json without secret values

BugReport

FieldTypeRequiredDescription
reportIdstringYes—
orgIdstringYes—
orgSlugstringNo—
projectIdstringNo—
projectNamestringNo—
authorUserIdstringNo—
authorEmailstringNo—
messagestringYes—
statestringYes—
planstringYes—
countsobjectYesrequests, invocations, logs, spans, failing, exits, issues, deployments, lastCommand
noLogsbooleanYes—
snapshotBytesintegerYes—
acknowledgedAtstringNo—
createdAtstringYes—
updatedAtstringYes—
repliesobject[]No—
snapshotobjectNoWhat Runlot copied when the report was filed

このページの目次

ObsCapabilitiesObsFilterObsCalcObsQueryObsColumnObsQueryResultObsKeyObsKeysObsValuesObsPatternObsPatternsObsExitObsInvocationObsEventObsSpanObsRequestViewSavedQueryInputSavedQuerySavedQueryListObsProcessorObsPipelineObsScanRuleObsScannerConfigObsScannerObsScanResultObsLogMetricLogRecordObsLogsConfigReleaseIssueTransitionReleaseIssuePageReleaseHealthReleaseErrorHistoryRelatedErrorEventsReleaseHealthSummaryReleaseHealthReceiptReleaseHealthLossReleaseHealthReportReleaseHealthReportResultErrorFixPreviewApprovalErrorFixPreviewErrorFixPreviewVerificationApprovalErrorFixPreviewVerificationErrorAlertRuleErrorAlertDestinationErrorAlertDestinationInputMonitorThresholdsMonitorBurnWindowMonitorQueryMonitorOptionsMonitorMonitorViewMonitorGroupStateMonitorDetailMonitorListMonitorExportMonitorHistoryMonitorTestResultDowntimeDowntimeListSLOSLOWindowSLOReportSLOListErrorAlertConfigErrorAlertMailPreferenceErrorAlertDeliveryErrorAlertDeliveryListErrorBrowserWitnessSignInBrandAuthBrandingRepoRefsRepoTreeEntryRepoTreeRepoBlobRepoCommitRepoNameRepoVisibilityTokenScopeOAuthTokenResponseOAuthErrorOAuthGrantApiScopeRepoRefUpdateDeployHookBuildSSHKeyAccessTokenAccessTokenCreatedSlugErrorSessionAuthEmailAcceptedTotpStatusTotpEnrollmentTotpRecoveryCodesUserOrgOrgMembershipAppCertStateNotificationProjectProjectDisabledProjectDetailPlacementProjectOverviewOverviewDeploymentOverviewDatabaseOverviewFeaturesDeploymentUploadEntryDeploymentUploadDeploymentShareLinkDeploymentMigrationsPreviewCronRunCronScheduleCronMonitorCronMonitorIncidentCronSummaryErrorErasureResultErrorIssueErrorCommentErrorCommentPageErrorSimilarErrorFingerprintRuleErrorFingerprintRulesErrorIssuePageErrorIssueUpdateErrorActivityErrorTagCountErrorIssueDetailErrorEventSummaryErrorEventPageErrorFrameErrorExceptionErrorBreadcrumbErrorEventErrorInsightsErrorInsightSourceContextErrorInsightSuspectsErrorSuspectCommitErrorInsightOwnersUptimeCheckInputUptimeRunUptimeCheckUptimeCheckListUptimeRunListErrorOwnershipIdentityErrorOwnershipSnapshotErrorOwnershipPinInputErrorOwnershipPinErrorOwnershipPolicyErrorCapturePolicyErrorCapturePolicyViewErrorSettingsUpdateErrorPerformanceThresholdsErrorPerformanceEffectiveErrorSettingsErrorFixProposalErrorFixApplyResultBrowserVitalBucketBrowserTelemetryDayBrowserTelemetrySummaryBrowserFeedbackBrowserFeedbackListErrorReplaySettingsErrorReplayErrorReplayBatchErrorDiagnosisCronOverviewQueueRunQueueConsumerQueueDepthQueueStatusQueueSummaryQueueOverviewQueueMessageVectorNamespaceDurableObjectUsageVectorOverviewDatabaseEndpointDatabaseTokenMetaDatabaseTokenConnectInfoDatabaseConnectDatabaseExportDatabaseGenerationsObjectBackupSetGenerationRowRestoreRequestDeleteRequestOperationStartedOperationManifestManifestAccessRuleManifestTriggersManifestQueuesManifestDurableObjectsManifestDurableObjectMigrationManifestModuleRoleMemberOrgDeletedOrgHoldingInviteStateInviteInviteViewSecretNameSecretMetaSecretListLogEventLogHistoryLineLogHistoryPageUsageExecuteRequestExecuteResultUsageRowAIModelAIStatusAIAutoTopupAICreditStorageObjectStorageObjectPageStorageObjectSignedAppUserAppUserPageAILedgerRowEmailStatusEmailDNSRecordEmailDomainMailLogEntryMailLogPageBillingStatusPlanLimitsStorageStatusStoragePublicRequestStoragePublicListAccessPolicyAccessBypassAccessAuthorizeAuthProviderAuthSettingsAuthBrandAuthProviderMetaAuthStatusAuthSettingsPatchAuthProviderPutHostnameHostnameVerifyHostnameRecordHostnameListZoneZoneDetailRRsetZoneListDomainAvailabilityDomainContactDomainDomainEventDomainDetailDomainListLicenseDashboardWidgetDashboardVariableDashboardInputDashboardDashboardSummaryDashboardListDashboardShareDashboardSettingsWidgetDataRequestWidgetDataSharedDashboardMarkerMarkerListInsightInsightListUptimeAssertionUptimeStepObsWindowObsRedObsMetricsOverviewObsCPUPointObsMetricsMemoryObsMetricsInfrastructureObsCustomMetricObsCustomNamesObsLearnedRouteObsRouteStateInputObsRoutesObsAPMRoutesObsBreakdownObsServiceMapObsCompareObsTraceListObsTraceObsTraceFilterSpecObsTraceFilterInputObsTraceFilterObsTraceFilterListObsDBQueriesObsDBQueryObsDBHealthObsSamplingObsProfilerSettingsObsProfilerSettingsInputObsProfileSummaryObsRUMAggregateObsRUMWindowObsRUMOverviewObsRUMTimingObsRUMPagesObsRUMDevicesObsRUMViewSummaryObsRUMViewListObsRUMServerRequestObsRUMViewObsProfileListObsFlameNodeObsFlamegraphObsProfileFunctionObsProfileTopObsProfileCompareRowObsProfileCompareObsHeapSnapshotObsHeapSnapshotListObservabilityPermissionObservabilityPermissionsObservabilityRoleMemberObservabilityAuditEntryObservabilityDataObservabilityCapMeterObservabilityCapsObservabilityCapsUpdateObservabilityExportBucketObservabilityExportObservabilityExportCreateObservabilityExportUpdateObservabilityRehydrationBugReportCreateBugReport