Skip to content

Filtros de segmento ​

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.

Filtros de segmentación guardados (los criterios de GET /v1/debts con un nombre), versionados sólo-anexado por tenant. Detrás del indicador debt_segmentation_enabled (ADR #221).

Endpoints ​

MétodoRutaResumen
GET/v1/segment-filtersLos filtros de segmentación guardados del tenant, cada uno con su versión vigente
POST/v1/segment-filtersCrear un filtro guardado (versión 1)
GET/v1/segment-filters/{id}Un filtro guardado, en su versión vigente
PATCH/v1/segment-filters/{id}Renombrar un filtro, o editar sus criterios en una versión NUEVA
DELETE/v1/segment-filters/{id}Archivar un filtro guardado
POST/v1/segment-filters/{id}/to-listCongelar en una lista lo que un filtro guardado selecciona AHORA
POST/v1/segment-filters/to-listCongelar en una lista lo que seleccionan AHORA unos criterios en línea

Los filtros de segmentación guardados del tenant, cada uno con su versión vigente ​

http
GET /v1/segment-filters

Detrás del indicador debt_segmentation_enabled: con él apagado (el valor por defecto) toda ruta /v1/segment-filters responde 404, sea quien sea el llamante. Por nombre, los vigentes; ?include_archived=true añade los archivados. Cada filtro viene con su versión VIGENTE. Tope de 2 000.

Parámetros

NombreEnTipoObligatorioDescripción
include_archivedquerybooleanno

Respuestas

200 ​

Los filtros.

CampoTipoObligatorioDescripción
segment_filtersarreglo de SegmentFiltersí
segment_filters[].idstring (uuid)sí
segment_filters[].tenant_idstring (uuid)no
segment_filters[].namestringsí
segment_filters[].archivedbooleansí
segment_filters[].versionintegersíLa versión vigente.
segment_filters[].criteriaanysíLos criterios de la versión vigente, en forma canónica (listas ordenadas, sin repetidos).
segment_filters[].version_created_atstring (date-time)no
segment_filters[].created_atstring (date-time)no
segment_filters[].updated_atstring (date-time)no

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"
  }
}

Crear un filtro guardado (versión 1) ​

http
POST /v1/segment-filters

name va sin espacios en los extremos, no en blanco, con un máximo de 200 caracteres y único entre los filtros VIGENTES del tenant (409). criteria pasa por Dialer.Debts.Segment (ADR #221): un vocabulario cerrado, un valor fuera de él da 400, y phone, consumer_ref, external_ref y debtor_name se rechazan por su nombre. El servidor guarda la forma canónica (listas ordenadas, sin repetidos). Un objeto vacío es válido: toda la cartera. Un tenant tiene como máximo 500 filtros vigentes (422). Requiere el alcance de tenant (403 para un token de agente). Con el indicador apagado, 404.

Cuerpo de la petición (JSON, obligatorio)

CampoTipoObligatorioDescripción
namestringsí
criteriaobject (SegmentCriteria)síCriterios que aceptan las escrituras de segment-filter y las rutas to-list (Dialer.Debts.Segment, ADR #221). Un vocabulario cerrado, combinado con AND; un objeto vacío es toda la cartera. state, debt_type, us_state y regf_status admiten un valor o una lista (siempre se devuelven como lista ordenada sin repetidos). phone, consumer_ref, external_ref y debtor_name se rechazan por su nombre.
criteria.campaign_idstring (uuid)no
criteria.stateopen · in_collection · promise_to_pay · paid · settled · disputed · closed | arreglo de open · in_collection · promise_to_pay · paid · settled · disputed · closedno
criteria.debt_typeother · student_loan | arreglo de other · student_loanno
criteria.us_statestring | arreglo de stringno
criteria.regf_statusok · blocked_7in7 · blocked_post_contact · undecidable | arreglo de ok · blocked_7in7 · blocked_post_contact · undecidablenoCriterio de ADR #221: elegibilidad Reg F vigente derivada por el servidor.
criteria.min_amount_centsintegerno
criteria.max_amount_centsintegerno
criteria.min_age_daysintegernoCriterio de ADR #221: en mora durante al menos este número de días (debts.delinquent_since frente a hoy); una deuda sin delinquent_since nunca coincide.
criteria.max_age_daysintegernoCriterio de ADR #221: en mora durante como máximo este número de días (debts.delinquent_since frente a hoy); una deuda sin delinquent_since nunca coincide. Se rechaza un min_age_days superior a max_age_days.
json
{
  "name": "Texas student loans over 500 USD",
  "criteria": {
    "debt_type": [
      "student_loan"
    ],
    "us_state": [
      "TX"
    ],
    "min_amount_cents": 50000
  }
}

Respuestas

201 ​

El filtro, en la versión 1.

CampoTipoObligatorioDescripción
segment_filterobject (SegmentFilter)síUn filtro guardado: su cabecera y su versión VIGENTE.
segment_filter.idstring (uuid)sí
segment_filter.tenant_idstring (uuid)no
segment_filter.namestringsí
segment_filter.archivedbooleansí
segment_filter.versionintegersíLa versión vigente.
segment_filter.criteriaanysíLos criterios de la versión vigente, en forma canónica (listas ordenadas, sin repetidos).
segment_filter.version_created_atstring (date-time)no
segment_filter.created_atstring (date-time)no
segment_filter.updated_atstring (date-time)no

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"
  }
}

