Appearance
Recording retention by business type
The minimum time the platform keeps the audio of a recorded call depends on the business types your tenant declares. This guide covers the two routes that read and write that declaration. Field names, enums and status codes are copied from the vendored OpenAPI document (core v0.103.0).
This is not legal advice or a coverage promise
The floors below come from the US federal rules the platform's design cites. State law is not covered. A tenant declares its own business type and answers for it. The jurisdiction-by-jurisdiction legal matrix is not served yet; see Not covered yet.
Availability
| Capability | Availability |
|---|---|
GET /v1/business-types, PUT /v1/business-types | Published in core v0.103.0 (core#2012, core#2065) |
How the floor is computed
text
months = legal_floor_months + safety_margin_monthslegal_floor_monthsis the maximum audio floor over the declared types. A tenant that declarescobranzaandtelemarketinggets the higher of the two.safety_margin_monthsis the platform margin added on top: 3 today. It is inherited from the platform's planning, not a legal number.- The result is never 0 and never below the margin: a type whose rule asks for no audio still keeps the platform's included retention.
- A tenant that declares nothing gets the maximum over every supported type (
basis: undeclared_maximum). Omitting the declaration can never lower the floor.
Read the declaration and the floor
http
GET /v1/business-typesAny console principal can read: a dd_ key or a dashboard login of any role. The 200 body is { "business_types": { ... } }:
| Field | Meaning |
|---|---|
declared | The declared types, sorted; null when nothing was declared. |
supported | The closed vocabulary, each entry { type, audio_floor_months, source }. |
retention_floor.months | The effective floor for new recordings (minimum 3). |
retention_floor.legal_floor_months | The maximum audio floor over the declared types. |
retention_floor.safety_margin_months | The platform margin. |
retention_floor.basis | declared or undeclared_maximum. |
retention_floor.imposed_by | The type or types whose floor is the binding one, each with its source. |
The closed vocabulary of type is cobranza, telemarketing, servicio_cliente, financiera_valores and hipotecas_servicing. Read the current audio_floor_months and source of each from supported rather than hard-coding them. audio_floor_months is 0 when the rule does not ask for the audio.
Status codes: 200, 401, 403, 429, and 503 when the declaration cannot be read; in that case no floor is published, never a guessed number.
Declare the business types
http
PUT /v1/business-typesjson
{ "business_types": ["cobranza"] }- Only a dashboard login (
ddu_) with theaccount_adminrole can write. Add_key reads but gets403 role_forbidden, and so does amemberlogin: lowering a floor is the decision of a person who answers for it. business_typesis required: a list drawn from the vocabulary above, ornull/[]to withdraw the declaration (back to the fail-closed maximum). The list is stored sorted and de-duplicated.- The body is closed: an unknown key, a missing
business_typeskey or a value that is not a list ornullis400 bad_request. A type outside the vocabulary is422 unprocessable.
The 200 body has business_types (same shape as the read) plus:
| Field | Meaning |
|---|---|
changed | false when the body declared what was already declared; nothing is written. |
lowered | true when the effective floor went down. |
previous_floor_months | The effective floor before this call. |
Every change, up or down, writes one append-only audit row in the same transaction: who, when, the previous value and the new one, and the floor each implied. Status codes: 200, 400, 401, 403, 422, 429, 503.
What a tenant cannot lower
- The floor itself.
PUT /v1/recording-policywith aretention_monthsbelow the effective floor is422 unprocessable. Writing that route takes an administrator: add_key or anaccount_adminlogin. Amemberlogin gets403 role_forbidden(core#2438);GET /v1/recording-policydoes not change. - The ceiling. The same call with a
retention_monthsabovemax(3, floor)plus 12 months per block of extra retention bought is422 unprocessable; a policy already stored above it keeps its value and is never raised. See the retention ceiling. - Recordings already made. A lower floor applies to new recordings only.
retained_untilis frozen per recording and objects already sealed keep their seal; changing the declaration or the policy never re-dates them. - Omission. Leaving the declaration out is not a way to a lower floor; it yields the maximum.
Not covered yet
The platform does not publish a legal-coverage matrix by jurisdiction here, and the price of retention above the floor is not defined in this guide. Both are pending a decision tracked in macro-tasks#415. The roadmap register follows the convention that an entry not marked shipped is not served: see Roadmap. Until then, treat the source strings returned by supported as the citation behind each floor, and nothing more.