Saltar al contenido

API de Grupos de Control

Un grupo de control es una parte de los usuarios de una aplicación que se mantiene al margen y que nunca recibe mensajes de marketing, de modo que el efecto de los mensajes se puede medir en comparación con él. Esta API gestiona los grupos de control y responde a la membresía por usuario. Úsela para replicar las acciones de Configuración > Grupos de control del Panel de Control desde sus propios sistemas, o para verificar si ciertos ID de usuario están excluidos antes de un envío o una importación.

https://rpc-api.svc-nue.pushwoosh.com

Todos los endpoints se sirven a través de HTTPS. Las solicitudes y respuestas usan application/json a menos que se indique lo contrario.

Autenticación

Anchor link to

Cada solicitud debe incluir un encabezado Authorization con su token de la API del servidor:

Authorization: Api SU_TOKEN_API

Convenciones

Anchor link to
  • Nomenclatura de campos: los cuerpos de las solicitudes y los parámetros de consulta/ruta aceptan lowerCamelCase (por ejemplo, controlGroupCode, userIds), y el servidor decodifica cualquiera de los dos casos. Las respuestas siempre se codifican usando los nombres de campo de proto, en snake_case (application_id, in_control_group, etc.). Los ejemplos de respuesta y la referencia del objeto de Grupo de control a continuación usan ese caso.
  • code: cada respuesta de grupo de control lleva su propio código, generado en Create. Pase este código como controlGroupCode a Get, UpdatePercentage, UpdateCountries, Rename, Disable, Reshuffle, ForceUpdateCalculation, GetCalculationStatus, GetAnalytics y CheckControlGroupMembership.
  • Varios grupos: una aplicación puede tener varios grupos de control. Cada grupo activado excluye usuarios de todos los envíos de marketing dentro de sus propios países y su tag, con independencia de los demás grupos, y los grupos pueden solaparse. Un envío no selecciona un grupo. El grupo con un name vacío es el grupo original de la aplicación y funciona de la misma manera.

Respuestas de error

Anchor link to
Estado HTTPSignificado
400 Bad RequestArgumento no válido, como percentage fuera de 1–20, userIds vacío o con más de 1,000 entradas, un código de país no reconocido, scopeValues definido sin scopeTag, scopeTag que nombra un tag que la cuenta no tiene, o una entrada de scopeValues que UpdateSettings rechaza (véase más abajo). También devuelto (como un FailedPrecondition en la transmisión) por UpdatePercentage, UpdateCountries, UpdateSettings, Disable, Reshuffle y Delete en un grupo de control que pertenece a la exclusión propia de una campaña, según la precaución a continuación. Reshuffle por sí solo también se niega de esta manera en un grupo deshabilitado (percentage 0).
401 UnauthorizedEncabezado Authorization faltante o no válido.
403 ForbiddenLa aplicación o el grupo de control no pertenecen a la cuenta del solicitante.
404 Not FoundNo se encontró el grupo de control o la aplicación.
409 ConflictCreate usó un name que ya existe en la aplicación.
500 Internal Server ErrorFalla inesperada del lado del servidor.
MétodoRutaDescripción
GET/api/applications/{code}/control_groupsListar los grupos de control de una aplicación
POST/api/applications/{code}/control_groupsCrear un grupo de control
GET/api/applications/{code}/control_groups/{control_group_code}Obtener un único grupo de control
POST/api/applications/{code}/control_groups/{control_group_code}Redimensionar un grupo de control
POST/api/applications/{code}/control_groups/{control_group_code}/countriesReajustar el alcance de un grupo de control a un conjunto de países
POST/api/applications/{code}/control_groups/{control_group_code}/settingsAplicar tamaño, alcance por país y tag, y modo de vida útil en una sola llamada
POST/api/applications/{code}/control_groups/{control_group_code}/display_nameRenombrar un grupo de control
POST/api/applications/{code}/control_groups/{control_group_code}/disableDesactivar un grupo de control
POST/api/applications/{code}/control_groups/{control_group_code}/reshuffleReorganizar un grupo de control
POST/api/applications/{code}/control_groups/{control_group_code}/recalculateForzar el recálculo del tamaño de un grupo de control
GET/api/applications/{code}/control_groups/{control_group_code}/calculation_statusSondear un cálculo de tamaño en ejecución
GET/api/applications/{code}/control_groups/{control_group_code}/analyticsObtener analíticas de Control vs. Tratamiento
GET/api/applications/{code}/control_groups/{control_group_code}/cyclesListar los ciclos cerrados del grupo
POST/api/applications/{code}/control_groups/{control_group_code}/membershipVerificar la membresía para un lote de ID de usuario
DELETE/api/applications/{code}/control_groups/{control_group_code}Eliminar un grupo de control

