Add a target
Puts one end user, {identityType}:{identityValue} in the path, on the flag's allow or deny list, moving them off the other list; 201 when they were on neither.
A denied end user never gets the flag, and once anyone is allowed, only allowed end users can.
Guide: Feature flags and A/B tests
A project secret key: vh_sk_... for production, vh_sk_test_... for test. Keep it on your servers.
In: header
Path parameters
The project's id, proj_.... A secret key works only in the project it belongs to.
The flag's id, ff_....
The end user, as {identityType}:{identityValue} with the value percent-encoded, such as email:alice@example.com.
^(?:person_id|distinct_id|email|external_id):[\s\S]*?$Request body
application/json
TypeScript definitions
Use the request body type in TypeScript.
Which list the end user is on: allow, which once anyone is on it leaves only them eligible for the flag (still within the rollout), or deny, which keeps them from ever getting it.
Value in
- "allow"
- "deny"
Examples
curl -X PUT "https://api.voidhash.com/api/v1/projects/proj_tz4a98xxat96iws9zmbrgj3a/feature-flags/ff_v8b3n5q0w2e7h7d2k9m4x1c6/targets/distinct_id:user_8231" \ -H "Authorization: Bearer vh_sk_..." \ -H "Content-Type: application/json" \ -d '{ "list": "allow" }'{ "id": "ff_tgt_q0w2e7h7d2k9m4x1c6v8b3n5", "featureFlagId": "ff_v8b3n5q0w2e7h7d2k9m4x1c6", "identityType": "distinct_id", "identityValue": "user_8231", "list": "allow", "createdAt": "2026-03-09T08:35:40.000Z"}{ "id": "ff_tgt_q0w2e7h7d2k9m4x1c6v8b3n5", "featureFlagId": "ff_v8b3n5q0w2e7h7d2k9m4x1c6", "identityType": "distinct_id", "identityValue": "user_8231", "list": "allow", "createdAt": "2026-03-09T08:35:40.000Z"}{ "error": { "type": "invalid_request", "code": "invalid_body", "message": "The request body is invalid: Missing key\n at [\"list\"]" }}{ "error": { "type": "unauthenticated", "code": "invalid_api_key", "message": "This secret key is not valid." }}{ "error": { "type": "permission_denied", "code": "permission_denied", "message": "Insufficient permissions." }}{ "error": { "type": "not_found", "code": "project_not_found", "message": "There is no project proj_tz4a98xxat96iws9zmbrgj3a, or this credential cannot use it.", "param": "projectId" }}{ "error": { "type": "internal", "code": "internal_error", "message": "Something went wrong on our side. Try again, and contact support with the Request-Id header if it keeps failing." }}Response body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
Errors
This operation adds no error codes of its own. It can fail with the errors every operation shares, such as unauthenticated; see Errors.
More in Feature flags
- List feature flags
GET - Create a feature flag
POST - Evaluate flags for an end user
POST - Retrieve a feature flag
GET - Update a feature flag
PATCH - Archive a feature flag
POST - Unarchive a feature flag
POST - List a flag's variants
GET - Replace a flag's variants
PUT - List a flag's overrides
GET - Set an override
PUT - Remove an override
DELETE - List an end user's overrides
GET - List a flag's targets
GET - Remove a target
DELETE
Something wrong or missing on this page? Tell us by email or on Discord.