Saltar al contenido

API de feature flags

Un feature flag es un interruptor remoto con propiedades que el SDK lee para cada dispositivo. Esta API gestiona los flags de una aplicación: las mismas operaciones que Audience → Feature Flags en el Panel de Control. Para leer flags en un sitio web o en una aplicación móvil, use el Web SDK, el Android SDK o el iOS SDK.

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

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

Autenticación

Anchor link to

Cada solicitud debe incluir un encabezado Authorization con su Token de API de servidor:

Authorization: Api YOUR_API_TOKEN

Leer flags requiere acceso a la aplicación. Crearlos y modificarlos requiere el derecho de gestionarla.

Convenciones

Anchor link to
  • Nomenclatura de campos: los cuerpos de las solicitudes aceptan lowerCamelCase o snake_case. Las respuestas usan snake_case, como en el Objeto feature flag.
  • Los porcentajes se expresan en puntos básicos: percent_bp de 0 a 10000, donde 2000 es el 20 %.
  • Versiones: cada flag tiene una version. Update, SetRulePercent y Reshuffle reciben la versión que leyó por última vez y fallan con VERSION_CONFLICT cuando el flag ha cambiado desde entonces, de modo que las ediciones simultáneas nunca se sobrescriben entre sí. Vuelva a leer el flag y reintente.
  • Estados: active, killed o archived. Kill, Unkill, Archive y Restore solo cambian el estado y no reciben versión.

Cada endpoint REST tiene una herramienta MCP con los mismos parámetros:

MétodoRutaDescripciónHerramienta MCP
GET/api/applications/{application_code}/feature_flagsListar los flags de la aplicaciónlist_feature_flags
GET/api/applications/{application_code}/feature_flags/{key}Obtener un flagget_feature_flag
POST/api/applications/{application_code}/feature_flagsCrear un flagcreate_feature_flag
POST/api/applications/{application_code}/feature_flags/{key}Reemplazar nombre, descripción, propiedades y reglasupdate_feature_flag
POST/api/applications/{application_code}/feature_flags/{key}/rules/{rule_id}/percentCambiar el despliegue de una reglaset_feature_flag_rule_percent
POST/api/applications/{application_code}/feature_flags/{key}/killDesactivar el flag para todoskill_feature_flag
POST/api/applications/{application_code}/feature_flags/{key}/unkillVolver a activar un flag desactivadounkill_feature_flag
POST/api/applications/{application_code}/feature_flags/{key}/archiveArchivar un flagarchive_feature_flag
POST/api/applications/{application_code}/feature_flags/{key}/restoreRestaurar un flag archivadorestore_feature_flag
POST/api/applications/{application_code}/feature_flags/{key}/reshuffleElegir una nueva muestra de usuariosreshuffle_feature_flag
GET/api/applications/{application_code}/feature_flags/{key}/historyListar los cambios de un flaglist_feature_flag_history

Todos los endpoints, excepto List y History, devuelven { "flag": { ... } }, el Objeto feature flag tras la operación.

GET /api/applications/{application_code}/feature_flags

La solicitud recibe estos parámetros:

ParámetroUbicaciónTipoDescripción
application_codepathstringEl código de aplicación.
statusquerystringOpcional. active, killed o archived. Omítalo para listar todos los flags.

Devuelve { "flags": [ ... ] }, un array de Objetos feature flag.

GET /api/applications/{application_code}/feature_flags/{key}

Devuelve un flag con sus propiedades, reglas y version actual.

Crea un flag activo. El servidor genera el rule_id de cada regla.

POST /api/applications/{application_code}/feature_flags

El cuerpo de la solicitud tiene estos campos:

ParámetroTipoRequeridoDescripción
keystringSíCoincide con ^[A-Za-z0-9_.-]{1,58}$. Única en la aplicación, incluidos los flags archivados, y comparada sin distinguir mayúsculas de minúsculas. No se puede cambiar después.
namestringNoNombre visible, hasta 255 caracteres.
descriptionstringNoDescripción.
propertiesarray de Objetos propiedadNoHasta 50 propiedades.
defaultsobjectSí, si hay propiedadesEl valor de cada propiedad para los dispositivos en los que el flag está desactivado, indexado por la clave de la propiedad. Cada valor debe coincidir con el tipo de la propiedad.
rulesarray de Objetos reglaNoReglas ordenadas, hasta 10. Decide la primera regla cuyo segmento coincide con el dispositivo.
Ejemplo de solicitud
Anchor link to
{
"key": "new_checkout",
"name": "New checkout",
"properties": [
{ "key": "button_color", "type": "string" },
{ "key": "show_apple_pay", "type": "boolean" }
],
"defaults": { "button_color": "blue", "show_apple_pay": false },
"rules": [
{
"name": "Beta testers",
"filter_code": "XXXXX-XXXXX",
"percent_bp": 10000,
"overrides": { "button_color": "green", "show_apple_pay": true }
},
{
"name": "Everyone else",
"filter_code": "",
"percent_bp": 2000,
"overrides": { "button_color": "orange" }
}
]
}