Lista todos los grupos de control configurados para una aplicación, primero el original sin nombre.

GET /api/applications/{code}/control_groups

Parámetros de ruta

Anchor link to
ParámetroTipoDescripción
codestringEl código de la aplicación para la cual listar los grupos de control.
CampoTipoDescripción
control_groupsarray de objetos de Grupo de controlCada grupo de control configurado para la aplicación.

Crea un grupo de control con nombre para una aplicación y lo devuelve con su código generado. El nuevo grupo excluye usuarios de todos los envíos de marketing dentro de sus propios países y su tag, junto con los demás grupos activados de la aplicación.

POST /api/applications/{code}/control_groups

Cuerpo de la solicitud

Anchor link to
ParámetroTipoRequeridoDescripción
codestringSíEl código de la aplicación en la que se creará el grupo.
namestringSíNombre del grupo, hasta 64 caracteres y sin dos puntos. Debe ser único dentro de la aplicación. Forma parte de la clave de membresía, por lo que nunca cambia.
percentageintegerSíTamaño de la exclusión como porcentaje, 1–20.
segmentstringNoExpresión Seglang para medir el grupo. Omita para medir sobre toda la base.
countriesarray de stringsNoCódigos de país ISO-3166-1 alfa-2 en minúsculas para limitar el alcance de la exclusión. Omita para todos los países. Los códigos no distinguen entre mayúsculas y minúsculas en la entrada.
scopeTagstringNoUn tag de tipo string o boolean al que limitar la exclusión, combinado con countries mediante AND. Omita para no limitar por tag. Véase Alcance por tag más abajo.
scopeValuesarray de stringsVéase la notaValores de scopeTag que incluyen a un usuario en el alcance. Obligatorio si scopeTag está definido, y debe estar vacío en caso contrario.
displayNamestringNoNombre que muestra el Panel de Control, hasta 64 caracteres. Omita para mostrar name.
Ejemplo de solicitud
Anchor link to
{
"code": "XXXXX-XXXXX",
"name": "Q3 holdout",
"percentage": 10
}

Devuelve { "group": { ... } }, el nuevo objeto de Grupo de control.

Devuelve un grupo de control por su código, con su tamaño de exclusión, generación y los recuentos de usuarios detrás de él.

GET /api/applications/{code}/control_groups/{control_group_code}

Parámetros de ruta

Anchor link to
ParámetroTipoDescripción
codestringEl código de la aplicación a la que pertenece el grupo.
control_group_codestringEl código del grupo de control.
CampoTipoDescripción
groupobjeto de Grupo de controlEl grupo de control solicitado.
total_usersintegerTodos los usuarios en la aplicación.
control_group_usersintegerUsuarios actualmente excluidos.
calculation_statusstringTASK_STATUS_NOT_STARTED, TASK_STATUS_IN_PROGRESS o TASK_STATUS_COMPLETED.
has_databooleanSi los números de tamaño en caché ya están disponibles.

UpdatePercentage

Anchor link to

Establece el porcentaje de exclusión (1–20) de un grupo de control. Al redimensionar se mantiene a cada miembro existente: la exclusión crece o se reduce a su alrededor en lugar de ser rediseñada. Reemplazado por UpdateSettings, que aplica tamaño, alcance y modo de vida útil en una sola llamada, pero sigue siendo compatible.

POST /api/applications/{code}/control_groups/{control_group_code}

Cuerpo de la solicitud

Anchor link to
ParámetroTipoRequeridoDescripción
percentageintegerSíNuevo tamaño de exclusión como porcentaje, 1–20.

Un objeto vacío en caso de éxito: {}.

UpdateCountries

Anchor link to

Establece los países a los que se limita un grupo de control. Cambiar el alcance reinicia la medición del uplift, porque la población que se compara cambia. La exclusión en sí no se rediseña. Reemplazado por UpdateSettings, que también define un alcance por tag, pero sigue siendo compatible.

POST /api/applications/{code}/control_groups/{control_group_code}/countries

