Skip to content

Reglas de disposición ​

Generado desde DialerDigital/core commit 0fc18008b3c8 — especificación openapi/dialer-v1.yaml v0.134.0. No se edita a mano; consulta Cómo se construye esta referencia. Descargar la especificación OpenAPI.

English version

Traducción en curso

Esta referencia se genera desde la especificación OpenAPI. Las cadenas que todavía no tienen traducción aparecen en inglés.

La política de reintentos del tenant según el resultado de la llamada (R10): reprogramar o suprimir una deuda tras una disposición dada. Solo puede posponer o cerrar una deuda; cada marcación sigue pasando por las compuertas de cumplimiento en el momento del originate.

Endpoints ​

MétodoRutaResumen
GET/v1/disposition-rulesListar la política de reintentos del tenant por resultado
PUT/v1/disposition-rulesReemplazar la política de reprogramar/suprimir del tenant
POST/v1/disposition-rules/seed-defaultsInstalar las cadencias de reintento canónicas
GET/v1/campaigns/{id}/disposition-rulesLeer la política de reintentos de una campaña
PUT/v1/campaigns/{id}/disposition-rulesReemplazar la política de reprogramar/suprimir de una campaña

Listar la política de reintentos del tenant por resultado ​

http
GET /v1/disposition-rules

Cada regla con alcance de TENANT, activa o no y con cualquier efecto, ordenada por code y luego por priority. Una regla desactivada se sigue listando (active: false): las reglas nunca se eliminan, así que el historial de una cadencia sigue siendo legible. Todas las reglas listadas aquí tienen campaign_id: null; las reglas propias de una campaña se leen en GET /v1/campaigns/{id}/disposition-rules, y para los códigos en que una campaña tiene reglas activas, estas prevalecen sobre las de aquí en esa campaña.

Un tenant SIN ninguna regla activa tiene una política inerte: cerrar un intento no cambia nada sobre cuándo su deuda vuelve a ser marcable. Las cadencias canónicas se instalan solo a petición (POST /v1/disposition-rules/seed-defaults).

max_attempts limita cuántas veces ESTA política reprograma una deuda (el conteo es cada intento original de la deuda, con cualquier resultado). No es un techo regulatorio y no mueve ninguno: las compuertas de cumplimiento se vuelven a ejecutar en el originate en cada marcación, diga lo que diga la política.

Respuestas

200 ​

Las reglas del tenant.

CampoTipoObligatorioDescripción
disposition_rulesarreglo de DispositionRulesí
disposition_rules[].idstring (uuid)sí
disposition_rules[].campaign_idstring,null (uuid)nonull para una regla del tenant; el id de la campaña para una regla de esa campaña, que prevalece sobre las reglas del tenant para su código en esa campaña.
disposition_rules[].codestringsíEl resultado de la llamada al que reacciona la regla, comparado literalmente (busy, no_answer, ...).
disposition_rules[].effectstringsíreschedule o suppress (los dos que escribe esta API). Una regla almacenada con otro efecto se lista tal cual y esta API nunca la escribe.
disposition_rules[].paramsobjectsíPara reschedule: delay_seconds, factor, max_delay_seconds, max_attempts (los cuatro se almacenan). Para suppress: reason opcional.
disposition_rules[].priorityintegersíLa menor se ejecuta primero.
disposition_rules[].activebooleansí
disposition_rules[].updated_atstring (date-time)sí

401 — Unauthorized ​

