Skip to Content

Reading Values

A person’s realtime attribute values are served by the Membership API, with the same membership key and the same identity resolution as its is-member read. You can read them on their own, or in the same request as the person’s audiences.

Experimental — in active development. The endpoint and its response shape may change before general availability.

Endpoint

GET /v1/attributes/{index}/{value}
ParameterRequiredDescription
indexYesThe identity field to look up, for example user_id or anonymous_id.
valueYesThe identifier value.
?attributeNoA comma-separated list of attribute keys to return, for example ?attribute=cart_value_30m,latest_category. Omit it for every attribute being tracked. A key that is not being tracked is simply left out.

Authenticate with a membership key (pk_) as a Bearer token, exactly as for the is-member read — see Authentication. The endpoint serves the same permissive CORS, so a browser can call it directly.

curl -H 'Authorization: Bearer <MEMBERSHIP_KEY>' \ 'https://membership.zeotap.com/v1/attributes/user_id/u_123?attribute=cart_value_30m,latest_category'

Response

A 200 OK returns each attribute’s current value under its key, in its own type:

{ "attributes": { "cart_value_30m": 129.5, "add_to_cart_count_1h": 3, "latest_category": "running-shoes", "last_seen": "2026-10-09T08:14:03.512Z" } }
ReturnsComes back as
numbera JSON number
stringa JSON string
booleantrue or false
timestampan RFC 3339 string in UTC

Values only, and only values that exist. An attribute with nothing to report for this person — no matching event inside its lookback — is left out, not returned as null or 0. A count is the exception in practice: it is 0 rather than absent once the attribute is tracked, because zero events is an answer. Attributes that are Ready or Paused are not tracked and never appear.

So, as with the is-member read, branch on presence: a missing key means “no value for this person right now”, whatever the reason. An identifier Zeotap has never seen gets the same answer as a person with no matching events — counts of 0 and nothing else — because a membership key is published in a web page, and an invented identifier should learn nothing about the person it names.

The response carries no names, no result types and no notes about warm-up: those describe your workspace’s configuration rather than the person. The Lookup tab on an attribute’s page shows them for one person, as does Zeotap Agent when you ask it for someone’s values.

Every response is served Cache-Control: no-store.

Values and audiences in one request

Add ?include=attributes to the is-member read to get the person’s attribute values in the same response:

curl -H 'Authorization: Bearer <MEMBERSHIP_KEY>' \ 'https://membership.zeotap.com/v1/members/user_id/u_123?include=attributes'
{ "memberships": [ { "audience_id": "aud_cart_abandoners", "is_member": true } ], "attributes": { "cart_value_30m": 129.5 } }

The attributes block has the same shape as the attributes read: every tracked attribute with a value, values only. It is absent when no attribute has a value for this person. ?attribute= does not apply here; use the attributes read when you want only some keys.

Status codes

StatusMeaning
200 OKValues returned. An empty attributes object is a 200.
400 Bad RequestThe identifier index or value is missing.
401 UnauthorizedMissing or malformed Authorization header, an invalid or revoked membership key, or a credential of the wrong class.
403 ForbiddenThe realtime plane is not enabled for the key’s workspace.
429 Too Many RequestsThe request rate limit was exceeded. Retry shortly.

Freshness

A value is current as of the person’s last tracked event — usually within about a second of the event arriving — and covers its lookback counted back from the moment you read it, so a value can fall as old events leave the lookback without any new event arriving. Read at the moment you need the value rather than caching it.

A realtime attribute counts from when it was started, with no history from before. For its first lookback after starting — or after an edit that restarted it — a value covers less time than its lookback says. See Tracking starts from zero.

Next Steps

Last updated on