Skip to content

Operator-authenticated view of a feed — same response body as GET /v1/feeds/{group}/{id}

GET
/operator/inspect/feeds/{group}/{id}
curl --request GET \
--url 'http://localhost:3000/operator/inspect/feeds/example/example?limit=20' \
--header 'Authorization: Bearer <token>'

Identical response shape to GET /v1/feeds/{group}/{id} — a page of activities plus the uncursored promoted and objects sidecars. No X-User-Id is forwarded to the feed service: an operator is not an end-user and must not be handed a fabricated end-user identity in the feed service’s logs, so own_reactions is always absent here, not merely empty. Both owner and member may read; platform staff have no tenant and get 403. cursor is still accepted as a deprecated alias for next, for consistency with the rest of the API — new callers should use next.

group
required
string
id
required
string
limit
integer
default: 20 >= 1 <= 100

Page size, 1-100.

next
string

Opaque paging token. Pass the next value from the previous page.

Same page shape as GET /v1/feeds/{group}/{id} — see that route for the full schema.

Media typeapplication/json
object
results
required
Array
next
required

Opaque cursor. Null when no further page.

string | null
results
required
Array<object>
object
id
required
string format: uuid
actor
required
string
verb
required
string
object
required
string
target
string | null
foreign_id
string | null
time
required
string format: date-time
custom
required
object
key
additional properties
any
origin_feed
required
string
reaction_counts
required
object
key
additional properties
integer
actor_user

Enriched from users.custom when actor parses as user:. Null otherwise.

object | null
own_reactions

Omitted for server tokens — no caller identity.

Array<string>
refs
required

Objects this activity points at, as type:id. Resolved into the feed read’s objects sidecar. Max 4, no duplicates.

Array<string>
edited_at
required

Null until the activity is first patched.

string | null format: date-time
version
required

Row version. Starts at 1 and increments on ANY change to this activity — a patch, a reaction count moving, a soft delete. Compare it against the copy you hold to decide whether to re-render; edited_at marks patches only, so it cannot report the field that changes most.

integer
warnings

Non-fatal problems with the activity that was just WRITTEN. Present only on the response to POST /v1/feeds/{group}/{id}/activities; a feed read never carries it — the read path stays exactly three statements.

actor_user_unresolved: the write succeeded, but actor names a user:<id> with no users row, so actor_user is null and every card renders with no name and no avatar until that user is upserted. Without this field a correct write and a broken one are byte-identical. A non-user: actor (system:jobs) never enriches by design and is NOT warned about.

Array<string>
Allowed values: actor_user_unresolved
promoted

Present only when the request carried no next — see GET /v1/feeds/{group}/{id}.

Array<object>

A promoted activity as delivered in a feed read’s promoted sidecar. Activity-shaped so the same render path works, but it is NOT an activity: it has no time, no origin_feed, no reactions, and it was never fanned out to anyone’s feed. Targeting fields (audience) and counters (served_count) are deliberately absent here — exposing the audience would leak the tenant’s segmentation to end users.

object
id
required
string format: uuid
actor
required
string
verb
required
string
object
required
string
custom
required
object
key
additional properties
any
promoted
required

Always true. Present so a merged render path can branch on it.

boolean
objects

Refs on this page, resolved. Absent when none. See GET /v1/feeds/{group}/{id}.

object
key
additional properties

Tenant-owned mutable data that activities point at. Opaque to dropin — we store, update, and return custom, and never interpret it. Writes are server-token only.

object
type
required
string
id
required
string
custom
required
object
key
additional properties
any
updated_at
required
string format: date-time
Example
{
"results": [
{
"actor": "user:alice",
"verb": "post",
"object": "workout:123",
"origin_feed": "user:alice",
"reaction_counts": {
"like": 3
},
"own_reactions": [
"like"
],
"refs": [
"session:1234"
],
"warnings": [
"actor_user_unresolved"
]
}
],
"promoted": [
{
"actor": "system:fcurban",
"verb": "promote",
"object": "game:8842",
"promoted": true
}
],
"objects": {
"additionalProperty": {
"type": "session",
"id": "1234"
}
}
}

Validation failed — malformed next or an out-of-range limit.

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: VALIDATION_FAILED UNAUTHENTICATED FORBIDDEN NOT_FOUND CONFLICT RATE_LIMITED INTERNAL
message
required
string
requestId
required
string
fields

Present only for VALIDATION_FAILED.

Array<object>
object
path
string
message
string
Example
{
"error": {
"code": "VALIDATION_FAILED"
}
}

Invalid, expired, revoked, or absent token.

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: VALIDATION_FAILED UNAUTHENTICATED FORBIDDEN NOT_FOUND CONFLICT RATE_LIMITED INTERNAL
message
required
string
requestId
required
string
fields

Present only for VALIDATION_FAILED.

Array<object>
object
path
string
message
string
Example
{
"error": {
"code": "VALIDATION_FAILED"
}
}

Caller is platform staff, who have no tenant to inspect.

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: VALIDATION_FAILED UNAUTHENTICATED FORBIDDEN NOT_FOUND CONFLICT RATE_LIMITED INTERNAL
message
required
string
requestId
required
string
fields

Present only for VALIDATION_FAILED.

Array<object>
object
path
string
message
string
Example
{
"error": {
"code": "VALIDATION_FAILED"
}
}