---
title: "Delete Information Block"
method: POST
path: "/extensions/roboledger/{graph_id}/operations/delete-information-block"
tags: ["RoboLedger: Information Blocks"]
---

# Delete Information Block

`POST /extensions/roboledger/{graph_id}/operations/delete-information-block`

## 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/extensions/roboledger/{graph_id}/operations/delete-information-block`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer

Generic Information Block deletion entry. Returns a thin confirmation (deleted / structure_id / block_type / name). Block types whose Structures are library-seeded cannot be deleted per tenant and surface 501.

**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

- union: Delete an Information Block. The body is a discriminated union on `block_type` mirroring `CreateInformationBlockRequest`. The schedule arm carries a fully typed delete payload; statement and metric arms return HTTP 501.
  - DeleteScheduleArm: Delete-information-block body for `block_type="schedule"`. Carries a typed schedule delete payload — just the `structure_id`.
    - `block_type` 'schedule', required: Discriminator value selecting this arm.
    - `payload` DeleteScheduleRequest, required: Delete a schedule and everything under it. Permanent and irreversible. Removes the Structure, its Facts and Associations, its draft entries and its unposted obligations. Refused once any of the schedule's entries has posted, because the schedule is their support. To end a schedule early and keep its history, use `terminate-schedule` (no entry) or `create-event-block(event_type='asset_disposed')`, whose handler voids the remaining obligations and posts the disposal entry in one step.
      - `structure_id` string, required
  - DeleteRollforwardArm: Delete-information-block body for `block_type="rollforward"`. Cascades through any synthetic facts produced by this block's filter evaluations. The underlying ledger LineItems are not touched.
    - `block_type` 'rollforward', required: Discriminator value selecting this arm.
    - `payload` DeleteRollforwardRequest, required: Delete a rollforward block. Cascades through any synthetic facts produced by this block's filter evaluations. The underlying ledger LineItems are not touched — only the rollforward IB's projection of them.
      - `structure_id` string, required: Structure ID of the rollforward block.
  - DeleteForecastArm: Delete-information-block body for `block_type="forecast"`. Removes the scenario's entire parallel universe — the lever FactSet and every computed scenario FactSet. Actuals are never touched.
    - `block_type` 'forecast', required: Discriminator value selecting this arm.
    - `payload` DeleteForecastRequest, required: Delete a forecast block. Removes the scenario's entire parallel universe: the lever FactSet AND every computed scenario FactSet (the forward statement/metric months keyed by this scenario). Actuals are never touched.
      - `structure_id` string, required: Structure ID of the forecast block.
  - DeleteLegacyArm: Delete-information-block body for block types that don't yet have a typed delete path at the API boundary. Statement-family blocks cannot be deleted per tenant (the underlying Report should be archived via the report APIs instead). Metric deletion is not yet implemented. Calls return HTTP 501.
    - `block_type` 'balance_sheet' | 'income_statement' | 'cash_flow_statement' | 'equity_statement' | 'comprehensive_income' | 'regulatory_disclosure' | 'metric' | 'reconciliation', required: Statement-family or metric block type. Deletion returns 501 — statements are library-seeded (archive the underlying Report instead); metric deletion is pending.
    - `payload` object: Untyped payload — typed-arm validation is skipped because the dispatch handler raises 501 before the payload is consumed.

## Response `200`

Successful Response

- OperationEnvelopeDeleteInformationBlockResponse
  - `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` DeleteInformationBlockResponse: Response for `delete-information-block`. The envelope is gone once the block is deleted, so the response is a thin confirmation instead — structure_id + block_type + name for caller bookkeeping.
    - `deleted` true
    - `structure_id` string, required
    - `block_type` string, required
    - `name` string, required
  - `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)