Cuerpo de la solicitud

Anchor link to
ParámetroTipoRequeridoDescripción
countriesarray de stringsSíCódigos de país ISO-3166-1 alfa-2 en minúsculas. Una lista vacía amplía el grupo de nuevo a todos los países. Los códigos no distinguen entre mayúsculas y minúsculas en la entrada.
Ejemplo de solicitud
Anchor link to
{
"countries": ["us", "ca", "gb"]
}

Un objeto vacío en caso de éxito: {}.

UpdateSettings

Anchor link to

Aplica el tamaño, el alcance por país y tag, y el modo de vida útil de un grupo de control en una sola llamada. Un cambio que altera a quién se excluye o durante cuánto tiempo (tamaño, alcance, modo, período de renovación o fecha de fin) cierra el ciclo en curso e inicia uno nuevo. Enviar los valores actuales no cambia nada. Rechaza un grupo de control que pertenece a la exclusión propia de una campaña, igual que UpdatePercentage.

POST /api/applications/{code}/control_groups/{control_group_code}/settings

Cuerpo de la solicitud

Anchor link to
ParámetroTipoRequeridoDescripción
percentageintegerSíTamaño de la exclusión como porcentaje, 1–20.
countriesarray de stringsNoCódigos de país ISO-3166-1 alfa-2 en minúsculas. Una lista vacía amplía el grupo de nuevo a todos los países.
scopeTagstringNoUn tag de tipo string o boolean al que limitar la exclusión, combinado con countries mediante AND. Vacío elimina el alcance por tag. Véase Alcance por tag más abajo.
scopeValuesarray de stringsVéase la notaValores de scopeTag que incluyen a un usuario en el alcance. Obligatorio si scopeTag está definido, y debe estar vacío en caso contrario.
modestringNoVida útil de la membresía: CONTROL_GROUP_MODE_PERMANENT (predeterminado), CONTROL_GROUP_MODE_AUTO_REFRESH o CONTROL_GROUP_MODE_EXPERIMENT.
refreshPeriodDaysintegerVéase la notaDías entre redistribuciones, 7–365. Obligatorio con CONTROL_GROUP_MODE_AUTO_REFRESH, y debe omitirse en caso contrario.
endsAtstring (RFC 3339)Véase la notaCuándo se desactiva un experimento, con al menos 30 días de antelación. Obligatorio con CONTROL_GROUP_MODE_EXPERIMENT, y debe omitirse en caso contrario.

Cada campo se aplica tal como se envía, igual que en UpdateCountries: un countries vacío amplía el grupo de nuevo a todos los países, y un scopeTag vacío elimina el alcance por tag.

Devuelve { "group": { ... } }, el objeto de Grupo de control actualizado.

Alcance por tag

Anchor link to

Un grupo de control puede excluir solo a los usuarios cuyo valor de un tag de tipo string o boolean esté en un conjunto que usted elija, combinado con countries mediante AND si se definen ambos. Defínalo con Create o UpdateSettings.

  • scopeTag nombra el tag; vacío significa que no hay alcance por tag. No puede ser Country: el alcance por país usa countries, no un tag.
  • scopeValues enumera qué valores de scopeTag están en el alcance. Se requiere al menos uno cuando scopeTag está definido, y ninguno puede repetirse. Los valores de un tag de tipo string no pueden ser cadenas vacías. Cada valor de un tag de tipo boolean debe ser "true" o "false".
  • Un dispositivo sin valor para scopeTag queda fuera del alcance, igual que un dispositivo sin el tag Country.
  • La membresía en sí no cambia: la fórmula que asigna a los usuarios no se ve afectada por el alcance. El alcance por tag y por país son ambos una comprobación por dispositivo sobre ella, que acota cuáles de los dispositivos de un usuario seleccionado se excluyen realmente, no a quién selecciona la fórmula.
  • Un tag a nivel de usuario se copia en cada uno de los dispositivos de ese usuario cuando se define, por lo que la comprobación a nivel de dispositivo anterior también cubre los tags a nivel de usuario, no solo los de dispositivo.
  • Cambiar scopeTag, o cambiar scopeValues como conjunto (reordenar por sí solo no cuenta), cierra el ciclo en curso con CONTROL_GROUP_CYCLE_CLOSE_REASON_RESCOPED, igual que cambiar countries. Desactivar un grupo conserva su alcance por tag, igual que ya conserva countries.

