GET /v1/projects/:projectId/users/:appUserId/signal
Per-user property state, consent, cohorts, and retention.
GET
/v1/projects/:projectId/users/:appUserId/signalPhase 1stable
- Auth
- Bearer
- Scope
- events:read
Returns a merged view of a single user: their latest property state, consent flags, assigned cohorts, and day-1 / 7 / 30 retention status. Use it to render a "user detail" screen inside your partner UI, or to decide whether a user is eligible for a campaign before you target them.
The view is computed from the raw event stream and refreshed asynchronously. firstSeen / lastSeen reflect live event timestamps; retention and properties may lag. PII fields follow the same redaction rules as GET /events - redacted unless the key carries events:read+pii.
cohorts may be returned as an empty array when no cohort assignments are available.
Path
projectIdstringrequiredProject ID.appUserIdstringrequiredThe `app_user_id` the SDK emits with each event.
Example request
curl "https://api.layers.com/v1/projects/prj_254a4ce1-f4ca-42b1-9e36-17ca45ef3d39/users/user_a7f3c1d9/signal" \
-H "Authorization: Bearer lp_..."const signal = await layers.users.signal(
"prj_254a4ce1-f4ca-42b1-9e36-17ca45ef3d39",
"user_a7f3c1d9"
);signal = layers.users.signal(
project_id="prj_254a4ce1-f4ca-42b1-9e36-17ca45ef3d39",
app_user_id="user_a7f3c1d9",
)Response
200OK
{
"appUserId": "user_a7f3c1d9",
"firstSeen": "2026-03-28T14:02:11Z",
"lastSeen": "2026-04-18T19:41:57Z",
"eventCount30d": 214,
"properties": {
"plan": "pro",
"signup_source": "ios_appstore",
"locale": "en-US",
"email": "[redacted]"
},
"consent": {
"analytics": true,
"marketing": false,
"personalization": true,
"capturedAt": "2026-03-28T14:02:14Z"
},
"cohorts": [],
"retention": {
"day1": true,
"day7": true,
"day30": false
},
"refreshedAt": "2026-04-18T19:00:00Z"
}Errors
| Status | Code | When |
|---|---|---|
| 401 | UNAUTHENTICATED | Missing or invalid key. |
| 403 | FORBIDDEN_SCOPE | Key lacks events:read. |
| 404 | NOT_FOUND | Project does not exist, or no events received yet for this appUserId. |
| 429 | RATE_LIMITED | Read budget exhausted. |
See also
GET /v1/projects/:projectId/events- raw events for this user (filter byuserId=)GET /v1/projects/:projectId/conversions- aggregated conversions