---
title: "Save account metadata"
method: POST
path: "/v3/{ledgerName}/accounts/{address}/metadata"
tags: ["Accounts"]
---

# Save account metadata

`POST /v3/{ledgerName}/accounts/{address}/metadata`

## Request

- Base URL: `http://localhost:9000`
- URL: `http://localhost:9000/v3/{ledgerName}/accounts/{address}/metadata`
- Auth: one of:
  - HTTP bearer
  - none

Saves metadata for a specific account in the ledger. Requires `ledger:WriteMetadata` scope (included in the default `ledger:write` mapping).

## Path parameters

- `ledgerName` string, required
- `address` string, required

## Headers

- `Idempotency-Key` string

## Request body

- object: Metadata key-value pairs (supports typed values)

## Response `204`

Account metadata saved successfully

## Other responses

- `400`: Bad request
- `401`: Authentication required (missing or invalid JWT token)
- `403`: Insufficient permissions (missing required scope)
- `404`: Not found
- `405`: Method not allowed
- `409`: Conflict (e.g. idempotency key conflict, ledger deleted)
- `429`: Resource exhausted. Write admission can reject with `WRITES_BLOCKED_DISK_FULL` while disk pressure blocks writes; `SEQUENCE_EXHAUSTED` means an authoritative identifier allocator cannot allocate another identifier and is permanent for that allocator. Inspect `errorCode` before deciding whether to retry. No retry interval is supplied, and retrying cannot resolve sequence exhaustion.
- `500`: Internal server error
- `503`: Service unavailable — the server cannot serve the request right now but an immediate retry can succeed. The `errorCode` field discriminates the cause: `NO_LEADER` (no elected Raft leader), `CACHE_HORIZON_EXCEEDED` (admission snapshot too old, retry against a fresh one), `UNAVAILABLE` (an internal forwarded stream was torn down mid-transfer), or the reason of any domain error of the unavailable kind (e.g. `INDEX_BUILDING`).

## Changes

- **2026-11-03** `f5e817eca038`: 1 info
  - api operation id `saveAccountMetadata` removed and replaced with `v3SaveAccountMetadata`
- **2026-10-08** `3da23d327316`: 3 info
  - added the media type `text/plain` for the response with the status `401`
  - added the media type `text/plain` for the response with the status `403`
  - added the non-success response with the status `429`
- **2026-09-30** `b747efd5cd77`: 1 info
  - endpoint added
- **2026-09-29** `6ff73ac9a6bd`: 1 breaking
  - api path removed without deprecation
- **2026-09-11** `4d2bf2f4e2e5`: 2 warning, 1 info
  - the `additionalProperties/oneOf[subschema #2]/` request property's max was set to `18446744073709551616.00`
  - the `additionalProperties/oneOf[subschema #2]/` request property's min was set to `-9223372036854775808.00`
  - the `additionalProperties/oneOf[subschema #2]/` request property format was generalized from `int64` to no format

[Operation history](https://skmtc.dev/formancehq/apis/ledger-api/changes/v3/:ledgerName/accounts/:address/metadata/post.md)

---

[API](https://skmtc.dev/formancehq/apis/ledger-api.md) - [All operations](https://skmtc.dev/formancehq/apis/ledger-api/llms.txt) - [OpenAPI document](https://skmtc.dev/formancehq/apis/ledger-api/revisions/f5e817eca038?raw)