Define el nombre que el Panel de Control muestra para un grupo de control. name forma parte de la clave de membresía y no cambia, por lo que el grupo conserva los mismos usuarios y su ciclo en curso.

POST /api/applications/{code}/control_groups/{control_group_code}/display_name

Cuerpo de la solicitud

Anchor link to
ParámetroTipoRequeridoDescripción
codestringSíEl código de la aplicación a la que pertenece el grupo.
controlGroupCodestringSíEl código del grupo de control.
displayNamestringNoNuevo nombre, hasta 64 caracteres y único dentro de la aplicación. Envíe una cadena vacía para volver a mostrar name.

Devuelve { "group": { ... } }, el objeto de Grupo de control renombrado.

Desactivar

Anchor link to

Desactiva un grupo de control, manteniéndolo a él y a su generación para que al volver a activarlo se restaure la misma exclusión en lugar de crear una nueva.

POST /api/applications/{code}/control_groups/{control_group_code}/disable

Un objeto vacío en caso de éxito: {}.

Reorganizar

Anchor link to

Rediseña la exclusión de un grupo de control incrementando su generación. Esta es la única forma de obtener una muestra diferente: la membresía es determinista, por lo que desactivar y volver a activar reproduce exactamente la misma.

POST /api/applications/{code}/control_groups/{control_group_code}/reshuffle

CampoTipoDescripción
generationintegerLa generación del grupo después de la reorganización.

ForceUpdateCalculation

Anchor link to

Inicia un nuevo recuento del tamaño de un grupo de control. Los números previamente almacenados en caché continúan sirviéndose hasta que finalice el nuevo recuento. Sondee GetCalculationStatus para ver el progreso.

POST /api/applications/{code}/control_groups/{control_group_code}/recalculate

Un objeto vacío en caso de éxito: {}.

GetCalculationStatus

Anchor link to

Sondea solo los recuentos de usuarios cambiantes de un grupo de control mientras se ejecuta un cálculo de tamaño.

GET /api/applications/{code}/control_groups/{control_group_code}/calculation_status

CampoTipoDescripción
total_usersintegerTodos los usuarios en la aplicación.
control_group_usersintegerUsuarios excluidos, contados sobre la aplicación.
calculation_statusstringTASK_STATUS_NOT_STARTED, TASK_STATUS_IN_PROGRESS o TASK_STATUS_COMPLETED.
has_databooleanSi los números de tamaño en caché están disponibles.

GetAnalytics

Anchor link to

Devuelve las analíticas precalculadas de Control vs. Tratamiento para un grupo de control.

GET /api/applications/{code}/control_groups/{control_group_code}/analytics

Parámetros de consulta

Anchor link to
ParámetroTipoRequeridoDescripción
windowDaysstringNoPreajuste de la ventana de retrospectiva: WINDOW_DAYS_3, WINDOW_DAYS_7 o WINDOW_DAYS_30.
CampoTipoDescripción
eventsarray de objetosUna entrada por evento rastreado, cada una con event, treatment y control (users, conversions, conversion_rate, events_per_user), uplift_pct, incremental_events, percent_of_treatment, z_score, p_value, confidence_pct y significance (SIGNIFICANCE_NOT_ENOUGH_DATA, SIGNIFICANCE_NOT_SIGNIFICANT o SIGNIFICANCE_SIGNIFICANT).

ListControlGroupCycles

Anchor link to

Lista los ciclos cerrados de un grupo de control, del más reciente al más antiguo. Cada ciclo es la membresía con la que funcionó el grupo entre dos cambios de ajustes, junto con los ajustes a partir de los cuales se generó. El ciclo en curso (actual) no está en esta lista. Sus ajustes están en el propio objeto de Grupo de control.

GET /api/applications/{code}/control_groups/{control_group_code}/cycles

CampoTipoDescripción
cyclesarray de objetos de ciclo de grupo de controlDel más reciente al más antiguo.

Objeto de ciclo de grupo de control

