# Document format

> The Fabric.js JSON format this engine saves: schema version, canvas size, objects with stable ids, the asset list and metadata, with a JSON Schema.

Source: https://fabricjs-document-engine.jscrate.dev/docs/guides/document-format
Last updated: 2026-09-28

A saved document wraps the Fabric.js JSON format you already know with the details an editor needs. It is plain JSON, so you can store it in any database, send it over any API and read it in any language.

## The shape

```ts
interface FabricDocument {
  schemaVersion: number;
  id: string;
  createdAt: string;
  updatedAt: string;
  revision?: number;
  fabricVersion?: string;
  canvas: { width: number; height: number; background?: unknown };
  objects: SerializedFabricObject[];
  assets?: {
    images: Array<{ url: string; objectIds: string[] }>;
    fonts: Array<{
      family: string;
      weight: string;
      style: string;
      objectIds: string[];
    }>;
  };
  metadata: Record<string, unknown>;
}
```

## The fields

| Name | Type | Default | Description |
| --- | --- | --- | --- |
| `schemaVersion` (required) | `number` | — | The format version. `1` for every 1.x release. |
| `id` (required) | `string` | — | The document id. |
| `createdAt` (required) | `string` | — | When the document was created, as an ISO date. |
| `updatedAt` (required) | `string` | — | When it last changed, as an ISO date. |
| `revision` | `number` | — | The saved revision, used to detect conflicts. |
| `fabricVersion` | `string` | — | The Fabric.js version that wrote it. |
| `canvas` (required) | `DocumentCanvas` | — | `{ width, height, background? }`. |
| `objects` (required) | `SerializedFabricObject[]` | — | The serialized objects, in stacking order, each with an id. |
| `assets` | `AssetManifest` | — | The images and fonts the document needs, with the ids of the objects that use them. |
| `metadata` (required) | `Record<string, unknown>` | — | Your own project data, such as title, owner and tags. |

## Objects and ids

`objects` holds the objects in stacking order, in the same Fabric.js JSON format that `toObject()` produces, plus an `id` on every object. Children of groups have object ids too. Ids are generated when an object first appears, and never change after that.

## Metadata

Keep data about the whole document in `metadata`, such as a title, an owner or tags:

```ts
engine.updateMetadata({ title: "Ground floor", tags: ["draft"] });
engine.getDocumentInfo().metadata;
```

`updateMetadata` merges the changes and marks the document as unsaved.

## The JSON Schema

The format is described by a JSON Schema that ships with the package. Use it to validate documents in other services, or to generate types in another language:

```ts
import schema from "fabricjs-document-engine/schema/document-v1.json";
```

In TypeScript or JavaScript, `validateDocument(value)` returns the list of problems with the path of each one.

## Stability

Schema version 1 is frozen for every 1.x release. Readers must ignore fields they do not know, because minor releases may add optional ones. The Fabric.js JSON format inside `objects` follows your Fabric.js version, and the [migration](https://fabricjs-document-engine.jscrate.dev/docs/guides/migration) step handles differences between Fabric.js 5, 6 and 7.
