Pular para o conteúdo

API de feature flags

Uma feature flag é um interruptor remoto com propriedades que o SDK lê para cada dispositivo. Esta API gerencia as flags de um aplicativo: as mesmas operações de Audience → Feature Flags no Painel de Controle. Para ler flags em um site ou em um aplicativo móvel, use o Web SDK, o Android SDK ou o iOS SDK.

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

Todos os endpoints são servidos via HTTPS. As solicitações e respostas usam application/json.

Autenticação

Anchor link to

Toda solicitação deve incluir um cabeçalho Authorization com o seu Token de API do Servidor:

Authorization: Api YOUR_API_TOKEN

Ler flags exige acesso ao aplicativo. Criá-las e alterá-las exige o direito de gerenciá-lo.

Convenções

Anchor link to
  • Nomenclatura de campos: os corpos das solicitações aceitam lowerCamelCase ou snake_case. As respostas usam snake_case, como no Objeto feature flag.
  • As porcentagens são expressas em pontos-base: percent_bp de 0 a 10000, em que 2000 equivale a 20%.
  • Versões: toda flag tem uma version. Update, SetRulePercent e Reshuffle recebem a versão que você leu por último e falham com VERSION_CONFLICT quando a flag mudou desde então, para que edições simultâneas nunca sobrescrevam umas às outras. Leia a flag novamente e tente outra vez.
  • Status: active, killed ou archived. Kill, Unkill, Archive e Restore alteram apenas o status e não recebem versão.

Cada endpoint REST tem uma ferramenta MCP com os mesmos parâmetros:

MétodoCaminhoDescriçãoFerramenta MCP
GET/api/applications/{application_code}/feature_flagsListar as flags do aplicativolist_feature_flags
GET/api/applications/{application_code}/feature_flags/{key}Obter uma flagget_feature_flag
POST/api/applications/{application_code}/feature_flagsCriar uma flagcreate_feature_flag
POST/api/applications/{application_code}/feature_flags/{key}Substituir nome, descrição, propriedades e regrasupdate_feature_flag
POST/api/applications/{application_code}/feature_flags/{key}/rules/{rule_id}/percentAlterar o rollout de uma regraset_feature_flag_rule_percent
POST/api/applications/{application_code}/feature_flags/{key}/killDesativar a flag para todoskill_feature_flag
POST/api/applications/{application_code}/feature_flags/{key}/unkillReativar uma flag desativadaunkill_feature_flag
POST/api/applications/{application_code}/feature_flags/{key}/archiveArquivar uma flagarchive_feature_flag
POST/api/applications/{application_code}/feature_flags/{key}/restoreRestaurar uma flag arquivadarestore_feature_flag
POST/api/applications/{application_code}/feature_flags/{key}/reshuffleEscolher uma nova amostra de usuáriosreshuffle_feature_flag
GET/api/applications/{application_code}/feature_flags/{key}/historyListar as alterações de uma flaglist_feature_flag_history

Todos os endpoints, exceto List e History, retornam { "flag": { ... } }, o Objeto feature flag após a operação.

GET /api/applications/{application_code}/feature_flags

A solicitação recebe estes parâmetros:

ParâmetroLocalTipoDescrição
application_codepathstringO código do aplicativo.
statusquerystringOpcional. active, killed ou archived. Omita para listar todas as flags.

Retorna { "flags": [ ... ] }, um array de Objetos feature flag.

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

Retorna uma flag com suas propriedades, regras e version atual.

Cria uma flag ativa. O servidor gera o rule_id de cada regra.

POST /api/applications/{application_code}/feature_flags

O corpo da solicitação tem estes campos:

ParâmetroTipoObrigatórioDescrição
keystringSimCorresponde a ^[A-Za-z0-9_.-]{1,58}$. Única no aplicativo, incluindo flags arquivadas, comparada sem diferenciar maiúsculas de minúsculas. Não pode ser alterada depois.
namestringNãoNome de exibição, até 255 caracteres.
descriptionstringNãoDescrição.
propertiesarray de Objetos propriedadeNãoAté 50 propriedades.
defaultsobjectSim, se houver propriedadesO valor de cada propriedade para os dispositivos em que a flag está desativada, indexado pela chave da propriedade. Cada valor deve corresponder ao tipo da propriedade.
rulesarray de Objetos regraNãoRegras ordenadas, até 10. Decide a primeira regra cujo segmento corresponde ao dispositivo.
Exemplo de solicitação
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" }
}
]
}

Substitui o nome, a descrição, as propriedades, os valores padrão e as regras de uma flag. O status nunca muda aqui. Envie todos os campos, não apenas os alterados.

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

Recebe o mesmo corpo de Criar sem key, mais a version da sua última leitura. Mantenha o rule_id de cada regra existente. Uma regra sem rule_id é criada como nova. O tipo de uma propriedade não pode mudar depois que a propriedade é criada.

SetRulePercent

Anchor link to

Altera o rollout de uma regra. Os usuários que já têm a flag a mantêm quando a porcentagem aumenta.

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

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

Kill e Unkill

Anchor link to

