Issues_UpdateIssue
const url = 'https://dev-api.qualiastudios.dev/v1/accounts/example/datasets/example/issues/example';const options = { method: 'PATCH', headers: {'X-API-Key': '<X-API-Key>', 'Content-Type': 'application/json'}, body: '{"name":"example","episode":"example","text":"example","body":"example","timeSeconds":1,"blocks":true,"etag":"example"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request PATCH \ --url https://dev-api.qualiastudios.dev/v1/accounts/example/datasets/example/issues/example \ --header 'Content-Type: application/json' \ --header 'X-API-Key: <X-API-Key>' \ --data '{ "name": "example", "episode": "example", "text": "example", "body": "example", "timeSeconds": 1, "blocks": true, "etag": "example" }'Edits a person’s own text, body or moment, or converts any issue between
issue and note with blocks.
Authorizations
Section titled “Authorizations ”Parameters
Section titled “ Parameters ”Path Parameters
Section titled “Path Parameters ”The account id.
The dataset id.
The issue id.
Query Parameters
Section titled “Query Parameters ”Which fields to change: text, body, time_seconds (a person’s own only), blocks (any).
Request Body required
Section titled “Request Body required ”Anything said about an episode or a whole dataset (QUA-2223). An issue blocks a keep until it is dismissed or the episode is ruled; a note (blocks = false) never blocks. Checks, models, the operator and people all raise into the same list.
The parent dataset is the issue’s scope. An issue raised through an upload is the episode’s own and reads the same from every mixture that contains it; an issue raised through a mixture (by its checks or by a person working in it) is open in that mixture alone (QUA-2242, QUA-2244). A merged dataset has no issues of its own on its episodes: an issue raised on one through it is stored in the upload that holds the take, a dataset-level note is the merged dataset’s. Every issue stored in an upload a merge took (raised before or after the merge) is named, with its episode and its replies, under the merged dataset (QUA-3511), and is written by that name; its name under the upload still reads, and a write by it is FAILED_PRECONDITION naming the merged dataset.
Served by qds-api.
object
Accounts/{account}/datasets/{dataset}/issues/{issue}
Accounts/{account}/datasets/{dataset}/episodes/{episode}; empty when the issue is about the whole dataset (QUA-2226).
Machine-readable code (idle_tail, camera_desync, out_of_reach, mix_twin, source_starved, …); empty for a person’s own words.
What it is about.
Short label for the chip: the check’s name, or a person’s first line.
One human sentence. A person may raise an issue with no words (“raised”).
More than the sentence says: a model’s whole explanation, the rest of what a person wrote.
The figure beside the title, e.g. “4.2 s”, “160 ms”, “0.4x”.
A moment in the episode, seconds from the start of the recording.
Who raised it.
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.
True: an issue that blocks a keep. False: a note. A person converts either way with UpdateIssue (emits ISSUE_CONVERTED); a rule’s, model’s or operator’s issue can be demoted to a note and promoted back.
Open or dismissed. Changed only by DismissIssues and ReopenIssues.
Who dismissed it, when; unset while open.
object
Who.
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.
When.
What dismissed it.
Words given with the dismissal.
Who last converted it between issue and note; unset if never.
object
Who.
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.
When.
Replies under it.
What a rule measured, when it measured something.
object
The metric, as an Episode.Metrics field name.
The episode’s value.
The fence it crossed.
”>” or ”<”.
Whose fence: “robot”, “dataset”, “mixture”, “version”.
Episodes in that population.
The reference range the episode was judged against, as currently
computed (each run on the interface refreshes it; the values at
judgment are fence and population_size above):
accounts/{account}/checks/episode-rules/referenceRanges/{reference_range}.
Set on the episode rules’ findings whose fence came from a stored
range; empty for an absolute limit, an upload judged against itself
(its ranges are not stored), the curation engine’s thresholds, and a
range a later run no longer computes (it is deleted).
Ingest: what the data said, in unit (a gap’s length, a camera’s
rate, an episode’s span).
Ingest: what it should have said, in unit: the limit it broke or the
declared value.
Ingest: observed minus expected, in unit.
Ingest: the unit of observed, expected and delta: “s”, “rows”,
“hz”, “px”, …; empty when unknown.
Ingest: how many times it happened (the 3 of “3 of 120”).
Ingest: what count is out of (the 120 of “3 of 120”: samples, rows,
episodes), when there is such a whole.
Ingest: when it started, in seconds from the episode start.
Ingest: how long it lasted from time_seconds, in seconds: a gap, a
frozen reading, a low-rate window, the episode’s whole span. Unset on
a condition at one moment.
Ingest: the row it was seen at, by position in the episode.
Ingest: the camera it is about, by its key; empty when none.
Ingest: the topic or column it is about; empty when none.
True when the check recommends rejecting the episode (the curation suggestion fell under the frozen threshold, QUA-1835).
For a mixture-wide issue about one source (starved, apart, read at head, read twice): the source it names.
When it was raised.
When it last changed.
Sent back on UpdateIssue.
Accounts/{account}/checks/{check}: the check that raised it; empty for anything else (a person, the operator, ingest, curation).
The model’s reading that last raised it: set on the VLM check’s issues and notes (QUA-3397).
object
What the model concluded.
How sure it was, 0 to 1.
The evidence, in a few sentences.
The moments it pointed at, in time order.
A moment the model pointed at.
object
Seconds from the start of the recording, as Issue.time_seconds (the trim the model read is added in), so a player seeks to it as is.
What happens there, in a few words; may be empty.
The model id, e.g. “gemini-3.5-flash”.
Accounts/{account}/tasks/{task}: the task it read the episode against.
That task’s published revision, as frozen into the run.
Accounts/{account}/checks/vlm/runs/{run}: the check run that read it.
When it was read.
Responses
Section titled “ Responses ”OK
Anything said about an episode or a whole dataset (QUA-2223). An issue blocks a keep until it is dismissed or the episode is ruled; a note (blocks = false) never blocks. Checks, models, the operator and people all raise into the same list.
The parent dataset is the issue’s scope. An issue raised through an upload is the episode’s own and reads the same from every mixture that contains it; an issue raised through a mixture (by its checks or by a person working in it) is open in that mixture alone (QUA-2242, QUA-2244). A merged dataset has no issues of its own on its episodes: an issue raised on one through it is stored in the upload that holds the take, a dataset-level note is the merged dataset’s. Every issue stored in an upload a merge took (raised before or after the merge) is named, with its episode and its replies, under the merged dataset (QUA-3511), and is written by that name; its name under the upload still reads, and a write by it is FAILED_PRECONDITION naming the merged dataset.
Served by qds-api.
object
Accounts/{account}/datasets/{dataset}/issues/{issue}
Accounts/{account}/datasets/{dataset}/episodes/{episode}; empty when the issue is about the whole dataset (QUA-2226).
Machine-readable code (idle_tail, camera_desync, out_of_reach, mix_twin, source_starved, …); empty for a person’s own words.
What it is about.
Short label for the chip: the check’s name, or a person’s first line.
One human sentence. A person may raise an issue with no words (“raised”).
More than the sentence says: a model’s whole explanation, the rest of what a person wrote.
The figure beside the title, e.g. “4.2 s”, “160 ms”, “0.4x”.
A moment in the episode, seconds from the start of the recording.
Who raised it.
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.
True: an issue that blocks a keep. False: a note. A person converts either way with UpdateIssue (emits ISSUE_CONVERTED); a rule’s, model’s or operator’s issue can be demoted to a note and promoted back.
Open or dismissed. Changed only by DismissIssues and ReopenIssues.
Who dismissed it, when; unset while open.
object
Who.
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.
When.
What dismissed it.
Words given with the dismissal.
Who last converted it between issue and note; unset if never.
object
Who.
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.
When.
Replies under it.
What a rule measured, when it measured something.
object
The metric, as an Episode.Metrics field name.
The episode’s value.
The fence it crossed.
”>” or ”<”.
Whose fence: “robot”, “dataset”, “mixture”, “version”.
Episodes in that population.
The reference range the episode was judged against, as currently
computed (each run on the interface refreshes it; the values at
judgment are fence and population_size above):
accounts/{account}/checks/episode-rules/referenceRanges/{reference_range}.
Set on the episode rules’ findings whose fence came from a stored
range; empty for an absolute limit, an upload judged against itself
(its ranges are not stored), the curation engine’s thresholds, and a
range a later run no longer computes (it is deleted).
Ingest: what the data said, in unit (a gap’s length, a camera’s
rate, an episode’s span).
Ingest: what it should have said, in unit: the limit it broke or the
declared value.
Ingest: observed minus expected, in unit.
Ingest: the unit of observed, expected and delta: “s”, “rows”,
“hz”, “px”, …; empty when unknown.
Ingest: how many times it happened (the 3 of “3 of 120”).
Ingest: what count is out of (the 120 of “3 of 120”: samples, rows,
episodes), when there is such a whole.
Ingest: when it started, in seconds from the episode start.
Ingest: how long it lasted from time_seconds, in seconds: a gap, a
frozen reading, a low-rate window, the episode’s whole span. Unset on
a condition at one moment.
Ingest: the row it was seen at, by position in the episode.
Ingest: the camera it is about, by its key; empty when none.
Ingest: the topic or column it is about; empty when none.
True when the check recommends rejecting the episode (the curation suggestion fell under the frozen threshold, QUA-1835).
For a mixture-wide issue about one source (starved, apart, read at head, read twice): the source it names.
When it was raised.
When it last changed.
Sent back on UpdateIssue.
Accounts/{account}/checks/{check}: the check that raised it; empty for anything else (a person, the operator, ingest, curation).
The model’s reading that last raised it: set on the VLM check’s issues and notes (QUA-3397).
object
What the model concluded.
How sure it was, 0 to 1.
The evidence, in a few sentences.
The moments it pointed at, in time order.
A moment the model pointed at.
object
Seconds from the start of the recording, as Issue.time_seconds (the trim the model read is added in), so a player seeks to it as is.
What happens there, in a few words; may be empty.
The model id, e.g. “gemini-3.5-flash”.
Accounts/{account}/tasks/{task}: the task it read the episode against.
That task’s published revision, as frozen into the run.
Accounts/{account}/checks/vlm/runs/{run}: the check run that read it.
When it was read.
Example
{ "kind": "KIND_UNSPECIFIED", "author": { "kind": "KIND_UNSPECIFIED", "attribution": { "authentication": "AUTHENTICATION_UNSPECIFIED", "credentialOwner": "CREDENTIAL_OWNER_UNSPECIFIED" } }, "state": "STATE_UNSPECIFIED", "dismissal": { "actor": { "kind": "KIND_UNSPECIFIED", "attribution": { "authentication": "AUTHENTICATION_UNSPECIFIED", "credentialOwner": "CREDENTIAL_OWNER_UNSPECIFIED" } } }, "dismissCause": "DISMISS_CAUSE_UNSPECIFIED", "conversion": { "actor": { "kind": "KIND_UNSPECIFIED", "attribution": { "authentication": "AUTHENTICATION_UNSPECIFIED", "credentialOwner": "CREDENTIAL_OWNER_UNSPECIFIED" } } }, "finding": { "verdict": "VERDICT_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" } ]}