Anchor link to
CampoTipoDescripción
cycle_numberintegerSecuencial dentro del grupo; el cycle_number del propio grupo es el siguiente al último cerrado aquí.
modestringModo de vida útil con el que funcionó el grupo durante este ciclo: CONTROL_GROUP_MODE_PERMANENT, CONTROL_GROUP_MODE_AUTO_REFRESH o CONTROL_GROUP_MODE_EXPERIMENT.
generationintegerLa generación del grupo durante este ciclo.
percentageintegerTamaño de la exclusión durante este ciclo.
countriesarray de stringsAlcance por país durante este ciclo; vacío es todos los países.
started_at / ended_atstring (RFC 3339)Cuándo estuvo activo este ciclo.
close_reasonstringPor qué terminó el ciclo: CONTROL_GROUP_CYCLE_CLOSE_REASON_ROLLOVER, _EXPIRED, _RESHUFFLED, _RESIZED, _RESCOPED, _MODE_CHANGED o _DISABLED.
scope_tagstringTag al que se limitó la exclusión del ciclo, combinado con countries mediante AND. Vacío si no hay alcance por tag y en todos los ciclos cerrados antes de que existiera el alcance por tag, incluso si el grupo lo tuvo después.
scope_valuesarray de stringsValores de scope_tag que incluyeron a un usuario en el alcance durante este ciclo; solo se define junto con scope_tag.

CheckControlGroupMembership

Anchor link to

Informa para cada ID de usuario si está excluido por un grupo de control en este momento. La membresía se calcula solo a partir del ID. No se lee ningún registro de usuario, por lo que también se responde a un ID que la aplicación nunca ha visto, y un grupo desactivado responde false para cada ID en lugar de un error. Un grupo con alcance por país o por tag excluye a un usuario solo si alguno de sus dispositivos está en ese alcance, por lo que un ID no visto (sin ningún dispositivo) devuelve false ahí, aunque el mismo ID devolvería true en un grupo sin alcance. Use esto en lugar de exportar todo el grupo para verificar los usuarios de un envío o importación específicos.

POST /api/applications/{code}/control_groups/{control_group_code}/membership

Cuerpo de la solicitud

Anchor link to
ParámetroTipoRequeridoDescripción
userIdsarray de stringsSíID de usuario a verificar, como máximo 1,000 por llamada.
Ejemplo de solicitud
Anchor link to
{
"userIds": ["user-1", "user-2", "user-3"]
}
CampoTipoDescripción
usersarray de objetosUna entrada por cada ID solicitado, en el orden en que se dieron (duplicados incluidos). Cada uno tiene user_id (string) y in_control_group (boolean).
Ejemplo de respuesta
Anchor link to
{
"users": [
{ "user_id": "user-1", "in_control_group": false },
{ "user_id": "user-2", "in_control_group": true },
{ "user_id": "user-3", "in_control_group": false }
]
}

Elimina un grupo de control por completo. Deja de excluir usuarios y ya no se pueden abrir sus estadísticas. Los demás grupos de la aplicación siguen funcionando.

DELETE /api/applications/{code}/control_groups/{control_group_code}

Un objeto vacío en caso de éxito: {}.

Objeto de grupo de control

Anchor link to
CampoTipoDescripción
codestringCódigo del grupo de control (formato XXXXX-XXXXX), estable durante la vida del grupo.
namestringNombre del grupo, parte de la clave de membresía. Vacío es el grupo original, sin nombre, de la aplicación.
display_namestringNombre que muestra el Panel de Control. Vacío muestra name, y el grupo sin nombre se muestra como Global.
segmentstringExpresión Seglang sobre la que se mide el grupo; vacío es toda la base.
percentageintegerTamaño de la exclusión como porcentaje, 1–20. Cero significa que el grupo está desactivado.
enabledbooleanSi el grupo está actualmente excluyendo usuarios.
generationintegerIncrementado por cada reorganización; 0 significa que nunca se ha reorganizado.
last_modified_atstring (RFC 3339)Cuándo se cambiaron por última vez los ajustes del grupo.
last_modified_bystringCorreo electrónico del usuario que cambió el grupo por última vez.
application_idintegerID numérico de la aplicación, la primera parte de la clave de membresía <application_id>:<generation>:<name>:<user_id> que CheckControlGroupMembership hashea para decidir si un usuario está excluido.
countriesarray de stringsCódigos de país ISO-3166-1 alfa-2 en minúsculas a los que se limita la exclusión. Vacío es todos los países.
scope_tagstringTag al que se limita la exclusión, combinado con countries mediante AND; vacío es sin alcance por tag. Véase Alcance por tag.
scope_valuesarray de stringsValores de scope_tag que incluyen a un usuario en el alcance; un tag de tipo boolean usa "true" y "false".

Relacionado

Anchor link to