409 — Conflict ​

Transición de estado no válida, conflicto de unicidad, o un asiento que está ocupado/reservado.

json
{
  "error": {
    "code": "conflict",
    "message": "invalid state transition"
  }
}

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)"
  }
}

Un filtro guardado, en su versión vigente ​

http
GET /v1/segment-filters/{id}

Parámetros

NombreEnTipoObligatorioDescripción
idpathstring (uuid)síUUID del recurso. Los ids mal formados o de otro tenant se leen como 404.

Respuestas

200 ​

El filtro (también los archivados, marcados con archived).

CampoTipoObligatorioDescripción
segment_filterobject (SegmentFilter)síUn filtro guardado: su cabecera y su versión VIGENTE.
segment_filter.idstring (uuid)sí
segment_filter.tenant_idstring (uuid)no
segment_filter.namestringsí
segment_filter.archivedbooleansí
segment_filter.versionintegersíLa versión vigente.
segment_filter.criteriaanysíLos criterios de la versión vigente, en forma canónica (listas ordenadas, sin repetidos).
segment_filter.version_created_atstring (date-time)no
segment_filter.created_atstring (date-time)no
segment_filter.updated_atstring (date-time)no

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"
  }
}

Renombrar un filtro, o editar sus criterios en una versión NUEVA ​

http
PATCH /v1/segment-filters/{id}

Envía al menos uno de name, criteria. Un cambio de nombre modifica sólo la cabecera. Cambiar criteria añade la versión n+1 y deja la versión n exactamente como estaba: una lista materializada a partir de ella puede haberla usado. criteria REEMPLAZA a los vigentes, no se fusionan. Una edición que no cambia nada no escribe ninguna versión. base_version es opcional y, si se envía, debe ser la versión vigente; si no, 409 y no se escribe nada, de modo que dos personas que editan el mismo filtro no se sobrescriben sin enterarse. Un filtro archivado no se puede editar (409); un filtro tiene como máximo 1 000 versiones (422). Requiere el alcance de tenant. Con el indicador apagado, 404.

Parámetros

NombreEnTipoObligatorioDescripción
idpathstring (uuid)síUUID del recurso. Los ids mal formados o de otro tenant se leen como 404.

Cuerpo de la petición (JSON, obligatorio)

