Ledgerdoc Ledger API Console
Docs/Changelog
(01) — Changelog · v2.4

Every change, dated and tagged.

Fourteen releases from v2.0.0 to v2.4.1, in reverse-chronological order. Breaking changes ship only on a minor or major boundary and are announced ninety days ahead; everything else lands continuously.

Releases 14 Current v2.4.1 Breaking since v2.0 4 Latest ship 14 Jul 2026
(02) — Support windows

Three versions are live at once.

A major version is supported for 24 months after its successor ships. The version selector in the header switches these docs; the version in your request path decides what you actually get.

v2.4 Current — receives everything

All new work lands here. Point /v2 at it and you are on v2.4 automatically.

Recommended
v2.3 Supported — security & correctness

Bug fixes and security patches only. No new fields. Every v2.4 addition is additive, so upgrading is a no-op for most callers.

Supported
v1.9 Maintenance — until 31 Mar 2027

Critical security fixes only. The v1 balance model stores balances rather than deriving them; migration is not mechanical.

Maintenance
(03) — Release history

Fourteen releases.

Filter by minor version or by the kind of change. Without JavaScript every entry is shown; the filter is a convenience, not the content.

Version
Change Showing 14 of 14 releases
14 Jul 2026v2.4.1

Replay headers on idempotent writes

AddedFixed
  • Replayed responses now carry a Replayed: true header for log correlation.
  • Fixed a case where a replay returned a fresh posted_at instead of the original.
  • Idempotency keys are no longer counted against the write rate limit on replay.

Concepts: Idempotent postings

28 Jun 2026v2.4.0

Point-in-time balance derivation

Added
  • GET /v2/accounts/:id/balance accepts an at timestamp to derive historical balances.
  • Reconciliation windows can now be opened against a statement date range.
  • Added Elixir SDK at v2.1.4.

Reference: Reconciliation windows

11 Jun 2026v2.3.6

Statement references stored verbatim

AddedFixed
  • statement_ref on a reconciliation window is now returned unmodified on read — leading zeros were previously stripped.
  • Window labels accept up to 200 characters, up from 120.
09 Jun 2026v2.3.4

Sandbox parity with live regions

Fixed
  • Sandbox now enforces the same 255-character cap on idempotency keys as live.
  • Corrected a rounding difference in multi-currency line validation.
18 May 2026v2.3.2

Webhook signature verification hardened

Fixed
  • Signature comparison is now constant-time in all four regions.
  • Fixed a delivery attempt that could be retried twice inside the same minute of the backoff schedule.
21 May 2026v2.3.0

Webhook subscriptions, scoped per event

AddedBreaking
  • Webhooks are now subscribed per event type rather than per workspace.
  • Breaking: the legacy /v2/hooks alias is removed. Migrate to /v2/webhooks.
  • Delivery retries follow an exponential schedule over six hours.

Migration guide: From /v2/hooks to /v2/webhooks · announced 20 Feb 2026

30 Apr 2026v2.2.7

Rust SDK and faster list pagination

AddedFixed
  • Published the Rust SDK at v2.2.7 with async support.
  • Cursor pagination on GET /v2/entries is roughly 4× faster on large accounts.
16 Apr 2026v2.2.3

Account re-tagging without touching history

Added
  • PATCH /v2/accounts/:id accepts a tags array for reporting groups.
  • Renaming an account leaves every posting's recorded account name intact, so old entries still read correctly.

Guide: Renaming and re-tagging safely

02 Apr 2026v2.2.0

Immutable entries enforced at the storage layer

Breaking
  • Breaking: PATCH /v2/entries/:id is removed. Post a reversing entry instead.
  • Every posting now carries an append-only audit hash chained to the previous entry.

Migration guide: Off PATCH /v2/entries/:id · announced 03 Jan 2026

12 Mar 2026v2.1.5

Multi-currency lines balance per currency

AddedFixed
  • An entry containing more than one currency must now balance independently within each — a stricter rule that caught real errors in beta workspaces.
  • Fixed a case where an FX line was accepted with a zero rate.

Guide: Multi-currency lines in one entry

24 Feb 2026v2.1.0

Sydney region, and per-region latency reporting

Added
  • ap-sydney-1 is available at workspace creation, joining Dublin, Frankfurt and Virginia.
  • The status page reports p50 write latency per region rather than a single global figure.

Status: Where it runs, and how fast

05 Feb 2026v2.0.4

Idempotency window fixed at 24 hours

Fixed
  • Key retention was documented as 24 hours but expired at the top of the hour in two regions. It is now exactly 24 hours from first use everywhere.
  • A key reused with a changed payload returns 409 idempotency_conflict consistently, rather than 400 in some regions.
21 Jan 2026v2.0.1

Rate-limit headers on every response

Fixed
  • X-RateLimit-Remaining is now present on error responses too, not only on 2xx.
  • A 429 always carries Retry-After in whole seconds.

Reference: Rate limits

08 Jan 2026v2.0.0

Balances are derived, not stored

AddedBreaking
  • Breaking: the v1 stored-balance field is gone. GET /v2/accounts/:id/balance derives from the entries every time.
  • Breaking: entry lines use amount in minor units with a sign, replacing v1's separate debit and credit fields.
  • Every write endpoint accepts an Idempotency-Key header.
  • The whole surface is eight endpoints, down from nineteen in v1.9.

Guide: Balances are derived, not stored · v1.9 in maintenance until 31 Mar 2027

(04) — Policy

What we promise about changes.

The rules above are not aspirational — they are the reason the version selector only has three entries.

Versioning

The version lives in the path

Every route is under /v2. There is no header-based negotiation and no implicit "latest", so a client pinned today behaves identically in a year.

Minor releases are additive: a new field may appear, an existing field never changes meaning and is never removed.

Deprecation

Ninety days, in writing

A breaking change is announced on this page and emailed to workspace owners at least ninety days before it ships. The four breaking entries above each name their announcement date.

During the notice period the old behaviour keeps working and responses carry a Deprecation header pointing at the migration guide.

Support

24 months after the successor

A major version is supported for 24 months after the next one ships. v1.9 entered maintenance when v2.0.0 shipped in January 2026 and receives critical security fixes until 31 March 2027.

Maintenance means security only. No new fields, no new endpoints, no performance work.

Corrections

The log itself is append-only

If an entry above turns out to be wrong, a correction is added rather than the text quietly edited — the same discipline the ledger applies to postings.

Entries are anchored, so changelog.html#v2-2-0 keeps resolving to the same release forever.

(05) — Stay ahead of it

Get the breaking ones by email.

One message per release that changes behaviour, and nothing else. Additive releases stay on this page where they belong.

Enter an email address in the form name@example.com.

Subscribed — in this demo, at least.
This form is client-side only; nothing was sent anywhere. Wire it to your own list before you ship the template.

Demo form — no data leaves the page.

(06) — Next

Upgrading? Read the migration guides.

Each of the four breaking releases has a written migration with working code. None of them take more than an afternoon.

Perfect for: platform teams replacing a spreadsheet ledger with something auditable