POST .../feature_flags/{key}/kill desativa a flag para todos os dispositivos, que passam a receber os valores padrão das propriedades. As regras e as propriedades são mantidas.

POST .../feature_flags/{key}/unkill reativa uma flag desativada com as regras como estavam.

Ambos recebem um corpo vazio {}.

Arquivar e restaurar

Anchor link to

POST .../feature_flags/{key}/archive deixa de enviar a flag aos dispositivos. Uma flag arquivada não conta para o limite de flags por aplicativo do plano, e sua chave continua reservada.

POST .../feature_flags/{key}/restore traz de volta uma flag arquivada como killed, para que ela nunca seja ativada sozinha. Chame unkill para fazer o rollout dela novamente.

Ambos recebem um corpo vazio {}.

Redistribuir

Anchor link to

Coloca cada usuário em um novo bucket, de modo que as mesmas porcentagens selecionem uma amostra diferente de usuários. Alguns usuários com a flag ativada a perdem, e outros a recebem.

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

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

confirm deve ser true. Caso contrário, a solicitação falha com CONFIRM_REQUIRED.

Histórico

Anchor link to

Retorna as alterações de uma flag, da mais recente para a mais antiga: quem fez cada alteração, quando e quais campos mudaram. Assim como Get, exige acesso ao aplicativo e retorna 404 quando o aplicativo ou a flag não existe.

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

A solicitação recebe estes parâmetros:

ParâmetroLocalTipoDescrição
application_codepathstringO código do aplicativo.
keypathstringA chave da flag.
pagequeryintegerOpcional. Número da página, começando em 0.
per_pagequeryintegerOpcional. Entradas por página, 20 por padrão, até 100.

Retorna { "entries": [ ... ], "total": N }, em que total é o número de entradas em todas as páginas. Cada entrada tem estes campos:

CampoTipoDescrição
versionintegerA versão da flag gerada por esta alteração.
actionstringcreate, update, set_percent, kill, unkill, archive, restore ou reshuffle.
user_idstringO ID do usuário do Painel de Controle que fez a alteração. 0 para uma alteração feita com um token de API ou por um serviço do Pushwoosh.
user_emailstringO e-mail desse usuário. Vazio quando o usuário foi excluído ou user_id é 0.
by_api_tokenbooleantrue quando a alteração foi feita com um token de API. false para uma alteração feita por um usuário ou por um serviço do Pushwoosh.
api_token_namestringO nome que o token de API tinha no momento da alteração. Ele permanece depois que o token é excluído. Vazio quando o token não tem nome ou by_api_token é false.
createdstringHora da alteração, RFC 3339.
flagObjeto feature flagA flag após a alteração.
changesarrayOs campos que diferem da versão anterior. Vazio para create e reshuffle, e para a entrada mais antiga de uma flag criada antes de o histórico ser registrado, porque não há versão anterior para comparar.

Cada item de changes tem field, before e after. before e after contêm os valores codificados como strings JSON, portanto um valor do tipo string vem entre aspas. field assume estes valores:

fieldO que mudou
name, description, statusO campo da flag com este nome.
propertiesAs propriedades e seus valores padrão.
rules[<rule_id>]Uma regra. Para uma regra adicionada, before fica vazio. Para uma regra removida, after fica vazio.
rules.orderA ordem das regras.
Exemplo de resposta
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
}

O objeto flag no exemplo está abreviado. O histórico é registrado para alterações a partir de 13 de outubro de 2026. Uma flag sem alterações registradas não retorna entradas.

Ler flags para um dispositivo

Anchor link to

Os SDKs leem as flags de um endpoint separado. Você não precisa chamá-lo quando usa o Web SDK, o Android SDK ou o iOS SDK, porque eles escolhem o host e armazenam a resposta em cache por conta própria.

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

O corpo da solicitação tem estes campos:

CampoTipoDescrição
applicationstringO código do aplicativo.
hwidstringO HWID do dispositivo.
etagstringOpcional. O etag da última resposta que o dispositivo tem.

A resposta tem estes campos:

CampoTipoDescrição
flagsobjectFlags indexadas pela chave da flag. Cada uma tem enabled, rule_id e properties. rule_id é default quando nenhuma regra correspondeu e fica vazio para uma flag desativada. Flags arquivadas não são incluídas.
etagstringEnvie-o na próxima solicitação.
not_modifiedbooleantrue quando o etag enviado está atualizado. Nesse caso, flags é omitido e o dispositivo mantém sua cópia.
partialbooleantrue quando os segmentos do dispositivo não foram avaliados a tempo. Não armazene esta resposta em cache.

Em um plano sem feature flags, a resposta é vazia.

Objeto feature flag

Anchor link to

Todos os endpoints retornam a flag neste formato:

