Evaluation reasons and error codes
When you evaluate a flag using the binding's *Details methods or the OpenFeature SDK, the response includes a reason field that explains why a particular value was returned. If an error occurs, the response includes an errorCode field.
| Reason | Description |
|---|---|
TARGETING_MATCH | A targeting rule's conditions matched the evaluation context, and the rule's variant was returned. |
SPLIT | A targeting rule with a percentage rollout matched. The user fell within the rollout percentage and received the rule's variant. |
DEFAULT | No targeting rule matched the evaluation context. The flag's default variant was returned. |
DISABLED | The flag is disabled. The default variant was returned regardless of targeting rules. |
CACHED | The SDK returned a cached evaluation result. |
ERROR | Evaluation failed and the default value was returned. |
When an evaluation error occurs, the method returns the default value you provided. The *Details methods include additional metadata about the error.
| Error code | Description |
|---|---|
TYPE_MISMATCH | The flag's variant type does not match the requested type. For example, calling getBooleanValue on a flag whose variant is a string. The default value is returned. |
FLAG_NOT_FOUND | The specified flag key does not exist in the app. The default value is returned. |
INVALID_CONTEXT | The evaluation context contains unsupported values, such as objects or arrays in HTTP evaluation. The default value is returned. |
PARSE_ERROR | The SDK received an invalid evaluation response. The default value is returned. |
GENERAL | An unexpected error occurred during evaluation, such as a timeout or network failure. The default value is returned. |
The following example inspects evaluation details returned by getBooleanDetails:
const details = await env.FLAGS.getBooleanDetails("my-feature", false, { userId: "user-42",});
switch (details.reason) { case "TARGETING_MATCH": console.log(`Matched targeting rule, variant: ${details.variant}`); break; case "SPLIT": console.log(`Included in rollout, variant: ${details.variant}`); break; case "DEFAULT": console.log("No rule matched, using default variant"); break; case "DISABLED": console.log("Flag is disabled"); break;}
if (details.errorCode) { console.error(`Evaluation error: ${details.errorCode}`);}const details = await env.FLAGS.getBooleanDetails("my-feature", false, { userId: "user-42",});
switch (details.reason) { case "TARGETING_MATCH": console.log(`Matched targeting rule, variant: ${details.variant}`); break; case "SPLIT": console.log(`Included in rollout, variant: ${details.variant}`); break; case "DEFAULT": console.log("No rule matched, using default variant"); break; case "DISABLED": console.log("Flag is disabled"); break;}
if (details.errorCode) { console.error(`Evaluation error: ${details.errorCode}`);}