Skip to main content
Updated October 19, 2026

API Changelog

All changes to the Raff public API. Current version: v1.0.0 (beta). 🟒 Added Β· πŸ”΅ Updated Β· 🟑 Deprecated Β· πŸ”΄ Removed Β· 🟣 Fixed

v1.0.0 (Beta)

October 19, 2026

Raff Apps
  • 🟒 Added: Update app service PATCH /api/v1/apps/services/{service_id}: rename, size, start command, port, health check, cron settings, branch and previews. A change to how a live app runs rolls out as a new deployment; a change to a failed app deploys it; an empty description clears it.
  • 🟒 Added: Database links: link a managed database to an app, list, unlink and rotate the password. A link sets DATABASE_URL and the other DATABASE_* variables, including DATABASE_CA_CERT so the app can check the server’s certificate.
  • 🟒 Added: List app templates, List GitHub connections, pull request previews (list, delete, redeploy), List app events and List app instances.
  • πŸ”΅ Updated: Create app service accepts link_database_id (the app waits for the database, links it and then deploys), env_vars (set before the first deploy), github_installation_id and cron_concurrency. deploy_now is refused for an app built from uploaded source.
  • πŸ”΅ Updated: the app object adds waiting_for_database, github_status, previews_enabled, max_previews, primary_domain, cron_concurrency and current_deployment_number. Job runs: exit_code is null while a run is going and for a canceled run.
  • πŸ”΅ Updated: Scale app service: autoscaling_metric is concurrency only (cpu was accepted but not applied), and autoscaling is refused for workers and always-on private apps, which run a fixed number of instances.
Raff Apps: CLI (raff-cli v0.6.4)
  • 🟒 Added: raff apps update, templates, github, links (list, add, delete, rotate), previews (list, redeploy, delete), events and instances.
  • πŸ”΅ Updated: raff apps create accepts --port, --health-check, --env, --database, --github-connection, --cron-timezone, --cron-concurrency, --autoscale, --min-replicas, --max-replicas and --scale-to-zero.
  • πŸ”΅ Updated: raff apps deploy --dir uploads a folder and builds it. Files in .raffignore are skipped; the archive can be at most 100 MB.
  • 🟣 Fixed: raff apps scale --scale-to-zero works on its own and keeps the app’s other settings.
Raff Apps: Terraform (provider v0.4.4)
  • 🟒 Added: raff_app_custom_domain and raff_app_database_link resources.
  • πŸ”΅ Updated: raff_app_service takes env, secret_env, cron_concurrency, github_installation_id and link_database_id.
  • πŸ”΅ Updated: raff_app_service updates settings in place, rolls a changed image_ref out as a deploy, and deploys image and GitHub apps when they are created.
  • 🟣 Fixed: raff_app_service no longer plans a replacement when builder or region is left out.

October 13, 2026

Managed Databases
  • πŸ”΅ Updated: New databases require TLS. PostgreSQL and MySQL databases created from today refuse unencrypted connections on every port, inside the VPC and through the PostgreSQL pooler, like Valkey, ClickHouse and Kafka already did. Databases created earlier are unchanged and still accept unencrypted connections on their own port and inside the VPC; use TLS with them too.

October 11, 2026