CampoTipoDescrição
application_codestringO aplicativo ao qual a flag pertence.
keystringA chave da flag.
namestringNome de exibição.
descriptionstringDescrição.
statusstringactive, killed ou archived.
propertiesarray de Objetos propriedadeAs propriedades da flag.
defaultsobjectO valor de cada propriedade para os dispositivos em que a flag está desativada.
rulesarray de Objetos regraRegras ordenadas.
versionintegerEnvie-a de volta com Update, SetRulePercent e Reshuffle.
createdstringHora de criação, RFC 3339.
updatedstringHora da última alteração, RFC 3339.
last_modified_by_user_idstringO usuário do Painel de Controle que alterou a flag por último. 0 quando a última alteração foi feita com um token de API ou por um serviço do Pushwoosh.

Objeto propriedade

Anchor link to

Uma propriedade descreve um valor que o SDK lê da flag:

CampoTipoDescrição
keystringCorresponde a ^[A-Za-z0-9_]{1,64}$, única dentro da flag.
typestringstring, number, boolean ou json. Não pode mudar depois que a propriedade existe.

Objeto regra

Anchor link to

Uma regra decide quem recebe a flag ativada e com quais valores:

CampoTipoDescrição
rule_idstringGerado pelo servidor, r_ seguido de 8 dígitos hexadecimais, e estável entre atualizações. Deixe vazio para uma nova regra.
namestringNome da regra.
filter_codestringO segmento ao qual o dispositivo deve corresponder. Vazio corresponde a todos os dispositivos. O segmento só pode conter condições de tag, localização, aplicativo e lista.
percent_bpintegerParcela dos usuários correspondentes para os quais a flag está ativada, 0–10000. Um dispositivo que corresponde ao segmento para nesta regra mesmo quando fica fora da porcentagem.
overridesobjectValores de propriedades que substituem os padrões para os dispositivos em que esta regra ativa a flag, indexados pela chave da propriedade.

Uma solicitação rejeitada retorna um destes códigos de status HTTP:

Status HTTPSignificado
400 Bad RequestA solicitação é inválida (field_violations) ou o estado da flag ou o plano não a permite (Type). Veja os formatos do corpo e os motivos abaixo.
401 UnauthorizedO cabeçalho Authorization está ausente ou o token é inválido.
403 ForbiddenO token não pode gerenciar o aplicativo, ou o aplicativo é do sistema.
404 Not FoundO aplicativo ou a flag não existe.
409 ConflictOutra solicitação está alterando a mesma flag neste momento. Tente a solicitação novamente.
500 Internal Server ErrorFalha inesperada do servidor. O corpo é {"message": "Sorry, an unexpected error occurred"}.

Uma solicitação inválida retorna 400 com uma lista de violações de campo. Cada violação indica o campo, o motivo e os argumentos do 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" }
}
]
}
]
}

Uma solicitação que o estado da flag ou o plano não permite retorna 400 com uma pré-condição com falha. Seus campos Type e Description começam com letra maiúscula:

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

O reason de uma violação de campo e o Type de uma pré-condição com falha assumem estes valores:

MotivoCausa
KEY_INVALIDA chave não corresponde a ^[A-Za-z0-9_.-]{1,58}$.
KEY_TAKENOutra flag do aplicativo, incluindo as arquivadas, tem esta chave.
TEXT_INVALIDO nome ou a descrição é longo demais ou contém caracteres proibidos.
PROPERTIES_LIMITMais de 50 propriedades.
PROPERTY_KEY_INVALIDUma chave de propriedade é inválida ou repetida.
PROPERTY_TYPE_INVALIDUm tipo de propriedade não é string, number, boolean nem json.
PROPERTY_TYPE_IMMUTABLEA solicitação altera o tipo de uma propriedade existente.
VALUE_INVALIDUm valor padrão ou de substituição está ausente, não corresponde ao tipo da propriedade ou está aninhado em mais de 5 níveis.
PROPERTIES_TOO_LARGEOs valores das propriedades da flag excedem 10.000 bytes.
RULES_LIMITMais de 10 regras.
RULE_NOT_FOUNDO rule_id não é uma das regras da flag.
PERCENT_INVALIDpercent_bp está fora de 0–10000.
OVERRIDE_UNKNOWN_PROPERTYUma substituição cita uma propriedade que a flag não tem.
SEGMENT_NOT_FOUNDO segmento da regra não existe ou pertence a outro aplicativo.
INVALID_SEGMENT_TYPEO segmento da regra tem uma condição que as flags não conseguem avaliar: evento, estático, externo, última atualização ou melhor horário de envio.
FLAG_DEPENDENCYO segmento da regra tem uma condição de feature flag, e uma flag não pode depender de outra flag. Retornado por Create, Update e Restore, com o código do segmento em filter_code.
CONFIRM_REQUIREDReshuffle foi enviado sem confirm: true.
TAG_CONFLICTA conta tem uma tag personalizada chamada PW_FF_ seguida da chave da flag.
FEATURE_FLAGS_NOT_ALLOWEDO plano da conta não inclui feature flags.
FLAGS_LIMITO aplicativo tem tantas flags não arquivadas quanto o plano permite.
VERSION_CONFLICTA flag mudou desde a version que você enviou.
PAYLOAD_TOO_LARGEAs flags do aplicativo ocupariam mais de 64 KB na resposta a um dispositivo.
STATUS_CONFLICTO status não permite a operação, por exemplo, desativar uma flag arquivada.