subscription_terms_overlap
Raised by POST /admin/tenants/{id}/subscription-terms (action billing.subscription.terms.write) when the requested valid_from - or a back-dated correction - lands inside a validity range that already exists for this tenant. It is the exclusion constraint EXCLUDE USING GIST (tenant_id WITH =, validity WITH &&) answering, surfaced rather than pre-checked: duplicating the constraint in the handler would create the second source of truth the constraint exists to be. Nothing was written and the prior row's valid_to is unchanged. What an operator does: read the tenant's existing terms rows, pick a valid_from at or after the open row's start, and re-send. A genuinely back-dated correction is a decision someone has to make deliberately, which is why it is refused rather than accepted quietly. P1 - built 2026-08-19: subscription_terms shipped with migration 0075_subscription_terms.py and the route surfaces this constraint.
Problem shape
Every non-2xx response is an RFC 9457 application/problem+json body. The type URI below is stable and machine-matchable, so branch on the final path segment (the code) and treat the status as redundant confirmation. See the error-handling guide.
{
"type": "https://docs.vocapable.com/errors/subscription_terms_overlap",
"title": "…",
"status": 409,
"detail": "…",
"instance": "/v1/…"
}