Actualizar

Anchor link to

Reemplaza el nombre, la descripción, las propiedades, los valores predeterminados y las reglas de un flag. El estado nunca cambia aquí. Envíe todos los campos, no solo los modificados.

POST /api/applications/{application_code}/feature_flags/{key}

Recibe el mismo cuerpo que Crear sin key, más la version de su última lectura. Conserve el rule_id de cada regla existente. Una regla sin rule_id se crea como nueva. El tipo de una propiedad no puede cambiar después de crear la propiedad.

SetRulePercent

Anchor link to

Cambia el despliegue de una regla. Los usuarios que ya tienen el flag lo conservan cuando el porcentaje aumenta.

POST /api/applications/{application_code}/feature_flags/{key}/rules/{rule_id}/percent

{ "percentBp": 5000, "version": 3 }

Kill y Unkill

Anchor link to

POST .../feature_flags/{key}/kill desactiva el flag para todos los dispositivos, que entonces reciben los valores predeterminados de las propiedades. Las reglas y las propiedades se conservan.

POST .../feature_flags/{key}/unkill vuelve a activar un flag desactivado con sus reglas tal como estaban.

Ambos reciben un cuerpo vacío {}.

Archivar y restaurar

Anchor link to

POST .../feature_flags/{key}/archive deja de enviar el flag a los dispositivos. Un flag archivado no cuenta para el límite de flags por aplicación del plan, y su clave sigue reservada.

POST .../feature_flags/{key}/restore recupera un flag archivado como killed, de modo que nunca se activa por sí solo. Llame a unkill para desplegarlo de nuevo.

Ambos reciben un cuerpo vacío {}.

Redistribuir

Anchor link to

Coloca a cada usuario en un nuevo bucket, de modo que los mismos porcentajes seleccionan una muestra de usuarios diferente. Algunos usuarios que tienen el flag activado lo pierden y otros lo obtienen.

POST /api/applications/{application_code}/feature_flags/{key}/reshuffle

{ "confirm": true, "version": 3 }

confirm debe ser true. De lo contrario, la solicitud falla con CONFIRM_REQUIRED.

Devuelve los cambios de un flag, del más reciente al más antiguo: quién hizo cada cambio, cuándo y qué campos cambiaron. Al igual que Get, requiere acceso a la aplicación y devuelve 404 cuando la aplicación o el flag no existen.

GET /api/applications/{application_code}/feature_flags/{key}/history

La solicitud recibe estos parámetros:

ParámetroUbicaciónTipoDescripción
application_codepathstringEl código de aplicación.
keypathstringLa clave del flag.
pagequeryintegerOpcional. Número de página, empezando por 0.
per_pagequeryintegerOpcional. Entradas por página, 20 de forma predeterminada, hasta 100.

Devuelve { "entries": [ ... ], "total": N }, donde total es el número de entradas en todas las páginas. Cada entrada tiene estos campos:

CampoTipoDescripción
versionintegerLa versión del flag que produjo este cambio.
actionstringcreate, update, set_percent, kill, unkill, archive, restore o reshuffle.
user_idstringEl ID del usuario del Panel de Control que hizo el cambio. 0 para un cambio hecho con un token de API o por un servicio de Pushwoosh.
user_emailstringEl email de ese usuario. Vacío cuando el usuario se eliminó o user_id es 0.
by_api_tokenbooleantrue cuando el cambio se hizo con un token de API. false para un cambio hecho por un usuario o por un servicio de Pushwoosh.
api_token_namestringEl nombre que tenía el token de API en el momento del cambio. Se conserva después de eliminar el token. Vacío cuando el token no tiene nombre o by_api_token es false.
createdstringHora del cambio, RFC 3339.
flagObjeto feature flagEl flag después del cambio.
changesarrayLos campos que difieren de la versión anterior. Vacío para create y reshuffle, y para la entrada más antigua de un flag creado antes de que se registrara el historial, porque no hay una versión anterior con la que compararla.