Managed Databases
  • πŸ”΅ Updated: Paid databases created through the API are monthly subscriptions, the same as buying them in the dashboard. A card that can be charged automatically is required (402 with a link to add one otherwise); the first month is charged within seconds, from the account balance first, then the card. The free plan is unchanged. Accounts on pay-as-you-go billing are still billed by the hour.
  • πŸ”΅ Updated: Scale database bills monthly databases: a change that costs more is charged for the rest of the current month before it applies, a change that costs less credits the unused part to the balance. A free database moved to a paid plan becomes a monthly subscription and keeps its data, address and password.
  • 🟣 Fixed: the reference now states the current prices: extra storage 0.15/GB/month(wasshownas0.15/GB/month (was shown as 0.12), high availability +140% for MySQL and Kafka (+70% for the others), each read replica at the plan price. Ports, status values (moving), user limits and error codes (409, 412, 501) are documented per endpoint.
  • 🟣 Fixed: a new database with public access reports running only once its public address accepts connections. Before, the first connection could fail with tlsv1 unrecognized name for up to about 20 seconds. Turning public access on now answers once the address works.
Raff MCP server
  • 🟒 Added: Raff MCP server at https://mcp.rafftechnologies.com/mcp. Connect Claude, ChatGPT, Cursor, Claude Code or any MCP app, sign in with Raff, and manage databases in plain words: 23 database tools plus documentation search, read-only mode, and a price confirmation before every paid change.

October 8, 2026

Managed Databases
  • πŸ”΅ Updated: Run a query for Kafka: TOPICS returns each topic’s partitions, copies, retention, messages kept, readers, and lag.
  • πŸ”΅ Updated: Browse for Kafka: [topic] returns the newest messages of every partition and [topic, partition] the newest of one partition, without moving any reader’s position.
  • 🟣 Fixed: Rotate credentials (POST /api/v1/databases/{database_id}/credentials/rotate) works for PostgreSQL. Before, it returned an error.
  • 🟣 Fixed: ClickHouse databases on 1 and 2 vCPU plans start again.

October 6, 2026

Managed Databases
  • 🟒 Added: Extensions at create. POST /api/v1/databases accepts extensions for PostgreSQL (for example ["vector"]). They are on before the database is marked running.
  • πŸ”΅ Updated: engine_config accepts only Valkey maxmemory-policy (noeviction for queues, allkeys-lru for caches). Other keys or values are refused with 400.
  • 🟒 Added: CLI v0.6.3: raff db create --extension vector (PostgreSQL) and --mode queue|cache (Valkey). raff-go v0.8.0 has the Extensions field.
  • 🟒 Added: Terraform provider v0.4.3: raff_database takes extensions (PostgreSQL) and valkey_mode (queue or cache).

October 5, 2026

Managed Databases: API
  • 🟒 Added: Managed Databases in the API reference. Every database endpoint now has its own page.
  • 🟒 Added: Run a query: POST /api/v1/databases/{database_id}/console. Read-only unless read_only: false, up to 5,000 rows, 15 second limit.
  • 🟒 Added: Browse schemas, tables, and keys: POST /api/v1/databases/{database_id}/browse.
  • 🟒 Added: Database users: list, create, rotate a password, get a password, and delete under /api/v1/databases/{database_id}/users.
  • 🟒 Added: Saved queries: GET, PUT /api/v1/databases/{database_id}/saved-queries and DELETE /api/v1/databases/{database_id}/saved-queries/{name}.
  • 🟒 Added: Disconnect from VPC (DELETE /api/v1/databases/{database_id}/vpc), engine parameters (GET /api/v1/databases/{database_id}/parameters), traffic by client (GET /api/v1/databases/{database_id}/metrics/clients), and apps and functions using the database (GET /api/v1/databases/{database_id}/consumers).
  • πŸ”΅ Updated: Restore (POST /api/v1/databases/{database_id}/restore) accepts in_place: true to restore over the same database. Backups list restorable and restore_window_start.
  • πŸ”΅ Updated: Public PostgreSQL is also reachable on the standard ports 6543 (pooled) and 5432 (direct) of {database_id}.public.db.raffusercloud.com.
  • πŸ”΅ Updated: Get connection details (GET /api/v1/databases/{database_id}/connection) returns the public endpoint too: public_host, public_port, and public_connection_uri, filled while public access is on. A database without a VPC has no private endpoint.
  • 🟣 Fixed: Create database without storage_gb or engine_version now uses the plan’s included storage and the newest version, as documented. Before, the database got 0 GB and never started.
  • 🟣 Fixed: Create database mistakes you can fix (a plan of another engine, read replicas on an engine without them, high availability or a backup on the free plan) return 400 with the reason. They returned 500.
  • 🟣 Fixed: Create database with public_access: true now opens public access. Before, the setting was stored but the database had no public endpoint until public access was turned on separately.
  • 🟣 Fixed: Public access and database users mistakes return 400 with the reason: 0.0.0.0/0, an invalid or IPv6 CIDR, more than 20 allowlist entries, a reserved user name (names starting with app_ or fnb_ belong to Raff Apps and Functions), or the user limit. They returned 500.
  • πŸ”΅ Updated: Database objects include is_free and suspended_at, and status can be resizing or restoring. MySQL, ClickHouse, and Kafka are listed as available in the engine catalog.
Managed Databases: CLI (raff-cli v0.6.0)
  • 🟒 Added: raff database (alias raff db). raff db create with no flags creates a free PostgreSQL database with public access and prints a working connection string. Also list, get, delete, rename, resize, resume, connection, rotate-password, query, browse, users, backups, restore, public, vpc, metrics, logs, slow-queries, extensions, parameters, engines, plans.
  • πŸ”΅ Updated (v0.6.1): raff configure shows only the start of a stored API key (raff_737e…).
  • πŸ”΅ Updated (v0.6.2): raff db create and raff db public enable wait until the public address answers, so the printed connection string works on first use.
Managed Databases: Terraform (provider v0.4.0)
  • 🟒 Added: raff_database and raff_database_user resources, and the raff_database, raff_database_plans, raff_database_engines data sources.
  • πŸ”΅ Updated (v0.4.1): public_allowlist and raff_database_user names are checked at terraform plan, before anything is created.
  • πŸ”΅ Updated (v0.4.2): raff_database with public_access finishes only when the public address answers, so public_connection_uri works for the next step of your apply.
Raff Apps: clearer errors and instance limits
  • πŸ”΅ Updated: Errors you can fix return a plain sentence with the right code. Bad values return 400, a name or domain already taken returns 409, and something that does not exist returns 404, each with a message that says what to change. When something breaks on our side the API returns 500 with β€œSomething went wrong on our side. Try again, or contact support.” Error bodies no longer start with rpc error: code = ....
  • πŸ”΅ Updated: Values are checked before they are saved. Create and update refuse an invalid cron schedule, an invalid time zone, a health check path without a leading /, a port outside 1 to 65535 and the ports the platform reserves (8008, 8012, 8013, 8022, 9090, 9091) for web apps and private apps that scale to zero.
  • πŸ”΅ Updated: An app can have at most 6 instances, fixed or autoscaled. The limit is checked only when a value goes up, so an app above it can always scale down. min_replicas above max_replicas returns 400.
  • πŸ”΅ Updated: GET /api/v1/apps/usage: period must be current or previous (anything else returns 400), and service_id also finds apps deleted during the month.
  • 🟣 Fixed: Cron time zones other than UTC were refused on update. Any IANA time zone, such as Europe/Istanbul, is accepted now.

October 4, 2026

Raff Apps: spend cap
  • πŸ”΅ Updated: PATCH /api/v1/apps/spend-settings changes only the fields you send. Before, a field left out was saved as off, $0 or pause, so sending only monthly_cap_usd turned the cap off.
  • πŸ”΅ Updated: The cap must be at least $1. monthly_cap_usd below 1 returns 400. To remove the cap, send {"enabled": false}.
  • 🟒 Added: cap_action: notify_only, now the default for accounts that never set a cap. The owners and billing contacts get an email and a dashboard notice at 75%, 90% and 100% of the cap; with pause, every pay-as-you-go app is also paused at 100%. Apps on a prepaid plan keep running.
  • πŸ”΅ Updated: While the cap has apps paused, resuming, creating, deploying, scaling up and running jobs of pay-as-you-go apps return 412 until the cap is raised or turned off, or a new month starts.

September 26, 2026

Managed Databases: API
  • πŸ”΅ Updated: Public access keeps its ports. Turning public access off and on again with POST /api/v1/databases/{database_id}/public-access now returns the same public_port. The ports are released only when the database is deleted. Before, turning public access off gave the ports up and enabling it again assigned a new pair.
  • 🟣 Fixed: PostgreSQL pooled endpoint connection limit. The public pooled endpoint (public_port) now accepts up to the plan’s pooled limit (200 on Free, up to 1,500 on the largest plan). It was capped at the direct limit (60 on Free), so new pooled connections were refused early.

September 8, 2026

Virtual Machines β€” Console access policy
  • 🟒 Added β€” Per-VM console 2FA requirement β€” PATCH /api/v1/vms/{id}/console-policy with {"console_require_mfa": true} makes the VM’s web console (terminal and VNC) ask for a fresh authenticator code before it opens (one confirmation unlocks protected consoles for 1 hour). Off by default; the VM owner switches it on from VM β†’ Security. API keys cannot open a console on such a VM. GET /api/v1/vms/{id} now returns console_require_mfa. CLI: raff vm console-policy <vm-id> --require-mfa; Terraform: console_require_mfa on raff_vm

September 7, 2026

Pricing β€” VMs, Kubernetes, Managed Databases
  • πŸ”΅ Updated β€” Standard (General Purpose) VM plans repriced β€” List VM Pricing now returns the new monthly rates for every shared-CPU size above 1 vCPU / 1 GiB (2 vCPU / 4 GiB is $17.99, 4 vCPU / 8 GiB $33.99, 8 vCPU / 16 GiB $71.99, 16 vCPU / 32 GiB $139.99). The 1 vCPU / 1 GiB ($4.99) and 2 vCPU / 8 GiB ($27.99) sizes are unchanged. Bundled SSD is 20 GB per GiB of RAM up to 8 GiB, +10 GB per GiB above that, capped at 320 GB
  • πŸ”΅ Updated β€” Premium (CPU-Optimized) VM plans repriced and redefined β€” every vCPU now has half a physical thread reserved (guaranteed), with burst to the full thread. New rates run $15.99 (1 vCPU / 1 GiB) to $288.99 (16 vCPU / 32 GiB); SSD allotments are unchanged
  • πŸ”΅ Updated β€” Windows VM plans repriced β€” $13.99 (1 vCPU / 2 GiB) to $174.99 (16 vCPU / 32 GiB). The Windows Server licence is still a separate $15/mo line
  • πŸ”΅ Updated β€” Kubernetes worker plans β€” GET /api/v1/k8s/node-plans returns the new rates: K8s Standard $17.99, Performance $33.99, High Memory $71.99, Large $119.99; CO Standard $36.99, CO Performance $72.99, CO High Memory $144.99, CO Large $192.99, CO Scale $288.99. Starter ($9.99), Scale ($229.99) and the $30/mo HA control plane are unchanged. PVC storage is now $0.10/GB/month (was $0.08)
  • πŸ”΅ Updated β€” Managed Database plans β€” GET /api/v1/database/plans returns the new Postgres / MySQL ladder from $22.99 (1 vCPU / 2 GiB) to $367.99 (16 vCPU / 32 GiB) and the matching Valkey sizes (2 GB $22.99 to 32 GB $293.99); the $7.99 entry size, Free tier, ClickHouse and Kafka ladders are unchanged. Extra storage is now $0.15/GB-month (was $0.12). HA and read-replica multipliers are unchanged
  • Volumes, backups, snapshots, reserved IPs, Object Storage, Raff Apps and Functions prices are unchanged

August 28, 2026

Managed Databases β€” Plans
  • πŸ”΄ Removed β€” Sub-4 GiB ClickHouse and Kafka plans β€” GET /api/v1/database/plans no longer returns the 1 vCPU / 1 GiB, 1 vCPU / 2 GiB and 2 vCPU / 2 GiB tiers for clickhouse and kafka; both ladders now start at 2 vCPU / 4 GiB (ClickHouse 59.99/mo,Kafka59.99/mo, Kafka 79.99/mo). Neither engine runs reliably below 4 GiB β€” ClickHouse’s own sizing guidance is that under 4 GB is not recommended, and a Kafka broker needs headroom for page cache on top of its heap. No existing instances were affected. Postgres, MySQL and Valkey ladders are unchanged and still start at $7.99

August 27, 2026

Kubernetes β€” API
  • πŸ”΅ Updated β€” Every kubeconfig now expires. GET /api/v1/k8s/clusters/{cluster_id}/kubeconfig returns a kubeconfig valid for 7 days by default (expires_in still selects 10 minutes–30 days); it no longer returns a permanent admin credential, which could never be revoked. Rotate access now invalidates every credential a customer holds
  • 🟒 Added β€” Self-renewing kubeconfig in the CLI β€” raff kubernetes kubeconfig <cluster-id> writes a kubeconfig that carries no credential and fetches a short-lived token for each kubectl command. Nothing long-lived is stored on disk; --static keeps the old file-with-a-token shape for environments that cannot run the CLI
  • 🟒 Added β€” Per-pool node plans β€” every node pool now has its own plan_id: create clusters with mixed pools (node_pools[].plan_id), and POST /clusters/{id}/pools accepts any plan β€” mix sizes and tiers (General Purpose / CPU-Optimized) in one cluster. Per-pool node_count minimum is now 1 (the cluster keeps β‰₯2 workers overall)
  • 🟒 Added β€” CPU-Optimized worker plans β€” GET /api/v1/k8s/node-plans returns a node_class per plan (shared or cpu_optimized); CPU-Optimized nodes reserve far more host CPU per vCPU for compute-heavy workloads. Pick one via worker_plan_id as usual
  • 🟒 Added β€” List cluster volumes β€” GET /api/v1/k8s/clusters/{cluster_id}/volumes returns the cluster’s PVC-provisioned persistent volumes (size, status, attached node, price); also shown on the cluster’s new Storage tab in the dashboard
  • πŸ”΅ Updated β€” Persistent volumes support online expansion: grow a PVC’s requested size and the disk and filesystem expand live (no pod restart); billing moves to the new size. Grow only, 10 GB–10 TB

August 26, 2026

Kubernetes β€” API
  • 🟒 Added β€” Built-in persistent storage β€” every new cluster includes the raff-block default StorageClass: PersistentVolumeClaims are provisioned as Volumes, attached to the pod’s worker automatically, visible in your Volumes list, and billed at $0.08/GB/month (hourly) for exactly the GB claimed
  • πŸ”΄ Removed β€” Create cluster: storage_node_count and storage_node_disk_gb (dedicated Longhorn storage nodes) β€” any non-zero value is now rejected. Existing clusters with storage nodes keep working unchanged
  • πŸ”΅ Updated β€” Delete cluster now also deletes the cluster’s PVC-backed volumes, so no storage keeps billing after teardown
Kubernetes β€” Terraform
  • 🟑 Deprecated β€” raff_k8s_cluster.storage_node_count / storage_node_disk_gb β€” leave unset; persistent storage is built in and billed per GB

August 25, 2026

Kubernetes β€” API
  • 🟒 Added β€” Short-lived kubeconfigs β€” GET /api/v1/k8s/clusters/{id}/kubeconfig?expires_in=<seconds> issues a kubeconfig that expires on its own (10 minutes to 30 days)
  • 🟒 Added β€” Rotate cluster access β€” POST /api/v1/k8s/clusters/{id}/kubeconfig/rotate invalidates every previously issued short-lived kubeconfig immediately
  • πŸ”΅ Updated β€” Create cluster: omitting version_id now converges the cluster to the platform-default version (previously it stayed on the base image version)
Kubernetes β€” CLI
  • 🟒 Added β€” raff kubernetes kubeconfig --ttl <duration> (short-lived kubeconfig) and raff kubernetes kubeconfig rotate
Kubernetes β€” Terraform
  • 🟒 Added β€” upgrade_mode, maintenance_day, maintenance_start on raff_k8s_cluster; changing version_id now performs a rolling in-place upgrade (the apply waits for completion) instead of destroying the cluster
  • πŸ”΅ Updated β€” Create cluster now works on subscription accounts β€” POST /api/v1/k8s/clusters validates the saved payment method, creates the monthly subscription, and charges it automatically (previously 402; same behavior as VM creation). Terraform and CLI creates work on subscription accounts as a result.
  • πŸ”΅ Updated β€” Scale node pool, Add node pool, Upgrade to HA now work on subscription clusters via the API β€” the pro-rated difference is charged to the saved payment method (balance first) and the monthly price is raised (previously 409). Dashboard flows still use checkout.

August 24, 2026

Kubernetes β€” API
  • 🟒 Added β€” Version upgrades β€” GET /api/v1/k8s/clusters/{id}/upgrades (available targets, upgrade state, maintenance settings) and POST /api/v1/k8s/clusters/{id}/upgrade (in-place rolling upgrade: control-plane nodes one at a time, workers drained; free)
  • 🟒 Added β€” Maintenance settings β€” PATCH /api/v1/k8s/clusters/{id}/maintenance: upgrade_mode (manual, auto_patch, auto_minor) and a weekly 4-hour maintenance window (maintenance_day, maintenance_start UTC)
  • πŸ”΅ Updated β€” node plans (ssd_gib) now state the actual 25 GB node root disk; worker plans are priced on vCPU/RAM, persistent storage is the storage-node product
Kubernetes β€” CLI
  • 🟒 Added β€” raff kubernetes upgrade <cluster-id> β€” lists available upgrade targets, or starts a rolling in-place version upgrade with --version (--confirm-single-master on non-HA clusters)
  • 🟒 Added β€” raff kubernetes maintenance <cluster-id> β€” set the upgrade mode (--mode manual|auto_patch|auto_minor) and the weekly 4-hour maintenance window (--day, --start UTC)
  • 🟒 Added β€” raff kubernetes create --version <version-id> β€” create a cluster on a specific offered version; the cluster converges to it automatically after provisioning

August 23, 2026

Kubernetes β€” API
  • 🟒 Added β€” Managed Kubernetes β€” full public API: clusters (GET/POST /api/v1/k8s/clusters, get/rename/delete, GET …/kubeconfig, POST …/ha), node pools (list/add/update/delete/scale), versions and node plans, nodes, events, metrics (including a 24h control-plane health summary), utilization stats, firewall, MetalLB pool and TCP forwards
  • 🟒 Added β€” Idempotency-Key header on POST /api/v1/k8s/clusters β€” retries return the original cluster instead of provisioning twice
  • 🟒 Added β€” pagination (limit, offset) on GET /api/v1/k8s/clusters; derived ready on clusters and actual_node_count on node pools
  • πŸ”΄ Removed β€” legacy POST /api/v1/k8s/clusters/{id}/scale (use the node-pool scale endpoint) and the internal vm_id field on node objects

August 20, 2026

Virtual Machines β€” API
  • πŸ”΅ Updated β€” Attach floating IP now supports multiple public IPv4s β€” POST /api/v1/vms/{id}/ip with ip_id accepts additional reserved IPv4s, up to 4 per VM. Auto-assign (type) is unchanged: available only while the VM has no public IP of that family.
  • πŸ”΅ Updated β€” List VM networks β€” GET /api/v1/vms/{id}/networks returns is_primary, marking the VM’s primary public IPv4 interface.
  • πŸ”΅ Updated β€” Detach floating IP β€” DELETE /api/v1/vms/{id}/ip/{nic_id}: detaching the primary IPv4 while other IPv4s remain promotes the lowest-numbered remaining IPv4 to primary. Clarified billing: reserved IPs keep billing until released; auto-assigned IPs are free and return to the shared pool.

July 28, 2026

Managed Databases β€” API
  • 🟒 Added β€” Free tier for PostgreSQL, MySQL and Valkey β€” plans with is_free_tier: true in GET /api/v1/databases/plans cost $0 (one per account, fixed storage, no HA or replicas, daily backups with 3-day retention). Free databases pause after 7 idle days: status becomes suspended and all data is kept.
  • 🟒 Added β€” Resume a paused database β€” POST /api/v1/databases/{id}/resume wakes a suspended database; it returns through deploying and reaches running in about a minute.
  • πŸ”΅ Updated β€” GET /api/v1/databases/plans returns max_connections (the client connection limit each plan enforces) and memory_mib (RAM for sub-GiB plans, e.g. free Valkey = 512). The database status enum gains suspended.

July 20, 2026

Managed Databases β€” API
  • 🟒 Added β€” MySQL, ClickHouse, and Apache Kafka engines β€” the engine field on POST /api/v1/databases (and everywhere it appears) now accepts mysql, clickhouse, and kafka alongside postgres and valkey. Check live availability and versions with GET /api/v1/databases/engines.
  • πŸ”΅ Updated β€” engine is now a shared DatabaseEngine enum across all database endpoints and schemas; the engine catalog entry schema is named DatabaseEngineInfo. No wire-format change β€” request and response JSON are unchanged.
  • πŸ”΅ Updated β€” GET /api/v1/databases/{id}/connection returns ca_cert (PEM CA bundle) for engines with a private certificate authority β€” currently Kafka. Empty for other engines.

July 12, 2026

Virtual Machines β€” API
  • πŸ”΅ Updated β€” Backup schedules now report run state β€” GET /api/v1/backup-schedules and GET /api/v1/backup-schedules/{id} return enabled, next_run_at, last_run_at, last_run_status, and consecutive_failures. Use these to verify backups are running and alert on repeated failures. Existing fields are unchanged.
  • πŸ”΅ Updated β€” Minimum keep_count is now 2 on POST /api/v1/backup-schedules and PATCH /api/v1/backup-schedules/{id}. A retention of 1 does not work reliably with incremental backups. Existing schedules with keep_count: 1 keep working; the next update must set 2 or more.

July 8, 2026

Raff Apps β€” API
  • 🟒 Added β€” Raff Apps (PaaS) β€” push-to-deploy app services on /api/v1/apps. Create web services, private services, workers, cron jobs, and one-off jobs; manage deployments (POST .../deployments), rollbacks (POST .../rollback), environment variables (.../env), custom domains (.../domains), scaling (.../scale), pause/resume, runtime and build logs, metrics, job runs, usage (GET /api/v1/apps/usage), and spend caps (.../spend-settings).
  • 🟒 Added β€” List Apps tiers β€” GET /api/v1/apps/tiers and public GET /api/v1/public/pricing/apps. Compute sizes and prices; no authentication required.
Raff Apps β€” CLI
  • 🟒 Added β€” raff apps command group: tiers, list, get, create, delete, deploy, rollback, scale, pause, resume, logs, deployments, env (list/set/delete), domains (list/add/delete), and usage.
Raff Apps β€” Terraform
  • 🟒 Added β€” raff_app_service resource, plus raff_app_service, raff_app_services, and raff_app_tiers data sources.

July 6, 2026

Catalog β€” API
  • 🟒 Added β€” List managed database pricing β€” GET /api/v1/public/pricing/database. Plans per engine (postgres, valkey) plus high availability, read replica, and extra storage pricing. Optional engine query filter.
  • 🟒 Added β€” List managed Kubernetes pricing β€” GET /api/v1/public/pricing/kubernetes. Worker node plans plus HA control plane and NVMe storage node pricing.

May 25, 2026

Catalog β€” API
  • 🟒 Added β€” out_of_stock field on VMPricingPlan β€” GET /api/v1/public/pricing/vm. Marks a plan as sold out. Informational only β€” the plan is still listed and can be ordered.
Catalog β€” CLI
  • 🟒 Added β€” STOCK column on raff pricing vm, showing In Stock / Sold Out.
Catalog β€” Terraform
  • 🟒 Added β€” out_of_stock attribute on data.raff_vm_pricing plans.

May 14, 2026

Virtual Machines β€” API
  • πŸ”΅ Updated β€” Backups now run as incremental backup series instead of one full image per call. Only changed blocks are stored after the first baseline, cutting storage and transfer dramatically. Existing backups taken before this change keep working unchanged β€” they restore identically to today.
  • πŸ”΅ Updated β€” storage_size on Backup is now MB (was GB). Incremental restore points are often a few MB; the previous integer-GB column rounded them up to 1 GB and overstated both display and billing. Existing rows have been backfilled (old_value_in_GB * 1024) so customer-visible amounts stay consistent. Clients should display in MB up to 1024, else convert to GB.
  • 🟒 Added β€” increment_id field on Backup β€” GET /api/v1/backups. Position of a restore point within an incremental series; null for legacy standalone backups.
  • 🟒 Added β€” Delete backup series β€” DELETE /api/v1/backups/{id}/chain. Removes every restore point in a series in one call. Use this when Delete backup reports that older points depend on the one being deleted.
  • 🟒 Added β€” Reset backup series β€” POST /api/v1/vms/{id}/backups/reset-chain. Starts a fresh baseline on the next backup; existing restore points stay restorable.

May 10, 2026

Virtual Machines β€” API
  • 🟒 Added β€” mac field on VMNetwork β€” GET /api/v1/vms/{id}/networks. Stable per-NIC MAC address. The backend already returned it; spec now documents it so generated clients expose it.
Volumes β€” API
  • 🟣 Fixed β€” pricing_id now auto-derived from volume_type + region on POST /api/v1/volumes. The public spec never required customers to supply it, but the billing middleware did β€” every CLI/Terraform/curl request was returning 400 until you looked it up out-of-band.
  • 🟣 Fixed β€” filesystem_type is now honored. A wire-mapping bug in vm-service was discarding the value and validating volume_type (e.g. nvme) as if it were a filesystem, rejecting all valid ext4 / xfs / "" combinations with β€œfilesystem_type must be empty (manual), ext4, or xfs”.
  • πŸ”΅ Updated β€” pricing_id required-error now points at raff pricing vm (CLI) and data.raff_vm_pricing (Terraform) alongside the HTTP path.
Billing β€” API
  • 🟣 Fixed β€” Add-payment-method (POST /api/v1/billing/payment-methods) now returns 503 if Airwallex’s payment-source linking step fails, instead of saving an unusable row that looked like a working primary card. Customers no longer end up with a dashboard-confirmed card that fails the first time the API tries to charge it.
  • 🟣 Fixed β€” β€œPayment method not configured for automatic billing” error correctly identifies the affected row (filters by provider_type and non-empty source ID) instead of firing on any active payment row.
  • πŸ”΅ Updated β€” Error messages link to app.rafftechnologies.com regardless of environment (was hardcoded to a local-dev hostname).
Virtual Machines β€” CLI
  • 🟒 Added β€” raff vm create --no-vpc β€” create a VM with only a public IP, no VPC at all. (raff-cli v0.3.5)
  • 🟒 Added β€” MAC column on raff vm networks. (raff-cli v0.3.6)
  • πŸ”΅ Updated β€” raff vm create --help long help spells out all four networking modes (existing VPC / new VPC / no VPC / auto VPC). (raff-cli v0.3.4)
  • πŸ”΅ Updated β€” raff vm get shows base disk and attached volumes as separate rows (was a single collapsed β€œStorage” row). (raff-cli v0.3.4)
  • πŸ”΅ Updated β€” vm networks public-pool NICs show (public pool) instead of an empty NETWORK cell. (raff-cli v0.3.4)
Volumes β€” CLI
  • πŸ”΅ Updated β€” raff volume create --type help enumerates nvme (was a misleading β€œe.g. standard”). (raff-cli v0.3.3)
  • πŸ”΅ Updated β€” raff pricing volume table view shows the ID column. (raff-cli v0.3.3)
Networking β€” CLI
  • πŸ”΅ Updated β€” Security-group attachment count now labeled β€œAttached VMs” everywhere (was inconsistent β€” VMS in list, Attached NICs in get). (raff-cli v0.3.4)
  • πŸ”΄ Removed β€” Unexplained SIZE column from raff sg get rules subtable. (raff-cli v0.3.4)
Virtual Machines β€” Terraform
  • 🟒 Added β€” data "raff_vm_networks" β€” list NICs for a VM with MAC, IP, gateway, and security-group binding. (terraform-provider-raff v0.1.8)
  • 🟒 Added β€” skip_vpc argument on raff_vm. (terraform-provider-raff v0.1.7)
  • πŸ”΅ Updated β€” raff_vm schema descriptions for vpc_id / vpc_name / vpc_cidr / delete_vpc / volume_action rewritten to spell out the actual contract instead of one-liners. (terraform-provider-raff v0.1.6)
  • πŸ”΅ Updated β€” volume_type = "nvme" in README and Registry index examples (was an invalid "standard"). (terraform-provider-raff v0.1.4)
Networking β€” Terraform
  • 🟒 Added β€” data "raff_vpc_cidr_suggestions" β€” fetch a non-overlapping CIDR for declarative VPC sizing. (terraform-provider-raff v0.1.9)
  • 🟒 Added β€” data "raff_security_group_templates" β€” look up template IDs to pass to raff_security_group.template_id. (terraform-provider-raff v0.1.9)
Team & Access β€” Terraform
  • 🟒 Added β€” data "raff_permissions" β€” read-only catalog of permission identifiers; supports scope filter (account / project). (terraform-provider-raff v0.1.9)
Reference β€” site
  • πŸ”΅ Updated β€” Terraform Registry sidebar collapsed from 7 noisy buckets to a single Virtual Machines subcategory. (terraform-provider-raff v0.1.5)
Catalog β€” CLI / Terraform
  • 🟣 Fixed β€” category filter on raff template list (CLI v0.3.7) and data.raff_templates (terraform-provider-raff v0.1.10) β€” flag help, schema description, and README/Registry examples all incorrectly claimed values like linux / windows. The real enum is os (Linux/Windows OS templates) or marketplace (pre-baked apps); OS family (linux / windows / alpine / etc.) lives on the os_type response field with no API-level filter today.
Virtual Machines β€” Terraform
  • 🟣 Fixed β€” raff_vm Create now waits for the VM to reach active before returning. Previously terraform apply returned as soon as the API accepted the request, so public_ipv4 / private_ipv4 were empty until the customer ran terraform refresh. Default timeout 15 minutes; override with timeouts { create = "20m" }. (terraform-provider-raff v0.1.11)
  • πŸ”΅ Updated β€” volume_action description on raff_vm rewritten to clarify it only governs volumes not under Terraform management (attached out-of-band via dashboard / CLI). Volumes managed by raff_volume in the same config are destroyed by Terraform independently. (terraform-provider-raff v0.1.11)

Compute β€” CLI
  • 🟒 Added β€” raff volume list|get|create|delete|resize|attach|detach β€” documentation page for block storage volume commands.
  • 🟒 Added β€” raff snapshot list|get|create|rename|restore|delete β€” documentation page for VM and volume snapshots.
  • 🟒 Added β€” raff backup list|get|create|restore|delete and raff backup schedule list|get|create|update|delete β€” documentation page for backups and recurring schedules.
Networking β€” Terraform
  • 🟒 Added β€” raff_vpc documentation page β€” VPC resource, CIDR immutability, gateway computed attrs.
  • 🟒 Added β€” raff_ip documentation page β€” floating IP reservation.
  • 🟒 Added β€” raff_security_group documentation page β€” firewall rulesets with nested rule blocks and template seeding.
Compute β€” Terraform
  • 🟒 Added β€” raff_volume, raff_snapshot, raff_backup, raff_backup_schedule documentation pages β€” covering immutability rules, retention semantics, and the β€œdon’t manage schedule-created backups” guidance.
Team & Access β€” CLI
  • 🟒 Added β€” raff ssh-key, raff api-key, raff member, raff role, raff permission, raff invitation documentation pages β€” full coverage of IAM commands.
  • 🟒 Added β€” raff project member subcommands documented under raff project β€” list, get, add, update, remove.
Team & Access β€” Terraform
  • 🟒 Added β€” raff_ssh_key, raff_api_key, raff_role, raff_member, raff_project_member documentation pages β€” including the secret returned-once warning on raff_api_key and the composite ID format on raff_project_member.
Catalog β€” CLI / Terraform
  • 🟒 Added β€” raff region, raff template, raff pricing (CLI) and a consolidated data-sources page (Terraform) covering raff_regions, raff_templates, and the *_pricing family.
Reference β€” site
  • πŸ”΅ Updated β€” Reference tab CLI and Terraform groups in docs.json reorganized to expose every command group and resource in the sidebar.
  • πŸ”΅ Updated β€” reference/cli/introduction.mdx and reference/terraform/introduction.mdx refreshed with the full surface β€” coverage table now lists every resource group instead of the original 5–7.

May 8, 2026

Volumes β€” API
  • 🟒 Added β€” Volume CRUD + attach/detach β€” GET/POST /api/v1/volumes, GET/DELETE /api/v1/volumes/{id}, POST /api/v1/volumes/{id}/attach, POST /api/v1/volumes/{id}/detach. Create is async (202 Accepted).
  • πŸ”΄ Removed β€” vm_id, vm_internal_id, image_id, attached_volume_id fields from volume responses (OpenNebula internal identifiers). Use id and product_vm instead.
Snapshots β€” API
  • 🟒 Added β€” Snapshot CRUD + restore + rename β€” GET/POST /api/v1/snapshots, GET/DELETE /api/v1/snapshots/{id}, POST /api/v1/snapshots/{id}/restore, PATCH /api/v1/snapshots/{id}/rename. Supports VM and volume sources (resource_type: vm|volume). Snapshot.status = active indicates the source has been reverted to this snapshot.
Backups β€” API
  • 🟒 Added β€” Backup CRUD + restore β€” GET/POST /api/v1/backups, GET/DELETE /api/v1/backups/{id}, POST /api/v1/backups/{id}/restore. Create and restore are async (202 Accepted).
  • 🟒 Added β€” Backup schedules β€” GET/POST /api/v1/backup-schedules, GET/PATCH/DELETE /api/v1/backup-schedules/{id}. Daily or weekly with configurable retention.
  • πŸ”΄ Removed β€” schedule_id, backup_id, vm_id from backup/schedule responses (OpenNebula internal identifiers). Use id and product_vm.
SSH Keys β€” API
  • 🟒 Added β€” SSH key CRUD β€” GET/POST /api/v1/ssh-keys, GET/PUT/DELETE /api/v1/ssh-keys/{id}. Account-scoped (no X-Project-ID required).
Team & Access β€” API
  • 🟒 Added β€” Account Members β€” GET/POST /api/v1/members, GET/PATCH/DELETE /api/v1/members/{id}. Email invite, direct add, or attach an API key as member.
  • 🟒 Added β€” Project Members β€” GET/POST /api/v1/projects/{id}/members, GET/PATCH/DELETE /api/v1/projects/{id}/members/{member_id}.
  • 🟒 Added β€” Roles β€” GET/POST /api/v1/roles, GET/PATCH/DELETE /api/v1/roles/{id}. Custom account- or project-scoped roles. System roles are read-only.
  • 🟒 Added β€” Permissions catalog β€” GET /api/v1/permissions. Lists every permission string usable in role definitions. Requires a valid API key (no specific permission needed).
  • 🟒 Added β€” API Keys β€” GET/POST /api/v1/api-keys, GET/PATCH/DELETE /api/v1/api-keys/{id}, POST /api/v1/api-keys/{id}/regenerate. Full secret only returned once at create or regenerate.
  • 🟒 Added β€” Invitations β€” POST /api/v1/invitations (account), POST /api/v1/projects/{id}/invitations (project), DELETE /api/v1/invitations/{id} (cancel). Public spec deliberately omits Invitation.token since it’s the acceptance secret.
Cross-cutting β€” wire/spec alignment
  • πŸ”΄ Removed β€” vm_id from VM responses, vnet_id / vxlan_vni / router_vm_id from VPC responses, ip_group_id / subnet_id / vm_id from floating IP responses, network_id / mac / bridge / vxlan_vni from VM network interface responses, and the legacy top-level project_id / project_name from API key responses. All are OpenNebula internal identifiers that the public spec already hid; the gateway response now matches the spec.

April 30, 2026

Virtual Machines β€” API
  • 🟒 Added β€” skip_public_ip and skip_vpc flags on Create VM β€” POST /api/v1/vms. Build VPC-only VMs (no public IP) or public-IP-only VMs (no VPC). Cannot be combined.
Networking β€” API
  • 🟒 Added β€” Floating IP reserve/release β€” POST /api/v1/ips/reserve, DELETE /api/v1/ips/{id}/reserve, plus GET /api/v1/ips, GET /api/v1/ips/{id}, POST /api/v1/ips/{id}/change. Reserve runs through the same balance/billing checks as VM create (402 / 403). Release refunds remaining time pro-rata for subscription IPs.
  • 🟒 Added β€” VPC CRUD β€” POST/GET/PUT/DELETE /api/v1/vpcs[/{id}] and GET /api/v1/vpcs/cidr-suggestions. Customers can now create and manage VPCs directly via the public API instead of only through VM creation.
  • 🟒 Added β€” ?type=public|vpc|ipv6 query filter on List VM network interfaces β€” GET /api/v1/vms/{id}/networks?type=public.
  • πŸ”΅ Updated β€” VMNetwork.type enum now includes ipv6.
  • πŸ”΄ Removed β€” mac field from public VMNetwork schema (still in raw response for the dashboard, hidden from public API consumers).
Networking β€” CLI
  • 🟒 Added β€” raff ip list|get|reserve|release|change
  • 🟒 Added β€” raff vpc list|get|create|update|delete|cidr-suggestions
  • 🟒 Added β€” raff vm networks <vm-id> --type public|vpc|ipv6 filter
Virtual Machines β€” API
  • 🟒 Added β€” Update VM note β€” PATCH /api/v1/vms/{id}/notes/{type} β€” replaces existing note content; returns 404 if no note exists yet (use PUT to create).
  • 🟒 Added β€” Append to VM note β€” POST /api/v1/vms/{id}/notes/{type}/append β€” concatenates new content onto the existing note (newline-separated), creates the note if missing.
  • 🟒 Added β€” type query filter on Get VM notes β€” GET /api/v1/vms/{id}/notes?type=personal|account to fetch only one scope.
Virtual Machines β€” CLI
  • 🟒 Added β€” raff vm notes update <vm-id> --type X --content Y (errors if note missing)
  • 🟒 Added β€” raff vm notes append <vm-id> --type X --content Y
  • 🟒 Added β€” raff vm notes get <vm-id> --type personal|account filter
  • 🟒 Added β€” raff vm tags list <vm-id> to discover tag IDs

April 29, 2026

Virtual Machines β€” API
  • 🟒 Added β€” Hard reboot VM for unresponsive instances β€” POST /api/v1/vms/{id}/reboot-hard
  • 🟒 Added β€” Save VM disk as custom image β€” POST /api/v1/vms/{id}/save-image
  • 🟒 Added β€” List VM network interfaces β€” GET /api/v1/vms/{id}/networks
  • 🟒 Added β€” Attach/detach VM to/from VPC β€” POST/DELETE /api/v1/vms/{id}/vpc[/{nic_id}]
  • 🟒 Added β€” Attach/detach floating IP β€” POST/DELETE /api/v1/vms/{id}/ip[/{nic_id}]
  • 🟒 Added β€” Attach/detach security group to VM NIC β€” POST/DELETE /api/v1/vms/{id}/firewall[/{sg_id}/{nic_id}]
  • 🟒 Added β€” Add/update/remove VM tags β€” POST/PATCH/DELETE /api/v1/vms/{id}/tags[/{tagId}]
  • 🟒 Added β€” Get/upsert VM notes (personal + account scopes) β€” GET /api/v1/vms/{id}/notes, PUT /api/v1/vms/{id}/notes/{type}
  • πŸ”΄ Removed β€” vm_id field from VM responses (was an OpenNebula internal identifier β€” use id instead)
  • πŸ”΅ Updated β€” BillingError.reason enum trimmed to currently-returned values: banned, failed, no_billing_customer. Insufficient balance now consistently returns 402 with a plain Error body.
Virtual Machines β€” CLI
  • 🟒 Added β€” raff vm hard-reboot, raff vm save-image, raff vm networks, raff vm vpc attach|detach, raff vm ip attach|detach, raff vm sg attach|detach, raff vm tags add|update|remove, raff vm notes get|set
Virtual Machines β€” Terraform
  • πŸ”΄ Removed β€” vm_id computed attribute from raff_vm (was the OpenNebula int ID; use id instead)

March 25, 2026

General
  • 🟒 Added β€” Changelog tracking started

March 15, 2026

Virtual Machines β€” API
  • 🟒 Added β€” Resize VM disk storage without recreating β€” POST /api/v1/vms/{id}/disk/resize
  • 🟒 Added β€” Bulk delete VMs in a single request β€” DELETE /api/v1/vms/bulk
  • πŸ”΅ Updated β€” Create VM now accepts enable_ipv6 parameter for IPv6 support β€” POST /api/v1/vms

March 10, 2026

Virtual Machines β€” API
  • 🟒 Added β€” Reinstall OS on a running VM, keep your IP β€” POST /api/v1/vms/{id}/reinstall
  • 🟒 Added β€” Factory reset VM to original state β€” POST /api/v1/vms/{id}/factory-reset
  • 🟒 Added β€” Reset root password via API β€” POST /api/v1/vms/{id}/reset-password
  • 🟒 Added β€” Rename VMs after creation β€” POST /api/v1/vms/{id}/rename

March 5, 2026

Volumes β€” API
  • 🟒 Added β€” Resize block storage volumes attached to VMs β€” PATCH /api/v1/volumes/{id}

March 3, 2026

Projects β€” API
  • 🟒 Added β€” Organize resources into projects β€” full CRUD via API
    • GET /api/v1/projects Β· POST /api/v1/projects Β· GET /api/v1/projects/{id} Β· PUT /api/v1/projects/{id} Β· DELETE /api/v1/projects/{id}

March 1, 2026

Virtual Machines β€” API
  • 🟒 Added β€” Full VM lifecycle β€” create, list, get details, delete
    • GET /api/v1/vms Β· POST /api/v1/vms Β· GET /api/v1/vms/{id} Β· DELETE /api/v1/vms/{id}
  • 🟒 Added β€” VM power control β€” start, stop, reboot
    • POST /api/v1/vms/{id}/start Β· POST /api/v1/vms/{id}/stop Β· POST /api/v1/vms/{id}/reboot
  • 🟒 Added β€” Scale resources β€” resize CPU and RAM on demand β€” POST /api/v1/vms/{id}/resize
Catalog β€” API
  • 🟒 Added β€” Browse available resources β€” regions, OS templates, pricing (no auth required)
    • GET /api/v1/public/regions Β· GET /api/v1/public/templates
    • GET /api/v1/public/pricing/vm Β· /volume Β· /snapshot Β· /backup Β· /ip
Last modified on October 19, 2026