---
title: "Update Graph Metadata"
method: POST
path: "/v1/graphs/{graph_id}/operations/update-graph-metadata"
tags: ["Graph Operations"]
---

# Update Graph Metadata

`POST /v1/graphs/{graph_id}/operations/update-graph-metadata`

## Request

- Base URL: `https://api.robosystems.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.robosystems.ai/v1/graphs/{graph_id}/operations/update-graph-metadata`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer

Edit the graph's platform-level label: display name, description, and tags. Partial — only supplied (non-null) fields change; pass `""` to clear the description and `[]` to clear the tags. Requires admin on the graph. This is not the entity name that appears on financial statements — change that through the roboledger `update-entity` operation.

**Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict.

## Path parameters

- `graph_id` string, required

## Headers

- `Idempotency-Key` string, nullable

## Request body

- UpdateGraphMetadataOp: Body for the update-graph-metadata operation. Partial update — only supplied (non-null) fields change, so a caller editing just the display name need not resend the description and tags. Because `None` means "leave alone", clearing a field uses its empty value instead: pass `""` to clear the description and `[]` to clear the tags. `graph_name` cannot be cleared; it is the graph's label everywhere it is listed. This is the platform-level label for the graph, independent of the entity name shown on financial statements — change that through `POST /extensions/roboledger/{graph_id}/operations/update-entity`.
  - `graph_name` string, nullable: New display name. Omit to leave unchanged; cannot be cleared.
  - `description` string, nullable: New description. Omit to leave unchanged; pass '' to clear.
  - `tags` string[], nullable: Replaces the full tag list (not a merge). Omit to leave unchanged; pass [] to clear. Tags are trimmed, de-duplicated, and capped at 50 characters each.

## Response `200`

Successful Response

- OperationEnvelopeGraphMetadataResult
  - `operation` string, required: Kebab-case operation name
  - `operationId` string, required: op_-prefixed ULID for audit and SSE correlation
  - `status` 'completed' | 'pending' | 'failed', required: Operation lifecycle state
  - `result` GraphMetadataResult: Result payload for the update-graph-metadata operation.
    - `graph_id` string, required: Graph the metadata belongs to
    - `graph_name` string, required: Display name after the update
    - `description` string: Description after the update ('' when unset)
    - `tags` string[]: Tags after the update (empty when unset)
    - `updated_fields` string[]: Fields this call actually changed. Empty when the submitted values already matched what was stored.
  - `at` string, required: ISO-8601 UTC timestamp
  - `createdBy` string, nullable: User ID that initiated the operation
  - `idempotentReplay` boolean: True when this envelope came from the idempotency cache — the underlying command did not execute again. False on fresh executions.

## Other responses

- `400`: Invalid request
- `401`: Authentication required
- `403`: Access denied
- `404`: Resource not found
- `409`: Idempotency-Key conflict — key reused with different body
- `422`: Validation error
- `429`: Rate limit exceeded
- `500`: Internal server error

---

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