Cada elemento de changes tiene field, before y after. before y after contienen los valores codificados como cadenas JSON, por lo que un valor de tipo string aparece entre comillas. field toma estos valores:

fieldQué cambió
name, description, statusEl campo del flag con este nombre.
propertiesLas propiedades y sus valores predeterminados.
rules[<rule_id>]Una regla. Para una regla añadida, before está vacío. Para una regla eliminada, after está vacío.
rules.orderEl orden de las reglas.
Ejemplo de respuesta
Anchor link to
{
"entries": [
{
"version": 4,
"action": "set_percent",
"user_id": "12345",
"user_email": "owner@example.com",
"by_api_token": false,
"api_token_name": "",
"created": "2026-10-14T09:30:00Z",
"flag": { "key": "new_checkout", "status": "active", "version": 4 },
"changes": [
{
"field": "rules[r_1a2b3c4d]",
"before": "{\"rule_id\":\"r_1a2b3c4d\",\"name\":\"Beta testers\",\"filter_code\":\"XXXXX-XXXXX\",\"percent_bp\":2000,\"overrides\":{\"button_color\":\"green\"}}",
"after": "{\"rule_id\":\"r_1a2b3c4d\",\"name\":\"Beta testers\",\"filter_code\":\"XXXXX-XXXXX\",\"percent_bp\":5000,\"overrides\":{\"button_color\":\"green\"}}"
}
]
}
],
"total": 4
}

El objeto flag del ejemplo está abreviado. El historial se registra para los cambios a partir del 13 de octubre de 2026. Un flag sin cambios registrados no devuelve entradas.

Leer flags para un dispositivo

Anchor link to

Los SDK leen los flags desde un endpoint independiente. No necesita llamarlo cuando usa el Web SDK, el Android SDK o el iOS SDK, porque eligen el host y almacenan la respuesta en caché por sí mismos.

POST https://api.pushwoosh.com/api/v2/device-api/getFeatureFlags

El cuerpo de la solicitud tiene estos campos:

CampoTipoDescripción
applicationstringEl código de aplicación.
hwidstringEl HWID del dispositivo.
etagstringOpcional. El etag de la última respuesta que tiene el dispositivo.

La respuesta tiene estos campos:

CampoTipoDescripción
flagsobjectFlags indexados por clave de flag. Cada uno tiene enabled, rule_id y properties. rule_id es default cuando ninguna regla coincidió y está vacío para un flag desactivado. Los flags archivados no se incluyen.
etagstringEnvíelo con la siguiente solicitud.
not_modifiedbooleantrue cuando el etag enviado está actualizado. En ese caso se omite flags y el dispositivo conserva su copia.
partialbooleantrue cuando los segmentos del dispositivo no se evaluaron a tiempo. No almacene esta respuesta en caché.

En un plan sin feature flags, la respuesta está vacía.

Objeto feature flag

Anchor link to

Todos los endpoints devuelven el flag con esta estructura:

CampoTipoDescripción
application_codestringLa aplicación a la que pertenece el flag.
keystringLa clave del flag.
namestringNombre visible.
descriptionstringDescripción.
statusstringactive, killed o archived.
propertiesarray de Objetos propiedadLas propiedades del flag.
defaultsobjectEl valor de cada propiedad para los dispositivos en los que el flag está desactivado.
rulesarray de Objetos reglaReglas ordenadas.
versionintegerDevuélvala con Update, SetRulePercent y Reshuffle.
createdstringHora de creación, RFC 3339.
updatedstringHora del último cambio, RFC 3339.
last_modified_by_user_idstringEl usuario del Panel de Control que modificó el flag por última vez. 0 cuando el último cambio se hizo con un token de API o lo hizo un servicio de Pushwoosh.

Objeto propiedad

Anchor link to

Una propiedad describe un valor que el SDK lee del flag:

CampoTipoDescripción
keystringCoincide con ^[A-Za-z0-9_]{1,64}$, única dentro del flag.
typestringstring, number, boolean o json. No puede cambiar una vez que la propiedad existe.

Objeto regla

Anchor link to

Una regla decide quién recibe el flag activado y con qué valores:

CampoTipoDescripción
rule_idstringGenerado por el servidor, r_ seguido de 8 dígitos hexadecimales, y estable entre actualizaciones. Déjelo vacío para una regla nueva.
namestringNombre de la regla.
filter_codestringEl segmento con el que debe coincidir el dispositivo. Vacío coincide con todos los dispositivos. El segmento solo puede contener condiciones de etiqueta, ubicación, aplicación y lista.
percent_bpintegerProporción de usuarios coincidentes para los que el flag está activado, 0–10000. Un dispositivo que coincide con el segmento se detiene en esta regla aunque quede fuera del porcentaje.
overridesobjectValores de propiedades que reemplazan a los predeterminados para los dispositivos en los que esta regla activa el flag, indexados por la clave de la propiedad.

