Events_ListEvents_Account
const url = 'https://dev-api.qualiastudios.dev/v1/accounts/example/events?grouping=GROUPING_UNSPECIFIED&view=VIEW_UNSPECIFIED';const options = {method: 'GET', headers: {'X-API-Key': '<X-API-Key>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://dev-api.qualiastudios.dev/v1/accounts/example/events?grouping=GROUPING_UNSPECIFIED&view=VIEW_UNSPECIFIED' \ --header 'X-API-Key: <X-API-Key>'Lists events, newest first, optionally grouped into sessions.
Authorizations
Section titled “Authorizations ”Parameters
Section titled “ Parameters ”Path Parameters
Section titled “Path Parameters ”The account id.
Query Parameters
Section titled “Query Parameters ”At most this many events, or sessions when grouping; 0 means 100, the maximum is 500. TEAM_ACTIVITY defaults to 50, maximum 100. A page may hold fewer and still have a next one.
From a previous response’s next_page_token, with the same parent, filter and grouping. Pages follow the record’s sequence, so events recorded after the first page never shift a later one.
AIP-160 filter: comparisons joined by AND (or a space); OR and NOT are refused. Fields:
subject: a resource name; the event’s subject, or one of itsrelated(subject = "accounts/a/datasets/d").subject.name,subject.type: the subject only.parent: the parent’s name.actor.user,actor.api_key,actor.agent,actor.kind(PERSON, SYSTEM, …).action("qds.EPISODES_RULED"),service("qds"),operation.create_time, with= < <= > >=and an RFC 3339 time.sequence, with= < <= > >=.
With view TEAM_ACTIVITY only, each with = and at most once:
verb: the summary’s verb (verb = EDIT,verb = PROPOSE_SUBTASKS,verb = ADD_INTEGRATION_KEY). Activity reads qds and platform records.actor: the summary’s actor kind (PERSON, API_KEY, SERVICE, MODEL, SYSTEM, UNKNOWN). Unlikeactor.kind, the stored kind, a row a key wrote is API_KEY and a check’s proposals are SYSTEM.workspace: a workspace id, quoted; an organization’s list only.text: case-insensitive substring of the subject’s recorded label, on any subject type (the summary shows it only for datasets); 3 to 256 characters.
Strings are quoted. = is exact.
How to group. Unset lists each event.
Optional representation. Page tokens bind the view and its policy version.
Responses
Section titled “ Responses ”OK
Response for Events.ListEvents. (— api-linter: core::0132::response-unknown-fields=disabled aip.dev/not-precedent: a grouped list returns sessions instead. —)
object
One page of events, newest first. Empty when grouping.
One thing that happened: a row of the audit trail.
Every service writes its own events table (qds.events, platform.events,
fleet.events, training.events, pipeline.events, tasks.events) in
the transaction that makes the change, with these fields as columns.
events-api copies the rows into one record and serves them; status (see
Status) is read from the same rows. events-api writes events.events for
what its retention job did (events.v1.Event).
Each service types its actions in its own proto (qds.workflow.v1.Event,
platform.v1.Event, fleet.v1.Event, training.v1.Event,
pipeline.v1.Event, tasks.v1.Event, events.v1.Event): action is the
service name and the type’s value name, and payload is the matching
payload message as protojson, rendered by the writer. Nothing downstream decodes a service
proto.
Served by events-api (Events), read from the record.
object
The event’s id (a UUID). The relay copies a row under this id, so a
replayed copy is a no-op.
(— api-linter: core::0148::use-uid=disabled
aip.dev/not-precedent: the envelope predates the resource; id is a
stored column and the stream’s field. —)
Its place in the record: one global sequence, strictly increasing, in
the order rows were copied. A service’s own table numbers its rows
separately (source_sequence).
When the change was committed.
The organization (account) id it happened in.
The workspace id it happened in; empty when origin is ORGANIZATION.
The service that committed it: “qds”, “platform”, “fleet”, “training”,
“pipeline”, “tasks” or “events”. The prefix of action.
Who did it. api_key is set when a person acted through a key; actor
kind SYSTEM, RULE or MODEL for changes nobody made by hand.
object
What kind of actor it is.
The person’s user id when kind is PERSON; empty otherwise.
The person’s display name at the time, for rendering without a lookup.
The rule code, or the model id (e.g. “gemini-robotics-er”), when not a person.
The run a model or rule finding came from, when it has one.
The API key’s id when a person acted through one; empty for a session. Never the key itself.
Signed identity evidence recorded with the change, kept apart from the principal above. Unset on older records and wherever none was signed.
object
How the principal authenticated.
The user id of a person verified as starting the work: the person of a session, or the person a trusted service’s signed job record names. Empty when nobody was verified.
The initiator’s display name at the time, never their email.
The user id of the key’s creator at the time. Not who used the key.
Who owned the key at the time.
The owning space’s id (a workspace or the organization) when
credential_owner is SPACE.
What happened: <service>.<TYPE>, e.g. “qds.EPISODES_RULED”. TYPE is a
value name of the service’s Event.Type.
What it happened to, e.g. a dataset.
object
What kind of thing, e.g. “dataset”, “episode”, “robot”, “workspace”.
Its resource name or id, e.g. “accounts/a/datasets/d”.
What a person called it at the time, e.g. “Pick and place, v2”.
What the subject lives in, when that matters for filtering (a dataset’s episode, a run’s op); unset otherwise.
object
What kind of thing, e.g. “dataset”, “episode”, “robot”, “workspace”.
Its resource name or id, e.g. “accounts/a/datasets/d”.
What a person called it at the time, e.g. “Pick and place, v2”.
Other things the one change touched, e.g. the episodes a ruling covered, or the second entity of a two-entity action.
A thing an event or a status points at. Labels are captured when the event is written, so a renamed or deleted thing still reads as it was. (— api-linter: core::0123::resource-annotation=disabled aip.dev/not-precedent: a pointer at a resource, not one itself. —)
object
What kind of thing, e.g. “dataset”, “episode”, “robot”, “workspace”.
Its resource name or id, e.g. “accounts/a/datasets/d”.
What a person called it at the time, e.g. “Pick and place, v2”.
One plain line, e.g. “rejected 12 episodes”.
The service’s payload message for action, as protojson. Never holds a
secret value.
A Struct, not a Value: protojson renders a message as a JSON object, so a scalar or list here would be a writer bug the type now refuses. Not an Any: an Any needs the service’s descriptors to read, and readers here never have them.
object
The payload’s full message name, e.g. “qds.workflow.v1.Event.EpisodesRuled”; empty when there is no payload.
The request that made the change, for joining with its logs and trace. (— api-linter: core::0155::request-id-format=disabled aip.dev/not-precedent: a recorded value, not an idempotency key. —)
Whether the owning service can undo it.
The id of the event this one undid; empty unless it is an undo.
The running work it belongs to, when it does (Status.operation). Every OPERATION_* event sets it.
The source row’s sequence in its service’s events table (service
names the table). Status orders an operation’s transitions by it, never
by sequence, which is only the order rows reached the record (ADR 0025,
“Order: two sequences”).
Accounts/{account}/workspaces/{workspace}/events/{event} for an event of
a workspace; accounts/{account}/events/{event} for one of the
organization itself. {event} is id. Every event of an organization
can also be read by its organization path.
Whether a workspace or the organization itself made the change.
Explicit request correlation. Absent on historical uncorrelated records.
object
Canonical root event UUID, scoped to the event’s account.
Whether this event is the root or a derived effect.
Empty on the last page.
One page of sessions, newest first; set only when grouping is SESSIONS.
Repeated work by one actor on one thing, shown as one line (ADR 0025, Decided 4).
Walking a list newest first, an event joins the session before it when it has the same actor (kind, user, API key and agent) and the same subject (type and name), and was created within 30 minutes of the event that joined it last. Anything else in between, as the filter left the list, ends the session. A session holds at most 1000 events; the next one starts a new session. Sessions never span pages.
object
Its newest event, the one to show.
object
The event’s id (a UUID). The relay copies a row under this id, so a
replayed copy is a no-op.
(— api-linter: core::0148::use-uid=disabled
aip.dev/not-precedent: the envelope predates the resource; id is a
stored column and the stream’s field. —)
Its place in the record: one global sequence, strictly increasing, in
the order rows were copied. A service’s own table numbers its rows
separately (source_sequence).
When the change was committed.
The organization (account) id it happened in.
The workspace id it happened in; empty when origin is ORGANIZATION.
The service that committed it: “qds”, “platform”, “fleet”, “training”,
“pipeline”, “tasks” or “events”. The prefix of action.
Who did it. api_key is set when a person acted through a key; actor
kind SYSTEM, RULE or MODEL for changes nobody made by hand.
object
What kind of actor it is.
The person’s user id when kind is PERSON; empty otherwise.
The person’s display name at the time, for rendering without a lookup.
The rule code, or the model id (e.g. “gemini-robotics-er”), when not a person.
The run a model or rule finding came from, when it has one.
The API key’s id when a person acted through one; empty for a session. Never the key itself.
Signed identity evidence recorded with the change, kept apart from the principal above. Unset on older records and wherever none was signed.
object
How the principal authenticated.
The user id of a person verified as starting the work: the person of a session, or the person a trusted service’s signed job record names. Empty when nobody was verified.
The initiator’s display name at the time, never their email.
The user id of the key’s creator at the time. Not who used the key.
Who owned the key at the time.
The owning space’s id (a workspace or the organization) when
credential_owner is SPACE.
What happened: <service>.<TYPE>, e.g. “qds.EPISODES_RULED”. TYPE is a
value name of the service’s Event.Type.
What it happened to, e.g. a dataset.
object
What kind of thing, e.g. “dataset”, “episode”, “robot”, “workspace”.
Its resource name or id, e.g. “accounts/a/datasets/d”.
What a person called it at the time, e.g. “Pick and place, v2”.
What the subject lives in, when that matters for filtering (a dataset’s episode, a run’s op); unset otherwise.
object
What kind of thing, e.g. “dataset”, “episode”, “robot”, “workspace”.
Its resource name or id, e.g. “accounts/a/datasets/d”.
What a person called it at the time, e.g. “Pick and place, v2”.
Other things the one change touched, e.g. the episodes a ruling covered, or the second entity of a two-entity action.
A thing an event or a status points at. Labels are captured when the event is written, so a renamed or deleted thing still reads as it was. (— api-linter: core::0123::resource-annotation=disabled aip.dev/not-precedent: a pointer at a resource, not one itself. —)
object
What kind of thing, e.g. “dataset”, “episode”, “robot”, “workspace”.
Its resource name or id, e.g. “accounts/a/datasets/d”.
What a person called it at the time, e.g. “Pick and place, v2”.
One plain line, e.g. “rejected 12 episodes”.
The service’s payload message for action, as protojson. Never holds a
secret value.
A Struct, not a Value: protojson renders a message as a JSON object, so a scalar or list here would be a writer bug the type now refuses. Not an Any: an Any needs the service’s descriptors to read, and readers here never have them.
object
The payload’s full message name, e.g. “qds.workflow.v1.Event.EpisodesRuled”; empty when there is no payload.
The request that made the change, for joining with its logs and trace. (— api-linter: core::0155::request-id-format=disabled aip.dev/not-precedent: a recorded value, not an idempotency key. —)
Whether the owning service can undo it.
The id of the event this one undid; empty unless it is an undo.
The running work it belongs to, when it does (Status.operation). Every OPERATION_* event sets it.
The source row’s sequence in its service’s events table (service
names the table). Status orders an operation’s transitions by it, never
by sequence, which is only the order rows reached the record (ADR 0025,
“Order: two sequences”).
Accounts/{account}/workspaces/{workspace}/events/{event} for an event of
a workspace; accounts/{account}/events/{event} for one of the
organization itself. {event} is id. Every event of an organization
can also be read by its organization path.
Whether a workspace or the organization itself made the change.
Explicit request correlation. Absent on historical uncorrelated records.
object
Canonical root event UUID, scoped to the event’s account.
Whether this event is the root or a derived effect.
How many events it holds, latest included.
The earliest create_time among its events. Record order does not follow create_time, so this need not be the oldest event’s.
The latest create_time among its events.
The names of its events, newest first: the first 100. For all of them,
list with subject.name, the actor and sequence between
first_sequence and latest.sequence.
The record sequence of its oldest event.
Bounded intentional actions, newest first. Only set for TEAM_ACTIVITY.
Bounded summary of one recorded intentional action. No synthetic grouping. Historical merged reviews remain separate events. Only the recorded subject label is included as text; no payload, reason, related targets, config or revision content is sent.
object
Canonical raw event reference, also the detail lookup key. Consumers deduplicate by this field; request_id is not an action identity.
The canonical event UUID, preserved unchanged.
Global record sequence, used by both list ordering and SSE resume.
Recorded action time.
What the action did, independent of subsequent execution outcomes.
Actual changed episodes, or distinct accepted episodes for a checks request, or distinct episodes with published proposals at run termination. Absent means unknown; child operations are never this count.
At most fifteen allowlisted field names, without values.
Recorded identity evidence only. No historical owner lookup.
object
Evidence category.
Recorded UUID only, absent whenever a credential was recorded.
Credential UUID only, never its value, label, creator or owner.
Signed authentication method. Unspecified means not recorded; a key or a session never implies the client (UI, SDK) that used it.
Verified initiating person’s UUID, when recorded. Never a key’s creator.
Who owned the recorded key at the time, when recorded.
The executing service, service:<name>, for a SERVICE principal.
Canonical dataset reference when valid.
Dataset label recorded on the raw event’s subject, at most 256 characters. Empty when no label was recorded or dataset is absent. Not its name today.
The raw event’s subject type (dataset, episode, secret, …), at
most 64 characters.
The label recorded on the raw event’s subject, of any type, at most 256 characters; empty when none was recorded. Not its name today.
COPY_DATASET, MOVE_DATASET, COPY_DATASET_STARTED and COPY_DATASET_FAILED: where the dataset came from and went, as recorded. Absent for every other verb.
object
Where the dataset came from.
object
The dataset at this end, in the row’s organization; empty for another organization’s end.
The dataset’s name when it was recorded, at most 256 characters; empty
with dataset.
The workspace, in the row’s organization; empty for another organization’s end.
The workspace’s name when it was recorded, at most 256 characters.
The organization’s name when it was recorded, at most 256 characters; set only for another organization’s end.
Where it went: the copy, or the moved dataset.
object
The dataset at this end, in the row’s organization; empty for another organization’s end.
The dataset’s name when it was recorded, at most 256 characters; empty
with dataset.
The workspace, in the row’s organization; empty for another organization’s end.
The workspace’s name when it was recorded, at most 256 characters.
The organization’s name when it was recorded, at most 256 characters; set only for another organization’s end.
The version tag copied; empty for the current version and for a move.
Episodes the copy holds, or the moved dataset.
Bytes of content the copy references: what a byte copy would write.
Bytes the transfer wrote to blob storage (0 inside one organization).
Robots cleared by this transfer. Another organization’s name is omitted.
A robot named by a transfer, including its name before a later deletion. (— api-linter: core::0123::resource-annotation=disabled aip.dev/not-precedent: a pointer at a robot, not a resource itself. —)
object
Accounts/{account}/robots/{robot}.
The robot’s display name at transfer time.
Robots restored by a move back.
A robot named by a transfer, including its name before a later deletion. (— api-linter: core::0123::resource-annotation=disabled aip.dev/not-precedent: a pointer at a robot, not a resource itself. —)
object
Accounts/{account}/robots/{robot}.
The robot’s display name at transfer time.
Previous robots that could not be restored.
A robot named by a transfer, including its name before a later deletion. (— api-linter: core::0123::resource-annotation=disabled aip.dev/not-precedent: a pointer at a robot, not a resource itself. —)
object
Accounts/{account}/robots/{robot}.
The robot’s display name at transfer time.
Reference ranges left behind and found by a move.
object
Ranges in the source workspace, which no longer apply.
Ranges in the target workspace, which apply from now on.
TEAM_ACTIVITY snapshot cursor. Open its separate SSE subscription after the first page’s cursor, then merge by ActivitySummary.event. Use only the first page’s cursor; later pages do not replace the live cursor.
The classifier/projection version bound into Activity page tokens.
Example
{ "events": [ { "actor": { "kind": "KIND_UNSPECIFIED", "attribution": { "authentication": "AUTHENTICATION_UNSPECIFIED", "credentialOwner": "CREDENTIAL_OWNER_UNSPECIFIED" } }, "origin": "ORIGIN_UNSPECIFIED", "activityLink": { "role": "ROLE_UNSPECIFIED" } } ], "sessions": [ { "latest": { "actor": { "kind": "KIND_UNSPECIFIED", "attribution": { "authentication": "AUTHENTICATION_UNSPECIFIED", "credentialOwner": "CREDENTIAL_OWNER_UNSPECIFIED" } }, "origin": "ORIGIN_UNSPECIFIED", "activityLink": { "role": "ROLE_UNSPECIFIED" } } } ], "activity": [ { "verb": "VERB_UNSPECIFIED", "actor": { "kind": "KIND_UNSPECIFIED", "authentication": "AUTHENTICATION_UNSPECIFIED", "credentialOwner": "CREDENTIAL_OWNER_UNSPECIFIED" } } ]}default
Section titled “default ”Default error response
The Status type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by gRPC. Each Status message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the API Design Guide.
object
The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code].
A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client.
A list of messages that carry the error details. There is a common set of message types for APIs to use.
Contains an arbitrary serialized message along with a @type that describes the type of the serialized message.
object
The type of the serialized message.
Example generated
{ "code": 1, "message": "example", "details": [ { "@type": "example" } ]}