CampoTipoObligatorioDescripción
namestringno
criteriaobject (SegmentCriteria)noCriterios que aceptan las escrituras de segment-filter y las rutas to-list (Dialer.Debts.Segment, ADR #221). Un vocabulario cerrado, combinado con AND; un objeto vacío es toda la cartera. state, debt_type, us_state y regf_status admiten un valor o una lista (siempre se devuelven como lista ordenada sin repetidos). phone, consumer_ref, external_ref y debtor_name se rechazan por su nombre.
criteria.campaign_idstring (uuid)no
criteria.stateopen · in_collection · promise_to_pay · paid · settled · disputed · closed | arreglo de open · in_collection · promise_to_pay · paid · settled · disputed · closedno
criteria.debt_typeother · student_loan | arreglo de other · student_loanno
criteria.us_statestring | arreglo de stringno
criteria.regf_statusok · blocked_7in7 · blocked_post_contact · undecidable | arreglo de ok · blocked_7in7 · blocked_post_contact · undecidablenoCriterio de ADR #221: elegibilidad Reg F vigente derivada por el servidor.
criteria.min_amount_centsintegerno
criteria.max_amount_centsintegerno
criteria.min_age_daysintegernoCriterio de ADR #221: en mora durante al menos este número de días (debts.delinquent_since frente a hoy); una deuda sin delinquent_since nunca coincide.
criteria.max_age_daysintegernoCriterio de ADR #221: en mora durante como máximo este número de días (debts.delinquent_since frente a hoy); una deuda sin delinquent_since nunca coincide. Se rechaza un min_age_days superior a max_age_days.
base_versionintegerno
json
{
  "base_version": 1,
  "criteria": {
    "us_state": [
      "TX",
      "NY"
    ]
  }
}

Respuestas

200 ​

El filtro, en su versión vigente tras la edición.

CampoTipoObligatorioDescripción
segment_filterobject (SegmentFilter)síUn filtro guardado: su cabecera y su versión VIGENTE.
segment_filter.idstring (uuid)sí
segment_filter.tenant_idstring (uuid)no
segment_filter.namestringsí
segment_filter.archivedbooleansí
segment_filter.versionintegersíLa versión vigente.
segment_filter.criteriaanysíLos criterios de la versión vigente, en forma canónica (listas ordenadas, sin repetidos).
segment_filter.version_created_atstring (date-time)no
segment_filter.created_atstring (date-time)no
segment_filter.updated_atstring (date-time)no

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"
  }
}

409 — Conflict ​

Transición de estado no válida, conflicto de unicidad, o un asiento que está ocupado/reservado.

json
{
  "error": {
    "code": "conflict",
    "message": "invalid state transition"
  }
}

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)"
  }
}

Archivar un filtro guardado ​

http
DELETE /v1/segment-filters/{id}

Los filtros nunca se borran: una versión a partir de la cual se materializó una lista es evidencia. Archivar libera el nombre para un filtro nuevo y saca el filtro de la lista por defecto; ya no se puede editar. Idempotente. Requiere el alcance de tenant. Con el indicador apagado, 404.

Parámetros

NombreEnTipoObligatorioDescripción
idpathstring (uuid)síUUID del recurso. Los ids mal formados o de otro tenant se leen como 404.

Respuestas

204 ​

El filtro está archivado.

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"
  }
}

Congelar en una lista lo que un filtro guardado selecciona AHORA ​

http
POST /v1/segment-filters/{id}/to-list

