---
title: "QuotaStack Changelog"
description: "API changes, breaking changes, and migration notes for the QuotaStack v1 API."
---

# QuotaStack Changelog

API changes, breaking changes, and migration notes for the QuotaStack v1 API. Newest first. Each release has a full agent-readable page at the same URL + `.md`.

- [2026-08-10 · A duplicate request no longer waits forever](/docs/changelog/2026-08-10-idempotency-bounded-wait.md): When two requests share an Idempotency-Key, the second one waits at most 10 seconds. Past that it returns 409 with a Retry-After header instead of hanging.
- [2026-08-09 · Grant intervals run on their own schedule](/docs/changelog/2026-08-09-grant-intervals-own-schedule.md): daily, weekly and monthly grant intervals now fire on their own clock instead of waiting for the billing cycle, and a new endpoint lists a variant's grants.
- [2026-08-02 · Per-customer overage policy](/docs/changelog/2026-08-02-per-customer-overage-policy.md): A customer's own overage_policy now decides whether that customer can spend past a zero balance, with the tenant setting as the default.
- [2026-07-31 · The audit log now records API and admin actions](/docs/changelog/2026-07-31-audit-log-records-api-and-admin.md): Every change made with an API key or from the dashboard is written to the audit log. Before this, only scheduler jobs were recorded.
- [2026-07-30 · Dodo payment connectors (early access)](/docs/changelog/2026-07-30-payment-connectors.md): Provider-hosted checkout for mapped top-up packages and prepaid subscriptions, with verified payment effects, connector-specific callbacks, restricted-key scopes, and recovery tooling.
- [2026-07-28 · The API reference is now object-first](/docs/changelog/2026-07-28-api-reference-object-first.md): docs/api is a written reference now, not a raw spec render — 16 object pages, 23 error pages, and 21 event pages, each with an agent-facing markdown twin.
- [2026-07-27 · Webhook test-send and dead-letter redelivery](/docs/changelog/2026-07-27-webhook-test-send-redelivery.md): Two new self-serve webhook endpoints — send a test.ping through the real pipeline, and requeue a dead-lettered event yourself instead of contacting support.
- [2026-07-26 · Proactive expiry warnings](/docs/changelog/2026-07-26-proactive-expiry-warnings.md): A third balance alert — credit.expiring_soon fires before a credit block reaches its expires_at, so you can top a customer up or warn them while the credits still exist. Off by default; you set the lead time in hours.
- [2026-07-26 · Balance alert webhooks](/docs/changelog/2026-07-26-balance-alert-webhooks.md): Two new webhook events — credit.low_balance when spendable credits cross a threshold you set, and credit.exhausted when they hit zero. Both track effective balance and fire once per episode rather than on every debit.
- [2026-07-25 · Legacy customer import](/docs/changelog/2026-07-25-legacy-customer-import.md): Legacy customer import (Phase 1) — mid-plan cutover for existing customers, with your period clocks, remaining credit seeds, and a quiet-by-default webhook story.
- [2026-07-25](/docs/changelog/2026-07-25.md): Three breaking changes: subscription lookup by UUID only, a unified subscription.renewed payload, and failed renewals no longer advancing the period. Plus idempotency replay semantics on consume, a new overage reconciliation endpoint, and working prepaid lifecycle webhooks.
- [2026-07-24 · Overage is now recorded, not silently allowed](/docs/changelog/2026-07-24-overage-record-and-report.md): Under the allow and notify policies, a consume over balance used to succeed with nothing recorded. It now floors the balance at zero and records the shortfall as an overage event.
- [2026-04-16 · Legacy URL cleanup, and a stable OpenAPI spec](/docs/changelog/2026-04-16-url-cleanup-and-spec.md): Five unused URL aliases removed, five more renamed for consistency, and the OpenAPI spec reached version 1.0.0 with every operationId locked.
- [2026-04-14 · External customer IDs, plus early API fixes](/docs/changelog/2026-04-14-customer-identifiers.md): external_customer_id becomes a first-class identifier across usage, reservations, topups, subscriptions, and webhooks. Plus a display_name field and reservation status lookups.
