Appearance
Reglas de disposición
Generado desde
DialerDigital/corecommit0fc18008b3c8— especificaciónopenapi/dialer-v1.yamlv0.134.0. No se edita a mano; consulta Cómo se construye esta referencia. Descargar la especificación OpenAPI.
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étodo | Ruta | Resumen |
|---|---|---|
GET | /v1/disposition-rules | Listar la política de reintentos del tenant por resultado |
PUT | /v1/disposition-rules | Reemplazar la política de reprogramar/suprimir del tenant |
POST | /v1/disposition-rules/seed-defaults | Instalar las cadencias de reintento canónicas |
GET | /v1/campaigns/{id}/disposition-rules | Leer la política de reintentos de una campaña |
PUT | /v1/campaigns/{id}/disposition-rules | Reemplazar la política de reprogramar/suprimir de una campaña |
Listar la política de reintentos del tenant por resultado
http
GET /v1/disposition-rulesCada 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.
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
disposition_rules | arreglo de DispositionRule | sí | |
disposition_rules[].id | string (uuid) | sí | |
disposition_rules[].campaign_id | string,null (uuid) | no | null 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[].code | string | sí | El resultado de la llamada al que reacciona la regla, comparado literalmente (busy, no_answer, ...). |
disposition_rules[].effect | string | sí | 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[].params | object | sí | Para reschedule: delay_seconds, factor, max_delay_seconds, max_attempts (los cuatro se almacenan). Para suppress: reason opcional. |
disposition_rules[].priority | integer | sí | La menor se ejecuta primero. |
disposition_rules[].active | boolean | sí | |
disposition_rules[].updated_at | string (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-rulesSemá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)
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
rules | arreglo de object | sí | |
rules[].code | string | sí | |
rules[].effect | reschedule · suppress | sí | |
rules[].priority | integer | no | |
rules[].active | boolean | no | |
rules[].params | object | no | Obligatorio para reschedule (delay_seconds y max_attempts obligatorios dentro). Opcional para suppress (solo reason). |
rules[].params.delay_seconds | integer | no | |
rules[].params.factor | number | no | |
rules[].params.max_delay_seconds | integer | no | |
rules[].params.max_attempts | integer | no | Cuá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.reason | string | no |
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).
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
disposition_rules | arreglo de DispositionRule | sí | |
disposition_rules[].id | string (uuid) | sí | |
disposition_rules[].campaign_id | string,null (uuid) | no | null 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[].code | string | sí | El resultado de la llamada al que reacciona la regla, comparado literalmente (busy, no_answer, ...). |
disposition_rules[].effect | string | sí | 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[].params | object | sí | Para reschedule: delay_seconds, factor, max_delay_seconds, max_attempts (los cuatro se almacenan). Para suppress: reason opcional. |
disposition_rules[].priority | integer | sí | La menor se ejecuta primero. |
disposition_rules[].active | boolean | sí | |
disposition_rules[].updated_at | string (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-defaultsEscribe 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).
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
disposition_rules | arreglo de DispositionRule | sí | |
disposition_rules[].id | string (uuid) | sí | |
disposition_rules[].campaign_id | string,null (uuid) | no | null 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[].code | string | sí | El resultado de la llamada al que reacciona la regla, comparado literalmente (busy, no_answer, ...). |
disposition_rules[].effect | string | sí | 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[].params | object | sí | Para reschedule: delay_seconds, factor, max_delay_seconds, max_attempts (los cuatro se almacenan). Para suppress: reason opcional. |
disposition_rules[].priority | integer | sí | La menor se ejecuta primero. |
disposition_rules[].active | boolean | sí | |
disposition_rules[].updated_at | string (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-rulesdisposition_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.
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
campaign_id | string (uuid) | sí | |
disposition_rules | arreglo de DispositionRule | sí | |
disposition_rules[].id | string (uuid) | sí | |
disposition_rules[].campaign_id | string,null (uuid) | no | null 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[].code | string | sí | El resultado de la llamada al que reacciona la regla, comparado literalmente (busy, no_answer, ...). |
disposition_rules[].effect | string | sí | 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[].params | object | sí | Para reschedule: delay_seconds, factor, max_delay_seconds, max_attempts (los cuatro se almacenan). Para suppress: reason opcional. |
disposition_rules[].priority | integer | sí | La menor se ejecuta primero. |
disposition_rules[].active | boolean | sí | |
disposition_rules[].updated_at | string (date-time) | sí | |
effective_rules | arreglo de DispositionRule | sí | |
effective_rules[].id | string (uuid) | sí | |
effective_rules[].campaign_id | string,null (uuid) | no | null 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[].code | string | sí | El resultado de la llamada al que reacciona la regla, comparado literalmente (busy, no_answer, ...). |
effective_rules[].effect | string | sí | 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[].params | object | sí | Para reschedule: delay_seconds, factor, max_delay_seconds, max_attempts (los cuatro se almacenan). Para suppress: reason opcional. |
effective_rules[].priority | integer | sí | La menor se ejecuta primero. |
effective_rules[].active | boolean | sí | |
effective_rules[].updated_at | string (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-rulesMismo 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)
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
rules | arreglo de object | sí | |
rules[].code | string | sí | |
rules[].effect | reschedule · suppress | sí | |
rules[].priority | integer | no | |
rules[].active | boolean | no | |
rules[].params | object | no | Obligatorio para reschedule (delay_seconds y max_attempts obligatorios dentro). Opcional para suppress (solo reason). |
rules[].params.delay_seconds | integer | no | |
rules[].params.factor | number | no | |
rules[].params.max_delay_seconds | integer | no | |
rules[].params.max_attempts | integer | no | Cuá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.reason | string | no |
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.
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
campaign_id | string (uuid) | sí | |
disposition_rules | arreglo de DispositionRule | sí | |
disposition_rules[].id | string (uuid) | sí | |
disposition_rules[].campaign_id | string,null (uuid) | no | null 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[].code | string | sí | El resultado de la llamada al que reacciona la regla, comparado literalmente (busy, no_answer, ...). |
disposition_rules[].effect | string | sí | 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[].params | object | sí | Para reschedule: delay_seconds, factor, max_delay_seconds, max_attempts (los cuatro se almacenan). Para suppress: reason opcional. |
disposition_rules[].priority | integer | sí | La menor se ejecuta primero. |
disposition_rules[].active | boolean | sí | |
disposition_rules[].updated_at | string (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"
}
}