API de decide
O /decide avalia todas as feature flags de um projeto para um distinct id e retorna a config de gravação de sessões do projeto. É o que o SDK chama no init e depois de identify()/reset(); você pode chamá-lo diretamente de qualquer lugar que não possa usar o SDK.
POST https://ingest.kilden.io/decideContent-Type: application/jsonMesmo host do capture — os SDKs precisam de um único apiHost para eventos e flags.
Requisição
Seção intitulada “Requisição”{ "write_key": "YOUR_PUBLIC_WRITE_KEY", "distinct_id": "user_4821", "person_properties": { "plan": "enterprise" }}| Campo | Obrigatório | Notas |
|---|---|---|
write_key |
sim | Somente keys públicas. Uma key secreta é rejeitada com 403 — ela nunca deve sair do seu backend, e o /decide nunca precisa dela |
distinct_id |
sim | O id para o qual avaliar — o mesmo que seus eventos carregam |
person_properties |
não | Sobrescreve os traits armazenados da pessoa apenas para esta avaliação. Nada é escrito jamais; o pipeline de eventos continua sendo o único jeito de mutar pessoas |
Limite do corpo: 64 KiB. A segmentação por coorte é resolvida no servidor a partir do pertencimento a coortes pré-computado — não há nada a enviar.
Resposta
Seção intitulada “Resposta”{ "flags": { "new-checkout": true, "pricing-test": "variant-b", "sunset-legacy-ui": false }, "sessionRecording": { "enabled": true, "sampleRate": 0.1 }}flags— todas as flags do projeto, avaliadas para odistinct_id. Valores:true,false, ou a string da key da variante para flags multivariadas. Flags inativas voltam comofalse, então um consumidor consegue distinguir “desligada” de “flag desconhecida”.sessionRecording— a config remota de session replay do projeto: o interruptor de ligar, o kill switch e a taxa de amostragem que o SDK obedece.enabled: truesozinho faz o SDK carregar o código de gravação e gravar (a menos que o site tenha feito opt-out local);{"enabled": false, "sampleRate": 0}quando a gravação está desligada.
A avaliação é determinística: a mesma key de flag e o mesmo distinct id sempre produzem o mesmo valor, entre requisições, réplicas e deploys. Veja bucketing determinístico.
Os erros são texto puro, não JSON:
| Status | Significado |
|---|---|
400 |
invalid JSON body: … (incluindo corpos acima de 64 KiB) ou write_key and distinct_id are required |
401 |
unknown write_key |
403 |
secret keys must never leave your backend; call /decide with the project's public write key — ou origin not allowed (mesma checagem de origens permitidas do capture) |
405 |
Método diferente de POST/OPTIONS |
Exemplo
Seção intitulada “Exemplo”curl -X POST https://ingest.kilden.io/decide \ -H 'Content-Type: application/json' \ -d '{"write_key": "pk_your_public_key", "distinct_id": "user_4821"}'Idêntico ao capture: Access-Control-Allow-Origin: * em toda resposta; preflight OPTIONS → 204 com Access-Control-Allow-Methods: POST e Access-Control-Max-Age: 86400.
Atualização dos dados
Seção intitulada “Atualização dos dados”Mudanças na config de flags ficam visíveis em ~10 segundos; traits de pessoa e pertencimento a coortes ficam em cache por ~30 segundos no caminho de avaliação; o pertencimento a coortes em si é materializado a cada ~10 minutos. Se você precisa que um override de propriedade se aplique imediatamente, passe-o em person_properties.