---
title: Changelog
description: Graphon API changes since the beta launch, newest first, with how to update your code.
doc_version: 0.1.0-preview
last_updated: 2026-09-14
---

# Changelog

Graphon API changes since the beta launch, newest first, with how to update your code.

List the same entries with GET https://api.graphon.ai/v1/changelog, the list_changelog MCP tool, or graphon changelog.

## 2026-11-12 · Read and write object bytes with the storage API, and copy returns the new version {#object-bytes-tags-and-retention}

Breaking. Surfaces: storage, mcp, cli.

The storage API reads and writes object bytes: GET …/objects/{keyToken}/content downloads an object, and PUT …/objects/{keyToken}/content uploads one up to the request limit. Delete a prefix deletes every object under a key prefix, as a job. Get and Set object tags read and replace the tags of an object, and Set object retention protects a version. Delete an object takes versionId, and Copy an object takes destinationBucketId and sourceVersionId. graphon objects delete takes several keys, --version-id, or --prefix, and graphon objects tags and graphon objects retain are new. The MCP tools read_object, write_object, and replace_object send one storage API request in place of a presigned S3 request.

### How to update

- storage: Copy an object returns 200 and the new version, not 202 and a job. Read the new version from the response, and stop polling Get a job for a copy.

  Before: `const { job } = await copy(key); await waitForJob(job.id);`
  After: `const copied = await copy(key); use(copied.versionId);`

- storage: Delete an object answers a version under retention with 409 object_locked, not 403 forbidden. A 403 now means the role of the key or an offline bucket.
- storage: A storage fault on Copy an object or Create a bucket returns 500 internal_error, or a code such as object_not_found, no_such_version, or slow_down, where it returned 400 invalid_request. Send the same request again after a 5xx.
- storage: The storage API refuses a keyToken that is not the canonical base64url of the key, such as one with = padding, with 400 invalid_object_key. Encode the key as base64url with no padding.

  Before: `const token = btoa(key); // can end with =`
  After: `const token = Buffer.from(key).toString('base64url');`

- mcp: read_object, write_object, and replace_object return the storage API error codes, such as plan_limit_reached and slow_down, in place of the S3 codes QuotaExceeded and SlowDown.
- cli: Update the CLI. graphon objects copy prints the new version, and its --json output is the version in place of a job.

## 2026-11-12 · The changelog is in the API, the MCP server, and the CLI {#changelog-for-agents}

Surfaces: api, mcp, cli.

GET /v1/changelog, the list_changelog MCP tool, and graphon changelog return this changelog, with the steps to update code for each breaking change. Filter by since, breaking, or surface. Every API and storage API response carries x-graphon-last-breaking-change, the date of the newest breaking change, and the CLI tells you to update it when it is older than that date.

## 2026-11-12 · The Graphon API is in beta {#the-graphon-api-is-in-beta}

Surfaces: api, storage, s3, mcp, cli, webhooks, plugin.

The Graphon API, the storage API, the MCP tools, and the CLI are in beta until version 1.0. Before 1.0, a release can make a small breaking change, such as a renamed field or a new error code. Each breaking change appears in this changelog with how to update your code. A larger breaking change gets a deprecation with a calendar end-of-life date first. This list starts at the beta launch.

## Sitemap

See the full [sitemap](/sitemap.md) for all pages.