Una solicitud rechazada devuelve uno de estos códigos de estado HTTP:

Estado HTTPSignificado
400 Bad RequestLa solicitud no es válida (field_violations) o el estado del flag o el plan no la permiten (Type). Consulte los formatos del cuerpo y los motivos a continuación.
401 UnauthorizedFalta el encabezado Authorization o el token no es válido.
403 ForbiddenEl token no puede gestionar la aplicación, o la aplicación es del sistema.
404 Not FoundLa aplicación o el flag no existe.
409 ConflictOtra solicitud está modificando el mismo flag en este momento. Reintente la solicitud.
500 Internal Server ErrorFallo inesperado del servidor. El cuerpo es {"message": "Sorry, an unexpected error occurred"}.

Una solicitud no válida devuelve 400 con una lista de infracciones de campo. Cada infracción indica el campo, el motivo y los argumentos del motivo:

{
"code": 3,
"message": "validation failed",
"details": [
{
"@type": "type.googleapis.com/pushwoosh.rpc.errors.v3.BadRequest",
"field_violations": [
{
"field": "key",
"description": "a feature flag with this key already exists in the application",
"reason": "KEY_TAKEN",
"args": { "key": "new_checkout" }
}
]
}
]
}

Una solicitud que el estado del flag o el plan no permiten devuelve 400 con una precondición fallida. Sus campos Type y Description van en mayúscula inicial:

{
"code": 9,
"message": "precondition failed",
"details": [
{
"@type": "type.googleapis.com/pushwoosh.rpc.errors.v3.FailedPrecondition",
"Type": "VERSION_CONFLICT",
"Description": "feature flag was changed: version 3 was sent, the current one is 4"
}
]
}

El reason de una infracción de campo y el Type de una precondición fallida toman estos valores:

MotivoCausa
KEY_INVALIDLa clave no coincide con ^[A-Za-z0-9_.-]{1,58}$.
KEY_TAKENOtro flag de la aplicación, incluidos los archivados, tiene esta clave.
TEXT_INVALIDEl nombre o la descripción son demasiado largos o contienen caracteres prohibidos.
PROPERTIES_LIMITMás de 50 propiedades.
PROPERTY_KEY_INVALIDUna clave de propiedad no es válida o está repetida.
PROPERTY_TYPE_INVALIDUn tipo de propiedad no es string, number, boolean ni json.
PROPERTY_TYPE_IMMUTABLELa solicitud cambia el tipo de una propiedad existente.
VALUE_INVALIDUn valor predeterminado o de anulación falta, no coincide con el tipo de la propiedad o está anidado a más de 5 niveles.
PROPERTIES_TOO_LARGELos valores de las propiedades del flag superan los 10 000 bytes.
RULES_LIMITMás de 10 reglas.
RULE_NOT_FOUNDEl rule_id no es una de las reglas del flag.
PERCENT_INVALIDpercent_bp está fuera de 0–10000.
OVERRIDE_UNKNOWN_PROPERTYUna anulación nombra una propiedad que el flag no tiene.
SEGMENT_NOT_FOUNDEl segmento de la regla no existe o pertenece a otra aplicación.
INVALID_SEGMENT_TYPEEl segmento de la regla tiene una condición que los flags no pueden evaluar: evento, estático, externo, última actualización o mejor hora de envío.
FLAG_DEPENDENCYEl segmento de la regla tiene una condición de feature flag, y un flag no puede depender de otro flag. Lo devuelven Create, Update y Restore, con el código del segmento en filter_code.
CONFIRM_REQUIREDReshuffle se envió sin confirm: true.
TAG_CONFLICTLa cuenta tiene una etiqueta personalizada llamada PW_FF_ seguida de la clave del flag.
FEATURE_FLAGS_NOT_ALLOWEDEl plan de la cuenta no incluye feature flags.
FLAGS_LIMITLa aplicación tiene tantos flags no archivados como permite el plan.
VERSION_CONFLICTEl flag cambió desde la version que envió.
PAYLOAD_TOO_LARGELos flags de la aplicación ocuparían más de 64 KB en la respuesta a un dispositivo.
STATUS_CONFLICTEl estado no permite la operación, por ejemplo, desactivar un flag archivado.