Clave de API ausente, desconocida o revocada (o, en /v1/admin/*, un token de administración incorrecto o sin definir; en webhooks, una firma incorrecta o ausente). Una sesión del dashboard (ddu_) que un inicio de sesión más reciente de la misma persona haya cerrado responde en cambio con el código session_superseded (indicador de tenant single_session_enforced), para que la pantalla pueda explicar por qué se cerró la sesión; un cierre de sesión, un token vencido o uno desconocido siguen siendo unauthorized.

json
{
  "error": {
    "code": "unauthorized",
    "message": "invalid or revoked API key"
  }
}

429 — ApiKeyRateLimited ​

Esta clave de API ha superado su cuota de peticiones, o las claves del tenant en conjunto han superado el techo del tenant (core#2503) (code rate_limited). La petición no se procesó. Espera Retry-After segundos y reintenta; un rechazo no cuenta contra el presupuesto, así que esa espera siempre basta. Acotado por clave de API y, por encima de las claves, por tenant (api_tenant_requests_per_minute): una clave hermana no se ve afectada hasta que las claves del tenant en conjunto alcanzan ese techo. La cuota se aplica a toda operación alcanzable con una clave dd_, así que las operaciones que nombran un 429 más específico (control de llamadas, disposiciones, SMS, …) PUEDEN responder TAMBIÉN este, con sus cabeceras X-RateLimit-*.

json
{
  "error": {
    "code": "rate_limited",
    "message": "API key request quota exceeded; retry after the interval in Retry-After"
  }
}

Reemplazar la política de reprogramar/suprimir del tenant ​

http
PUT /v1/disposition-rules

Semántica PUT sobre los dos efectos escribibles (reschedule, suppress), en el alcance de TENANT: cada (code, effect) listado se escribe tal como se da, y cada regla reschedule/suppress ACTIVA del alcance de tenant que NO esté listada se desactiva (active: false, nunca se elimina). Un arreglo rules vacío desactiva la política del tenant. Las reglas con cualquier otro efecto, y las reglas propias de cada campaña, ni se escriben ni se retiran con esta llamada.

La validación es estricta e informa de TODOS los problemas en un único 422, cada uno nombrando el elemento y el campo (rules[1].params.max_attempts must be an integer between 1 and 100): code no vacío (máximo 64 caracteres, sin espacios en los extremos, sin byte nulo); delay_seconds y max_delay_seconds enteros JSON entre 0 y 2592000, con max_delay_seconds >= delay_seconds; factor un número entre 1 y 10; max_attempts un entero JSON entre 1 y 100; priority un entero JSON entre 0 y 2147483647; reason sin byte nulo; como máximo una regla por (code, effect); como máximo 100 reglas; ningún campo desconocido en ningún nivel. Los dos techos de factor y max_attempts juntos mantienen finito el crecimiento factor^(attempts - 1). factor (2.0 por defecto) y max_delay_seconds (86400 por defecto) pueden omitirse: el valor que aplica el motor se ALMACENA entonces, de modo que una lectura muestra lo que se aplica. Un priority omitido es 100 y un active omitido es true.

El retraso crece como delay_seconds * factor^(attempts - 1), limitado a max_delay_seconds; al alcanzar max_attempts la deuda se cierra en lugar de reprogramarse. El siguiente instante marcable se calcula a partir de la hora de fin del intento cerrado, no del reloj de pared, de modo que reprocesar el mismo intento produce el mismo instante.

Cada cambio se registra en la pista de auditoría de configuración de solo anexado del tenant (quién, desde qué, hasta qué) en la misma transacción que la escritura; una regla sin cambios no escribe nada. Alcance de gestión del tenant (clave dd_ o inicio de sesión del dashboard; ddw_ → 403).

Reglas de rol (core#2438): una clave dd_ o un inicio de sesión account_admin; un inicio de sesión member recibe 403 role_forbidden (ajuste por tenant compliance_config_admin_only, activado por defecto). El GET de este recurso no se ve afectado.

Cuerpo de la petición (JSON, obligatorio)

CampoTipoObligatorioDescripción
rulesarreglo de objectsí
rules[].codestringsí
rules[].effectreschedule · suppresssí
rules[].priorityintegerno
rules[].activebooleanno
rules[].paramsobjectnoObligatorio para reschedule (delay_seconds y max_attempts obligatorios dentro). Opcional para suppress (solo reason).
rules[].params.delay_secondsintegerno
rules[].params.factornumberno
rules[].params.max_delay_secondsintegerno
rules[].params.max_attemptsintegernoCuántos intentos originales de la deuda (con cualquier resultado) permite esta política antes de cerrarla en lugar de reprogramarla. No es un techo regulatorio; las compuertas de cumplimiento deciden de forma independiente en cada marcación.
rules[].params.reasonstringno
json
{
  "rules": [
    {
      "code": "busy",
      "effect": "reschedule",
      "priority": 10,
      "params": {
        "delay_seconds": 1200,
        "factor": 2,
        "max_delay_seconds": 86400,
        "max_attempts": 6
      }
    },
    {
      "code": "invalid_number",
      "effect": "suppress",
      "params": {
        "reason": "invalid_number"
      }
    }
  ]
}

Respuestas

200 ​

Todas las reglas del tenant después de la escritura (misma forma que el GET).

CampoTipoObligatorioDescripción
disposition_rulesarreglo de DispositionRulesí
disposition_rules[].idstring (uuid)sí
disposition_rules[].campaign_idstring,null (uuid)nonull para una regla del tenant; el id de la campaña para una regla de esa campaña, que prevalece sobre las reglas del tenant para su código en esa campaña.
disposition_rules[].codestringsíEl resultado de la llamada al que reacciona la regla, comparado literalmente (busy, no_answer, ...).
disposition_rules[].effectstringsíreschedule o suppress (los dos que escribe esta API). Una regla almacenada con otro efecto se lista tal cual y esta API nunca la escribe.
disposition_rules[].paramsobjectsíPara reschedule: delay_seconds, factor, max_delay_seconds, max_attempts (los cuatro se almacenan). Para suppress: reason opcional.
disposition_rules[].priorityintegersíLa menor se ejecuta primero.
disposition_rules[].activebooleansí
disposition_rules[].updated_atstring (date-time)sí

400 — BadRequest ​

Petición mal formada (errores de forma/tipo, filtros no válidos, marcas de tiempo erróneas).

json
{
  "error": {
    "code": "bad_request",
    "message": "from must be RFC-3339"
  }
}

401 — Unauthorized ​

Clave de API ausente, desconocida o revocada (o, en /v1/admin/*, un token de administración incorrecto o sin definir; en webhooks, una firma incorrecta o ausente). Una sesión del dashboard (ddu_) que un inicio de sesión más reciente de la misma persona haya cerrado responde en cambio con el código session_superseded (indicador de tenant single_session_enforced), para que la pantalla pueda explicar por qué se cerró la sesión; un cierre de sesión, un token vencido o uno desconocido siguen siendo unauthorized.

json
{
  "error": {
    "code": "unauthorized",
    "message": "invalid or revoked API key"
  }
}

403 — Forbidden ​

El tenant está suspendido. Una sesión del dashboard (ddu_) de un tenant cuya política de inicio de sesión (ADR 227) está en modo enforce responde 403 con el código login_policy_denied ante una solicitud desde una dirección o en una hora que la política no permite — el mismo cuerpo en ambos casos; la sesión no se revoca y una solicitud posterior dentro de la política se procesa. Un token de widget (ddw_) de un puesto queda sujeto a la misma política en cada solicitud (core#2406, indicador widget_login_honors_policy). Un tenant sintético (demo) responde 403 con el código synthetic_tenant en toda ruta que llegaría a un tercero — marcación manual, pierna de transferencia externa o de conferencia, envío de SMS (core#2251, adenda del ADR #280). Ningún pago lo cambia.

json
{
  "error": {
    "code": "forbidden",
    "message": "tenant is suspended"
  }
}

422 — Unprocessable ​

La forma es correcta, la semántica no (regla de dominio incumplida).

json
{
  "error": {
    "code": "unprocessable",
    "message": "scheduled_at is closer than the minimum notice for a callback (10 minutes unless the tenant's callback_min_notice_seconds says otherwise)"
  }
}

429 — ApiKeyRateLimited ​

Esta clave de API ha superado su cuota de peticiones, o las claves del tenant en conjunto han superado el techo del tenant (core#2503) (code rate_limited). La petición no se procesó. Espera Retry-After segundos y reintenta; un rechazo no cuenta contra el presupuesto, así que esa espera siempre basta. Acotado por clave de API y, por encima de las claves, por tenant (api_tenant_requests_per_minute): una clave hermana no se ve afectada hasta que las claves del tenant en conjunto alcanzan ese techo. La cuota se aplica a toda operación alcanzable con una clave dd_, así que las operaciones que nombran un 429 más específico (control de llamadas, disposiciones, SMS, …) PUEDEN responder TAMBIÉN este, con sus cabeceras X-RateLimit-*.

json
{
  "error": {
    "code": "rate_limited",
    "message": "API key request quota exceeded; retry after the interval in Retry-After"
  }
}

Instalar las cadencias de reintento canónicas ​

http
POST /v1/disposition-rules/seed-defaults

Escribe las reglas canónicas: busy → reschedule (1200 s, factor 2.0, 6 intentos), no_answer → reschedule (7200 s, factor 1.5, 5 intentos), answered_machine → reschedule (86400 s, factor 1.0, 3 intentos) y invalid_number → suppress; todo reschedule se limita a 86400 s. Un código canónico que el tenant había personalizado se restaura a estos valores; cualquier otra regla se deja intacta. Idempotente: una segunda llamada no cambia nada y no registra nada. Explícito a propósito: instalar una política cambia lo que marca el tenant, por lo que ningún despliegue ni migración lo hace. Auditado igual que el PUT. No recibe cuerpo (cualquier campo es 400). Alcance de gestión del tenant (clave dd_ o inicio de sesión del dashboard; ddw_ → 403).

Reglas de rol (core#2438): una clave dd_ o un inicio de sesión account_admin; un inicio de sesión member recibe 403 role_forbidden (ajuste por tenant compliance_config_admin_only, activado por defecto). El GET de este recurso no se ve afectado.

Respuestas

200 ​

Todas las reglas del tenant después de la siembra (misma forma que el GET).

CampoTipoObligatorioDescripción
disposition_rulesarreglo de DispositionRulesí
disposition_rules[].idstring (uuid)sí
disposition_rules[].campaign_idstring,null (uuid)nonull para una regla del tenant; el id de la campaña para una regla de esa campaña, que prevalece sobre las reglas del tenant para su código en esa campaña.
disposition_rules[].codestringsíEl resultado de la llamada al que reacciona la regla, comparado literalmente (busy, no_answer, ...).
disposition_rules[].effectstringsíreschedule o suppress (los dos que escribe esta API). Una regla almacenada con otro efecto se lista tal cual y esta API nunca la escribe.
disposition_rules[].paramsobjectsíPara reschedule: delay_seconds, factor, max_delay_seconds, max_attempts (los cuatro se almacenan). Para suppress: reason opcional.
disposition_rules[].priorityintegersíLa menor se ejecuta primero.
disposition_rules[].activebooleansí
disposition_rules[].updated_atstring (date-time)sí

400 — BadRequest ​

Petición mal formada (errores de forma/tipo, filtros no válidos, marcas de tiempo erróneas).

json
{
  "error": {
    "code": "bad_request",
    "message": "from must be RFC-3339"
  }
}

401 — Unauthorized ​

Clave de API ausente, desconocida o revocada (o, en /v1/admin/*, un token de administración incorrecto o sin definir; en webhooks, una firma incorrecta o ausente). Una sesión del dashboard (ddu_) que un inicio de sesión más reciente de la misma persona haya cerrado responde en cambio con el código session_superseded (indicador de tenant single_session_enforced), para que la pantalla pueda explicar por qué se cerró la sesión; un cierre de sesión, un token vencido o uno desconocido siguen siendo unauthorized.

json
{
  "error": {
    "code": "unauthorized",
    "message": "invalid or revoked API key"
  }
}

403 — Forbidden ​

El tenant está suspendido. Una sesión del dashboard (ddu_) de un tenant cuya política de inicio de sesión (ADR 227) está en modo enforce responde 403 con el código login_policy_denied ante una solicitud desde una dirección o en una hora que la política no permite — el mismo cuerpo en ambos casos; la sesión no se revoca y una solicitud posterior dentro de la política se procesa. Un token de widget (ddw_) de un puesto queda sujeto a la misma política en cada solicitud (core#2406, indicador widget_login_honors_policy). Un tenant sintético (demo) responde 403 con el código synthetic_tenant en toda ruta que llegaría a un tercero — marcación manual, pierna de transferencia externa o de conferencia, envío de SMS (core#2251, adenda del ADR #280). Ningún pago lo cambia.

json
{
  "error": {
    "code": "forbidden",
    "message": "tenant is suspended"
  }
}

429 — ApiKeyRateLimited ​

Esta clave de API ha superado su cuota de peticiones, o las claves del tenant en conjunto han superado el techo del tenant (core#2503) (code rate_limited). La petición no se procesó. Espera Retry-After segundos y reintenta; un rechazo no cuenta contra el presupuesto, así que esa espera siempre basta. Acotado por clave de API y, por encima de las claves, por tenant (api_tenant_requests_per_minute): una clave hermana no se ve afectada hasta que las claves del tenant en conjunto alcanzan ese techo. La cuota se aplica a toda operación alcanzable con una clave dd_, así que las operaciones que nombran un 429 más específico (control de llamadas, disposiciones, SMS, …) PUEDEN responder TAMBIÉN este, con sus cabeceras X-RateLimit-*.

json
{
  "error": {
    "code": "rate_limited",
    "message": "API key request quota exceeded; retry after the interval in Retry-After"
  }
}

Leer la política de reintentos de una campaña ​

http
GET /v1/campaigns/{id}/disposition-rules

disposition_rules son las reglas PROPIAS de la campaña, activas o no (mismo orden y forma que GET /v1/disposition-rules, con campaign_id establecido).

effective_rules son las reglas ACTIVAS que aplican a un intento de esta campaña. La precedencia es por code: cuando la campaña tiene al menos una regla activa para un código, las reglas de la campaña para ese código son la política para él en esta campaña y las reglas del tenant para ese código no se aplican aquí; para cualquier otro código se aplican las reglas del tenant. El campaign_id de cada entrada indica de qué alcance procede (null = el del tenant). Esta lista se calcula con la misma precedencia que aplica el marcador cuando se cierra un intento, así que es lo que se aplica. La campaña que decide es la campaña del INTENTO.

Una campaña sin reglas propias marca exactamente bajo la política del tenant. Una campaña que no es del tenant (o un id mal formado) es un 404.

Respuestas

200 ​

Las reglas propias de la campaña y las reglas que le aplican.

CampoTipoObligatorioDescripción
campaign_idstring (uuid)sí
disposition_rulesarreglo de DispositionRulesí
disposition_rules[].idstring (uuid)sí
disposition_rules[].campaign_idstring,null (uuid)nonull para una regla del tenant; el id de la campaña para una regla de esa campaña, que prevalece sobre las reglas del tenant para su código en esa campaña.
disposition_rules[].codestringsíEl resultado de la llamada al que reacciona la regla, comparado literalmente (busy, no_answer, ...).
disposition_rules[].effectstringsíreschedule o suppress (los dos que escribe esta API). Una regla almacenada con otro efecto se lista tal cual y esta API nunca la escribe.
disposition_rules[].paramsobjectsíPara reschedule: delay_seconds, factor, max_delay_seconds, max_attempts (los cuatro se almacenan). Para suppress: reason opcional.
disposition_rules[].priorityintegersíLa menor se ejecuta primero.
disposition_rules[].activebooleansí
disposition_rules[].updated_atstring (date-time)sí
effective_rulesarreglo de DispositionRulesí
effective_rules[].idstring (uuid)sí
effective_rules[].campaign_idstring,null (uuid)nonull para una regla del tenant; el id de la campaña para una regla de esa campaña, que prevalece sobre las reglas del tenant para su código en esa campaña.
effective_rules[].codestringsíEl resultado de la llamada al que reacciona la regla, comparado literalmente (busy, no_answer, ...).
effective_rules[].effectstringsíreschedule o suppress (los dos que escribe esta API). Una regla almacenada con otro efecto se lista tal cual y esta API nunca la escribe.
effective_rules[].paramsobjectsíPara reschedule: delay_seconds, factor, max_delay_seconds, max_attempts (los cuatro se almacenan). Para suppress: reason opcional.
effective_rules[].priorityintegersíLa menor se ejecuta primero.
effective_rules[].activebooleansí
effective_rules[].updated_atstring (date-time)sí

401 — Unauthorized ​

Clave de API ausente, desconocida o revocada (o, en /v1/admin/*, un token de administración incorrecto o sin definir; en webhooks, una firma incorrecta o ausente). Una sesión del dashboard (ddu_) que un inicio de sesión más reciente de la misma persona haya cerrado responde en cambio con el código session_superseded (indicador de tenant single_session_enforced), para que la pantalla pueda explicar por qué se cerró la sesión; un cierre de sesión, un token vencido o uno desconocido siguen siendo unauthorized.

json
{
  "error": {
    "code": "unauthorized",
    "message": "invalid or revoked API key"
  }
}

404 — NotFound ​

Id desconocido, mal formado (no UUID) O id de otro tenant: RLS devuelve cero filas, así que los tres son indistinguibles por diseño (sin fuga de existencia, nunca un 403 para ids ajenos).

json
{
  "error": {
    "code": "not_found",
    "message": "resource not found for this tenant"
  }
}

429 — ApiKeyRateLimited ​

Esta clave de API ha superado su cuota de peticiones, o las claves del tenant en conjunto han superado el techo del tenant (core#2503) (code rate_limited). La petición no se procesó. Espera Retry-After segundos y reintenta; un rechazo no cuenta contra el presupuesto, así que esa espera siempre basta. Acotado por clave de API y, por encima de las claves, por tenant (api_tenant_requests_per_minute): una clave hermana no se ve afectada hasta que las claves del tenant en conjunto alcanzan ese techo. La cuota se aplica a toda operación alcanzable con una clave dd_, así que las operaciones que nombran un 429 más específico (control de llamadas, disposiciones, SMS, …) PUEDEN responder TAMBIÉN este, con sus cabeceras X-RateLimit-*.

json
{
  "error": {
    "code": "rate_limited",
    "message": "API key request quota exceeded; retry after the interval in Retry-After"
  }
}

Reemplazar la política de reprogramar/suprimir de una campaña ​

http
PUT /v1/campaigns/{id}/disposition-rules

Mismo cuerpo, validación y semántica PUT que PUT /v1/disposition-rules, solo sobre las reglas propias de esta campaña: cada (code, effect) listado se escribe para la campaña, y cada regla reschedule/suppress ACTIVA de la campaña que NO esté listada se desactiva (active: false, nunca se elimina). Las reglas del tenant y las de cualquier otra campaña nunca se escriben ni se retiran con esta llamada. Un arreglo rules vacío desactiva las reglas propias de la campaña, lo que devuelve la campaña a la política del tenant.

Una regla de campaña solo puede posponer (reschedule) o cerrar (suppress) una deuda, igual que una regla del tenant; las compuertas de cumplimiento se vuelven a ejecutar en el originate en cada marcación. Auditado en la pista de configuración del tenant en la misma transacción, bajo la clave campaign_disposition_rule:<campaign_id>:<code>:<effect>. Alcance de gestión del tenant (clave dd_ o inicio de sesión del dashboard; ddw_ → 403). Una campaña que no es del tenant es un 404 y no se escribe nada.

Reglas de rol (core#2438): una clave dd_ o un inicio de sesión account_admin; un inicio de sesión member recibe 403 role_forbidden (ajuste por tenant compliance_config_admin_only, activado por defecto). El GET de este recurso no se ve afectado.

Cuerpo de la petición (JSON, obligatorio)

CampoTipoObligatorioDescripción
rulesarreglo de objectsí
rules[].codestringsí
rules[].effectreschedule · suppresssí
rules[].priorityintegerno
rules[].activebooleanno
rules[].paramsobjectnoObligatorio para reschedule (delay_seconds y max_attempts obligatorios dentro). Opcional para suppress (solo reason).
rules[].params.delay_secondsintegerno
rules[].params.factornumberno
rules[].params.max_delay_secondsintegerno
rules[].params.max_attemptsintegernoCuántos intentos originales de la deuda (con cualquier resultado) permite esta política antes de cerrarla en lugar de reprogramarla. No es un techo regulatorio; las compuertas de cumplimiento deciden de forma independiente en cada marcación.
rules[].params.reasonstringno
json
{
  "rules": [
    {
      "code": "no_answer",
      "effect": "reschedule",
      "priority": 10,
      "params": {
        "delay_seconds": 14400,
        "factor": 1,
        "max_delay_seconds": 14400,
        "max_attempts": 3
      }
    }
  ]
}

Respuestas

200 ​

Las reglas propias de la campaña después de la escritura.

CampoTipoObligatorioDescripción
campaign_idstring (uuid)sí
disposition_rulesarreglo de DispositionRulesí
disposition_rules[].idstring (uuid)sí
disposition_rules[].campaign_idstring,null (uuid)nonull para una regla del tenant; el id de la campaña para una regla de esa campaña, que prevalece sobre las reglas del tenant para su código en esa campaña.
disposition_rules[].codestringsíEl resultado de la llamada al que reacciona la regla, comparado literalmente (busy, no_answer, ...).
disposition_rules[].effectstringsíreschedule o suppress (los dos que escribe esta API). Una regla almacenada con otro efecto se lista tal cual y esta API nunca la escribe.
disposition_rules[].paramsobjectsíPara reschedule: delay_seconds, factor, max_delay_seconds, max_attempts (los cuatro se almacenan). Para suppress: reason opcional.
disposition_rules[].priorityintegersíLa menor se ejecuta primero.
disposition_rules[].activebooleansí
disposition_rules[].updated_atstring (date-time)sí

400 — BadRequest ​

Petición mal formada (errores de forma/tipo, filtros no válidos, marcas de tiempo erróneas).

json
{
  "error": {
    "code": "bad_request",
    "message": "from must be RFC-3339"
  }
}

401 — Unauthorized ​

Clave de API ausente, desconocida o revocada (o, en /v1/admin/*, un token de administración incorrecto o sin definir; en webhooks, una firma incorrecta o ausente). Una sesión del dashboard (ddu_) que un inicio de sesión más reciente de la misma persona haya cerrado responde en cambio con el código session_superseded (indicador de tenant single_session_enforced), para que la pantalla pueda explicar por qué se cerró la sesión; un cierre de sesión, un token vencido o uno desconocido siguen siendo unauthorized.

json
{
  "error": {
    "code": "unauthorized",
    "message": "invalid or revoked API key"
  }
}

403 — Forbidden ​

El tenant está suspendido. Una sesión del dashboard (ddu_) de un tenant cuya política de inicio de sesión (ADR 227) está en modo enforce responde 403 con el código login_policy_denied ante una solicitud desde una dirección o en una hora que la política no permite — el mismo cuerpo en ambos casos; la sesión no se revoca y una solicitud posterior dentro de la política se procesa. Un token de widget (ddw_) de un puesto queda sujeto a la misma política en cada solicitud (core#2406, indicador widget_login_honors_policy). Un tenant sintético (demo) responde 403 con el código synthetic_tenant en toda ruta que llegaría a un tercero — marcación manual, pierna de transferencia externa o de conferencia, envío de SMS (core#2251, adenda del ADR #280). Ningún pago lo cambia.

json
{
  "error": {
    "code": "forbidden",
    "message": "tenant is suspended"
  }
}

404 — NotFound ​

Id desconocido, mal formado (no UUID) O id de otro tenant: RLS devuelve cero filas, así que los tres son indistinguibles por diseño (sin fuga de existencia, nunca un 403 para ids ajenos).

json
{
  "error": {
    "code": "not_found",
    "message": "resource not found for this tenant"
  }
}

422 — Unprocessable ​

La forma es correcta, la semántica no (regla de dominio incumplida).

json
{
  "error": {
    "code": "unprocessable",
    "message": "scheduled_at is closer than the minimum notice for a callback (10 minutes unless the tenant's callback_min_notice_seconds says otherwise)"
  }
}

429 — ApiKeyRateLimited ​

Esta clave de API ha superado su cuota de peticiones, o las claves del tenant en conjunto han superado el techo del tenant (core#2503) (code rate_limited). La petición no se procesó. Espera Retry-After segundos y reintenta; un rechazo no cuenta contra el presupuesto, así que esa espera siempre basta. Acotado por clave de API y, por encima de las claves, por tenant (api_tenant_requests_per_minute): una clave hermana no se ve afectada hasta que las claves del tenant en conjunto alcanzan ese techo. La cuota se aplica a toda operación alcanzable con una clave dd_, así que las operaciones que nombran un 429 más específico (control de llamadas, disposiciones, SMS, …) PUEDEN responder TAMBIÉN este, con sus cabeceras X-RateLimit-*.

json
{
  "error": {
    "code": "rate_limited",
    "message": "API key request quota exceeded; retry after the interval in Retry-After"
  }
}

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