---
title: "Verify a memory's Merkle inclusion"
method: POST
path: "/v1/verify-memory"
tags: ["Verification"]
---

# Verify a memory's Merkle inclusion

`POST /v1/verify-memory`

## Request

- Base URL: `https://api.chainmemory.ai`
- URL: `https://api.chainmemory.ai/v1/verify-memory`
- Auth: none required

Public, no API key. POST only: a GET returns 404. Mode `stored` looks the proof up by itself from `memory_id` or `event_hash` and reports whether the batch was anchored. Modes `light` and `full` (default when `mode` is omitted) verify a proof the client supplies and require `event_hash`, `proof` and `batch_root`. Only hashes and metadata are returned, never content.

IMPORTANT: a Merkle proof exists only for memories that went through a compression batch (POST /v1/compress). Every other memory returns `valid: false` with `anchor_status: "uncompressed"` — that does NOT mean it is unanchored. Each memory is written to the memory contract individually when it syncs; check that with /v1/my/memory/{seq}/proof and /v1/memory/{id}/verify.

## Request body

- object
  - `mode` 'stored' | 'light' | 'full': Default: full
  - `memory_id` integer: mode=stored: internal memory id
  - `event_hash` string: mode=stored alternative to memory_id; required for light/full
  - `proof` unknown
  - `batch_root` string: light/full
  - `memory` unknown
  - `content_hash` string: full
  - `daily_root` string: full

## Response `200`

Result. For mode=stored the shape is shown; light/full return the verifier's own result object.

## Other responses

- `400`: Missing fields for the chosen mode
- `404`: mode=stored: memory not found

---

[API](https://skmtc.dev/chainmemory/apis/chainmemory-api.md) · [All operations](https://skmtc.dev/chainmemory/apis/chainmemory-api/llms.txt) · [OpenAPI document](https://skmtc.dev/chainmemory/apis/chainmemory-api/revisions/5331e0f0b6af?raw)
