Status incidents in the API
GET /v2/status/incidents returns the incident notes shown on withruntime.com/status, status.md and status.json, newest start first, as {"data": [...]}. It requires no API key. Each incident has id, title, start, end (null while ongoing), saw and fixed; a published note is never rewritten, and later updates are appended to fixed. The status page now reads these notes live, so a new or updated incident appears on the page's next load.
Per-address limit on creating organizations
POST /v2/orgs, which creates a signed-in person's own organization, is limited to 10 an hour per client IP address (an IPv6 address counts by its /64). A request over the limit returns 429 rate_limited with a Retry-After header giving the seconds until one more request is accepted; the refused request does not count toward the limit.
Closing an account deletes its resources
POST /v1/account:close now succeeds for every account; for some accounts it previously returned 500 internal_error. From the response on, requests with the account's API keys to sandboxes, volumes and the other resource APIs return 401, and the account's resources are deleted within seconds. Data-bearing resources, such as volumes and snapshots, are held for 7 days before they are purged. The response's released field is false while that deletion is in progress.
Cloud Run: Google's client libraries' $alt parameter is accepted
The Google Cloud Run Admin API at /compat/google-cloud-run now accepts the $alt query parameter (json, or json;enum-encoding=int), which Google's Node.js client (@google-cloud/run) sends with every REST request. Previously each such request returned 400. Responses are JSON, with enum values as names, which the clients read. Any other $alt value returns 400.
Seven more launch checks through competitors' APIs on /status.json
launch_checks on GET https://withruntime.com/status.json now also returns dev_environments_codespaces (Octokit, GitHub's SDK, against the Codespaces API), containers_fly (Fly's Machines API), containers_cloud_run (Google's Cloud Run client for Node.js), firewall_security_groups (the AWS SDK for JavaScript's EC2 client), uptime_checks_betterstack (Better Stack's monitors API), uptime_checks_checkly (Checkly's checks API) and sites_vercel (Vercel's SDK, promoting a release). Each entry creates, uses, reads back and deletes one resource through Runtime's compatible API, with the same fields as the other launch checks. For a product billed per resource (dev_environments_codespaces), the entry also confirms that the resource's usage was billed, and its steps_ms includes usage. The other six products are not billed per resource, so their entries have no usage step.
GET /v1/me returns the key's reach
The response now includes reach: agent when the key acts only on what its own agent made, compartment when it acts on what every key of its compartment made, or account when it acts on everything in the account. The value reflects the key as the API treats it at the time of the request, so an account-wide key whose maker is no longer an owner or admin returns agent. Every SDK returns it from me().
A build whose identical image is larger than its maxImageMiB fails with the size to set
When your account already had an identical image larger than a new build's build.maxImageMiB (8192 by default), the build failed with "The image could not be saved because of a fault on our side". It now fails immediately with An identical image of this organization is N MiB, larger than this build's build.maxImageMiB of M. Set build.maxImageMiB to at least N. Set build.maxImageMiB to at least that size and the build copies the identical image immediately.
Per-address limits on sign-in and API key creation
Requests that sign in or create an account are limited per client IP address (an IPv6 address counts by its /64): 30 an hour for POST /v2/sign-in/email, and 30 an hour for POST /v2/sign-in/email/verify and Google or SSO sign-in returns together. Creating or rotating API keys (POST /v2/keys, POST /v1/keys) is limited to 60 an hour. Each API server applies these limits on its own. A request over a limit returns 429 rate_limited with a Retry-After header giving the seconds until one more request is accepted; nothing is created, and the refused request does not count toward the limit. Accounts that already exist count the same as new ones.
Clearer error when a sandbox from an image cannot start
When the server could not prepare a sandbox's image, POST /v1/sandboxes returned 503 busy with "The cell could not confirm this in time; it may or may not have been applied." It now returns 503 busy with "This sandbox could not be started on its server, so nothing was made." Retry the create with the same Idempotency-Key.
Render environment variable endpoints for Apps
/compat/render/v1 now serves Render's environment variable endpoints over an App's spec.env: list (GET /services/{serviceId}/env-vars, paginated by cursor and limit), replace all (PUT /services/{serviceId}/env-vars), get, set and delete one (GET, PUT and DELETE /services/{serviceId}/env-vars/{envVarKey}). Setting or deleting one variable leaves the others unchanged. Getting or deleting a variable the service doesn't have returns 404. generateValue returns 400.
Sandboxes, Apps and Functions can call App and Function addresses
A request from a sandbox, an App or a Function to an App's or a Function's address (https://<name>.runtimehost.com) used to return 403 with "Destination resolves to a forbidden address". These addresses are now reachable over HTTPS on port 443, as they are from the internet. Private address ranges, Runtime's own servers, and other ports on these names are still refused.
Render list pagination reads only the requested page
On /compat/render/v1, GET /services and GET /services/{serviceId}/deploys now start reading from the position the cursor names and stop as soon as the page is full. Previously each request read the whole list first. Without a name or status filter, a request reads only as many items as the page returns. If the item a cursor names is deleted before the next request, that request returns the next page instead of 400. The page may repeat items, but no item is skipped. Cursors are opaque strings, and cursors returned before this change continue to work. A cursor value that the list did not return returns 400.
Paused sandboxes started from a custom image survive the loss of their host
A paused sandbox started from your own image is no longer stopped when its host is lost, as long as its saved copy is complete and another host holds the image. Its next wake restores it from that copy on a host that holds the image. While no such host can take it, a wake returns 503 no_capacity with the detail that it starts from its saved copy as soon as one has room. If the image is deleted or rebuilt, or no other host holds it, the sandbox is stopped as before, and its parked charge ends when its host was lost.
A wake whose host does not answer fails within about a minute
A paused sandbox whose host did not answer its wake used to stay in resuming for as long as the host stayed silent, and every request on it waited. The wake now gives up after two unanswered attempts (about a minute): requests on the sandbox return 500 operation_failed immediately, its memory and files are kept, and nothing is charged. A minute later the host is asked again; once it answers, the sandbox is paused and the next request wakes it.
App versions and Render deploys
GET /v2/apps/{id}/versions lists an app's versions, newest first and paginated by limit and cursor. GET /v2/app-versions/{id} returns one version. A version is numbered by the app generation that created it, so the response to the PATCH that creates a version identifies it. A new spec.rollout value creates a new version with the same settings. Render's deploy endpoints are now served under /compat/render/v1: list deploys (filterable by status), get a deploy, create a deploy (imageUrl, or a redeploy of the current image), and roll back to an earlier deploy (POST /services/{serviceId}/rollback). A deploy's ID is its version number. Creating a deploy, or changing the image with PATCH /services/{serviceId}, clears an earlier rollback, so the new version goes live. commitId and buildId return 400, and cancelling a deploy is not supported.