---
title: "ai.memory-export@1 · OpenVibe.Services"
canonical: "https://openvibe.services/docs/contracts/ai.memory-export"
updated: null
---

# ai.memory-export@1 · OpenVibe.Services

HTML: [ai.memory-export@1 · OpenVibe.Services](https://openvibe.services/docs/contracts/ai.memory-export)

# AiMemoryExportV1 `ai.memory-export@1`

Generated at 2026-11-13 06:25:48 UTC from [`openvibe-contracts v0.419.0`](https://github.com/OpenVibers/OpenVibe.Contracts/tree/v0.419.0) and [`openvibe-sdk v0.161.0`](https://github.com/OpenVibers/OpenVibe.SDK/tree/v0.161.0).

- Version: 1.0.0
- Owner: ai
- Visibility: first-party
- Status: active
- Compatibility: backward
- Schema: [`https://openvibe.network/contracts/ai/memory-export.v1.json`](/docs/contracts/ai.memory-export.json)

ai.memory-export@1 (OpenVibe.AI; Memory M5): the one portable memory file. GET /api/v1/memory/export answers it, decrypted for the person's own export; POST /api/v1/memory/import accepts the same document (only \`format\`, \`version\` and \`items\` are read on import). Every item carries the text after redaction, its kind and scope, its source and the confidence the store had; ids, owners and merge/conflict links are deliberately absent, so a file can be moved to another account and imported without carrying anyone's identity. A profile is derived from the items and is rebuilt, never imported.

## Fields

| Field | Type | Required | Description | Constraints |
| --- | --- | --- | --- | --- |
| `format` | const | yes |  | - `= "openvibe.memory-export@1"` |
| `version` | const | yes |  | - `= 1` |
| `exported_at` | string | yes | When the file was written. Informational only; import never trusts it as an item time. | - `format date-time` |
| `items` | array of object | yes |  | - `maxItems 10000`<br>- `items: no other fields` |
| `items[].text` | string | yes | The item text after the store's own redaction. A secret that survived an older export is redacted again on import. | - `minLength 1`<br>- `maxLength 8000` |
| `items[].kind` | enum | yes |  | - `one of "preference", "fact", "project_rule", "procedure", "decision", "lesson"` |
| `items[].scope` | string | yes | \`user\` for the person, or \`project:<slug>\` for a project. Never an absolute path. | - `pattern ^(user\|project:[a-z0-9][a-z0-9._-]{0,63})$` |
| `items[].source` | string | yes | The adapter id (claude-code, cursor, …), the service (actor, vibe, know, person) or the memory-service adapter (mem0, letta, zep) the item came from. | - `minLength 1`<br>- `maxLength 100` |
| `items[].source_ref` | object \| null |  | The path relative to the scanned root and the heading, when the item came from a file. |  |
| `items[].status` | enum |  | Defaults to active on import. A conflict item is imported as suggested: its pair did not come with it. | - `one of "active", "suggested", "archived", "conflict"` |
| `items[].confidence` | number |  |  | - `minimum 0`<br>- `maximum 1` |
| `items[].machine` | string \| null |  | The Link machine id the item came from, when it came from one. | - `maxLength 100` |
| `items[].seen_at` | string |  |  | - `format date-time` |
| `items[].created_at` | string |  |  | - `format date-time` |

## Examples

From the contract's own test fixtures: valid ones validate, rejected ones must fail.

 Valid: export

~~~~
{
  "format": "openvibe.memory-export@1",
  "version": 1,
  "exported_at": "2026-11-07T09:30:00.000Z",
  "items": [
    {
      "text": "Prefers short, direct answers.",
      "kind": "preference",
      "scope": "user",
      "source": "claude-code",
      "source_ref": {
        "path": ".claude/CLAUDE.md",
        "heading": "Style"
      },
      "status": "active",
      "confidence": 1,
      "machine": "node_01J8Z3Q4R5S6T7V8W9X0Y1Z2J",
      "seen_at": "2026-11-01T10:00:00.000Z",
      "created_at": "2026-10-30T10:00:00.000Z"
    },
    {
      "text": "Run the narrowest test before the suite.",
      "kind": "project_rule",
      "scope": "project:openvibe-ai",
      "source": "mem0",
      "confidence": 0.8
    }
  ]
}
~~~~

Valid: minimal

~~~~
{
  "format": "openvibe.memory-export@1",
  "version": 1,
  "exported_at": "2026-11-07T09:30:00.000Z",
  "items": []
}
~~~~

Rejected: absolute-scope

~~~~
{
  "format": "openvibe.memory-export@1",
  "version": 1,
  "exported_at": "2026-11-07T09:30:00.000Z",
  "items": [
    {
      "text": "A note with an absolute path for a scope.",
      "kind": "fact",
      "scope": "project:/home/ada/secret",
      "source": "claude-code"
    }
  ]
}
~~~~

Rejected: wrong-format

~~~~
{
  "format": "openvibe.memory@2",
  "version": 2,
  "exported_at": "2026-11-07T09:30:00.000Z",
  "items": []
}
~~~~

## Validate

~~~~
const contracts = require('openvibe-contracts');
contracts.validate('ai.memory-export@1', value);   // { valid, errors: [{ path, message }] }
~~~~