Una FOTO (ADR #221, core#1687): las deudas que selecciona la versión MÁS RECIENTE del filtro en este momento se colocan en la lista, y la lista no sigue al filtro después. Solo entran las deudas del tenant; los criterios de Reg F usan la lógica real de Reg F. Idempotente por (list_id, debt_id): repetir la solicitud no añade nada (added: 0) y aun así registra su propia fila de evidencia.

El destino es EXACTAMENTE UNO de list_id (una lista existente del tenant: 200) o new_list_name (una lista creada en la misma solicitud, con nombre único: 201); ninguno o ambos es un 400.

El tope de catálogo del tenant debt_segment_max_rows (por defecto 10 000, nunca por encima del techo de candidatos de Reg F) limita cuántas deudas se escriben; alcanzarlo se indica con truncated: true en la respuesta, nunca en silencio, y entonces la foto cubre solo los candidatos más recientes. Un tope de 0 o menos es 422 y no escribe nada. Un filtro archivado, o una lista list_id archivada, es 409. Un list_id o un filtro que no sea del tenant, o que no sea un UUID, es 404. Una solicitud que falla no deja ninguna lista vacía. Requiere el alcance de tenant (403 para un token de agente). Detrás del indicador debt_segmentation_enabled: apagado, 404 y no se lee ni se escribe nada.

Parámetros

NombreEnTipoObligatorioDescripción
idpathstring (uuid)síUUID del recurso. Los ids mal formados o de otro tenant se leen como 404.

Cuerpo de la petición (JSON, obligatorio)

CampoTipoObligatorioDescripción
list_idstring (uuid)no
new_list_namestringno
json
{
  "new_list_name": "Texas student loans",
  "July photo": null
}

Respuestas

200 ​

La foto se escribió en la lista existente.

CampoTipoObligatorioDescripción
segment_materializationobject (SegmentMaterialization)síLa fila de evidencia de una foto (solo anexa). Las deudas matched fueron seleccionadas (como máximo max_rows), added de ellas eran NUEVAS en la lista y truncated indica que el tope de catálogo recortó el resultado.
segment_materialization.idstring (uuid)sí
segment_materialization.tenant_idstring (uuid)no
segment_materialization.list_idstring (uuid)sí
segment_materialization.filter_idstring (uuid) | nullsíEl filtro guardado, o null cuando los criterios llegaron en línea.
segment_materialization.filter_versioninteger | nullsíLa versión del filtro que se usó, o null cuando fue en línea.
segment_materialization.criteriaanysíLos criterios que se evaluaron, en forma canónica.
segment_materialization.max_rowsintegersíEl tope vigente para esta foto.
segment_materialization.matchedintegersí
segment_materialization.addedintegersí
segment_materialization.truncatedbooleansí
segment_materialization.requested_atstring (date-time)no
debt_listanysíLa lista de destino, con su tamaño contado después de la foto.

201 ​

La lista se creó y la foto se escribió en ella.

CampoTipoObligatorioDescripción
segment_materializationobject (SegmentMaterialization)síLa fila de evidencia de una foto (solo anexa). Las deudas matched fueron seleccionadas (como máximo max_rows), added de ellas eran NUEVAS en la lista y truncated indica que el tope de catálogo recortó el resultado.
segment_materialization.idstring (uuid)sí
segment_materialization.tenant_idstring (uuid)no
segment_materialization.list_idstring (uuid)sí
segment_materialization.filter_idstring (uuid) | nullsíEl filtro guardado, o null cuando los criterios llegaron en línea.
segment_materialization.filter_versioninteger | nullsíLa versión del filtro que se usó, o null cuando fue en línea.
segment_materialization.criteriaanysíLos criterios que se evaluaron, en forma canónica.
segment_materialization.max_rowsintegersíEl tope vigente para esta foto.
segment_materialization.matchedintegersí
segment_materialization.addedintegersí
segment_materialization.truncatedbooleansí
segment_materialization.requested_atstring (date-time)no
debt_listanysíLa lista de destino, con su tamaño contado después de la foto.

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"
  }
}

409 — Conflict ​

Transición de estado no válida, conflicto de unicidad, o un asiento que está ocupado/reservado.

json
{
  "error": {
    "code": "conflict",
    "message": "invalid state transition"
  }
}

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)"
  }
}

Congelar en una lista lo que seleccionan AHORA unos criterios en línea ​

http
POST /v1/segment-filters/to-list

La misma foto que POST /v1/segment-filters/{id}/to-list, con los criterios en el cuerpo en lugar de un filtro guardado (la fila de evidencia entonces no tiene filter_id). criteria pasa por Dialer.Debts.Segment: un valor fuera del vocabulario cerrado, una clave de PII o algo que no sea un objeto es un 400, y no se escribe nada. Un objeto vacío es la cartera completa, aun así acotada por el tope. Destino, tope, alcance e indicador como en la forma con filtro guardado.

Cuerpo de la petición (JSON, obligatorio)

