> This page is for API.

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.spreadspace.app/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.spreadspace.app/_mcp/server.

# memo.finalized

POST 

Fires once per finalize: an analyst finished a credit memo, it was locked, and its final PDF was made. The payload carries ids, not the memo. Pull the PDF from `GET /api/loans/{loan_id}/memos/{memo_id}/pdf`.

Reference: https://docs.spreadspace.app/api/api-reference/webhook-events/webhook-memo-finalized

## Request

### Headers

- `SpreadSpace-Signature` (string, required) — Signature over the exact request body: `t=<seconds since the Unix epoch>,v1=<lowercase hex HMAC-SHA256 of "{t}.{body}" keyed with your endpoint's signing secret>`. Verify it before trusting the body, and reject a `t` more than five minutes from your own clock. During a secret rotation both the new and the previous secret verify for 24 hours; each delivery is signed with exactly one.
- `SpreadSpace-Event-Id` (string, required) — The event id, identical to the body's `id`. Stable across retries and replays, and shared by every endpoint one event fans out to. Delivery is at-least-once, so dedupe on it.

### Payload

- `id` (string, required) — Event id: `evt_` plus 24 lowercase hex characters. Also sent as the `SpreadSpace-Event-Id` header. Stable across retries and replays, so dedupe on it.
- `type` (enum, required) — Always this event type on this body.
  - Allowed values: `memo.finalized`
- `created_at` (datetime, required) — Server-side wall-clock time the event was created, RFC 3339. Deliveries are not ordered; reconcile on this.
- `tenant_id` (string, required) — The workspace the event belongs to. Reject a delivery whose tenant does not match the endpoint you registered.
- `livemode` (boolean, required) — `true` for live activity, `false` for test mode (an `ss_test_` key or the sandbox simulator). Branch on it to route test deliveries to a staging handler.
- `data` (MemoFinalizedPayload, required) — The `data` object on a `memo.finalized` delivery, sent once per finalize: an analyst finished a credit memo and its final PDF is made. The memo is locked until someone reopens it, so what this points at is the deal's finished document. A pointer, not a payload: ids, the time and the spread snapshots the memo was approved on, never the memo's prose or its figures. Pull the PDF through `GET /api/loans/{loan_id}/memos/{memo_id}/pdf`.
- `api_version` (string, optional) — The API version the delivery was rendered under, a date stamp: the same value `/v1/openapi.json` reports as `info.version`. The envelope and `data` have that version's shape, and a breaking change ships under a new stamp. A delivery recorded before this field existed carries none, and has the `2026-10-07` shape.

## Types

### MemoFinalizedPayload

The `data` object on a `memo.finalized` delivery, sent once per finalize: an analyst finished a credit memo and its final PDF is made. The memo is locked until someone reopens it, so what this points at is the deal's finished document. A pointer, not a payload: ids, the time and the spread snapshots the memo was approved on, never the memo's prose or its figures. Pull the PDF through `GET /api/loans/{loan_id}/memos/{memo_id}/pdf`.

- `memo_id` (string, required) — The memo that was finalized.
- `loan_id` (string, required) — The loan the memo is saved on.
- `borrower_id` (string, required) — The borrower that owns the loan.
- `render_id` (string, required) — The render that made the final PDF, named by the render id this API serves everywhere else.
- `finalized_at` (datetime, required) — When the memo was finalized. This is the same instant the memo list reports as `finalized_at`, not when the PDF finished printing.
- `spread_snapshots` (list of MemoFinalizedPayloadSpreadSnapshotsItems, required) — The spread figures the memo was approved on: one entry per entity its figure exhibits cite, naming the `final` attribute snapshot, its version and the entity. Empty when the memo has no figure exhibits.

### MemoFinalizedPayloadSpreadSnapshotsItems

One entity's spread figures a finalized credit memo was approved on: the `final` attribute snapshot its figure exhibits cite, that snapshot's version, and the entity the figures belong to. A pointer, not the figures: read them from `GET /api/loans/{loan_id}/attributes/{snapshot_id}`. Carried by `memo.finalized` and `memo.reopened` and by the memo list.

- `snapshot_id` (string, required) — The `final` attribute snapshot the memo's figures for this entity came from.
- `version` (integer, required) — That snapshot's per-loan version number.
- `entity` (MemoFinalizedPayloadSpreadSnapshotsItemsEntity, required) — The entity a memo's pinned spread figures belong to: its scope `key` and display `name`.

### MemoFinalizedPayloadSpreadSnapshotsItemsEntity

The entity a memo's pinned spread figures belong to: its scope `key` and display `name`.

- `key` (string, required) — The scope key, `business:...` or `person:...`, or `whole-loan` for the loan's own figures, such as a Global DSCR.
- `name` (string, optional, nullable) — The entity's display name. Null when none was stated.