Skip to content

Recording retention by business type ​

Español: Retención de grabaciones por tipo de negocio.

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 ​

CapabilityAvailability
GET /v1/business-types, PUT /v1/business-typesPublished in core v0.103.0 (core#2012, core#2065)

How the floor is computed ​

text
months = legal_floor_months + safety_margin_months
  • legal_floor_months is the maximum audio floor over the declared types. A tenant that declares cobranza and telemarketing gets the higher of the two.
  • safety_margin_months is 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-types

Any console principal can read: a dd_ key or a dashboard login of any role. The 200 body is { "business_types": { ... } }:

FieldMeaning
declaredThe declared types, sorted; null when nothing was declared.
supportedThe closed vocabulary, each entry { type, audio_floor_months, source }.
retention_floor.monthsThe effective floor for new recordings (minimum 3).
retention_floor.legal_floor_monthsThe maximum audio floor over the declared types.
retention_floor.safety_margin_monthsThe platform margin.
retention_floor.basisdeclared or undeclared_maximum.
retention_floor.imposed_byThe 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-types
json
{ "business_types": ["cobranza"] }
  • Only a dashboard login (ddu_) with the account_admin role can write. A dd_ key reads but gets 403 role_forbidden, and so does a member login: lowering a floor is the decision of a person who answers for it.
  • business_types is required: a list drawn from the vocabulary above, or null / [] 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_types key or a value that is not a list or null is 400 bad_request. A type outside the vocabulary is 422 unprocessable.

The 200 body has business_types (same shape as the read) plus:

FieldMeaning
changedfalse when the body declared what was already declared; nothing is written.
loweredtrue when the effective floor went down.
previous_floor_monthsThe 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-policy with a retention_months below the effective floor is 422 unprocessable. Writing that route takes an administrator: a dd_ key or an account_admin login. A member login gets 403 role_forbidden (core#2438); GET /v1/recording-policy does not change.
  • The ceiling. The same call with a retention_months above max(3, floor) plus 12 months per block of extra retention bought is 422 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_until is 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.

Nothing in these docs is legal advice — always confirm compliance posture with your own counsel.