CampoTipoObligatorioDescripción
criteriaobject (SegmentCriteria)síCriterios que aceptan las escrituras de segment-filter y las rutas to-list (Dialer.Debts.Segment, ADR #221). Un vocabulario cerrado, combinado con AND; un objeto vacío es toda la cartera. state, debt_type, us_state y regf_status admiten un valor o una lista (siempre se devuelven como lista ordenada sin repetidos). phone, consumer_ref, external_ref y debtor_name se rechazan por su nombre.
criteria.campaign_idstring (uuid)no
criteria.stateopen · in_collection · promise_to_pay · paid · settled · disputed · closed | arreglo de open · in_collection · promise_to_pay · paid · settled · disputed · closedno
criteria.debt_typeother · student_loan | arreglo de other · student_loanno
criteria.us_statestring | arreglo de stringno
criteria.regf_statusok · blocked_7in7 · blocked_post_contact · undecidable | arreglo de ok · blocked_7in7 · blocked_post_contact · undecidablenoCriterio de ADR #221: elegibilidad Reg F vigente derivada por el servidor.
criteria.min_amount_centsintegerno
criteria.max_amount_centsintegerno
criteria.min_age_daysintegernoCriterio de ADR #221: en mora durante al menos este número de días (debts.delinquent_since frente a hoy); una deuda sin delinquent_since nunca coincide.
criteria.max_age_daysintegernoCriterio de ADR #221: en mora durante como máximo este número de días (debts.delinquent_since frente a hoy); una deuda sin delinquent_since nunca coincide. Se rechaza un min_age_days superior a max_age_days.
list_idstring (uuid)no
new_list_namestringno
json
{
  "criteria": {
    "debt_type": [
      "student_loan"
    ],
    "us_state": [
      "TX"
    ]
  },
  "list_id": "6f1c2a52-3b52-4b3d-9d57-0e5c6a8f1a10"
}

Respuestas

200 ​

La foto se escribió en la lista existente.

CampoTipoObligatorioDescripción
segment_materializationobject (SegmentMaterialization)síLa fila de evidencia de una foto (solo anexa). Las deudas matched fueron seleccionadas (como máximo max_rows), added de ellas eran NUEVAS en la lista y truncated indica que el tope de catálogo recortó el resultado.
segment_materialization.idstring (uuid)sí
segment_materialization.tenant_idstring (uuid)no
segment_materialization.list_idstring (uuid)sí
segment_materialization.filter_idstring (uuid) | nullsíEl filtro guardado, o null cuando los criterios llegaron en línea.
segment_materialization.filter_versioninteger | nullsíLa versión del filtro que se usó, o null cuando fue en línea.
segment_materialization.criteriaanysíLos criterios que se evaluaron, en forma canónica.
segment_materialization.max_rowsintegersíEl tope vigente para esta foto.
segment_materialization.matchedintegersí
segment_materialization.addedintegersí
segment_materialization.truncatedbooleansí
segment_materialization.requested_atstring (date-time)no
debt_listanysíLa lista de destino, con su tamaño contado después de la foto.

201 ​

La lista se creó y la foto se escribió en ella.

CampoTipoObligatorioDescripción
segment_materializationobject (SegmentMaterialization)síLa fila de evidencia de una foto (solo anexa). Las deudas matched fueron seleccionadas (como máximo max_rows), added de ellas eran NUEVAS en la lista y truncated indica que el tope de catálogo recortó el resultado.
segment_materialization.idstring (uuid)sí
segment_materialization.tenant_idstring (uuid)no
segment_materialization.list_idstring (uuid)sí
segment_materialization.filter_idstring (uuid) | nullsíEl filtro guardado, o null cuando los criterios llegaron en línea.
segment_materialization.filter_versioninteger | nullsíLa versión del filtro que se usó, o null cuando fue en línea.
segment_materialization.criteriaanysíLos criterios que se evaluaron, en forma canónica.
segment_materialization.max_rowsintegersíEl tope vigente para esta foto.
segment_materialization.matchedintegersí
segment_materialization.addedintegersí
segment_materialization.truncatedbooleansí
segment_materialization.requested_atstring (date-time)no
debt_listanysíLa lista de destino, con su tamaño contado después de la foto.

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"
  }
}

409 — Conflict ​

Transición de estado no válida, conflicto de unicidad, o un asiento que está ocupado/reservado.

json
{
  "error": {
    "code": "conflict",
    "message": "invalid state transition"
  }
}

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)"
  }
}

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