View Context
curl --request GET \
--url https://api.example.com/v0/workspaces/{id}/viewimport requests
url = "https://api.example.com/v0/workspaces/{id}/view"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.example.com/v0/workspaces/{id}/view', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/v0/workspaces/{id}/view",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/v0/workspaces/{id}/view"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.example.com/v0/workspaces/{id}/view")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v0/workspaces/{id}/view")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_bodyWorkspaces
View Context
GET /v0/workspaces/:id/view — The saved context of the browser tab paired to your API key
GET
/
v0
/
workspaces
/
{id}
/
view
View Context
curl --request GET \
--url https://api.example.com/v0/workspaces/{id}/viewimport requests
url = "https://api.example.com/v0/workspaces/{id}/view"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.example.com/v0/workspaces/{id}/view', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/v0/workspaces/{id}/view",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/v0/workspaces/{id}/view"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.example.com/v0/workspaces/{id}/view")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v0/workspaces/{id}/view")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_bodyReads what the operator’s browser tab paired to your API key in this workspace is showing, so the harness can resolve “this document” before writing. Only saved identifiers are published: never draft text, selection, or keystrokes. The operator pairs a tab by opening the
Write by
browserLink from Load, which names your key; at most one tab per key per workspace follows you. MCP: workspace_view_context. CLI: rip workspace view context <workspace-id>.
Auth: Authorization: Bearer tr_... (an account API key). {id} is the workspace UUID.
Response
{
"ok": true,
"data": {
"state": "paired",
"view": {
"id": "…", "workspaceId": "…", "accountId": "rip1…", "tabId": "…",
"savedArtifactId": "<public id>", "savedVersionId": "…", "savedRevision": 7,
"dirty": false, "following": true, "contextGeneration": 12,
"heartbeatAt": "2026-09-15T09:00:00.000Z",
"pairedCredentialId": "6a7b…", "pairGeneration": 1,
"navigation": {
"operationId": "…", "artifactId": "<public id>", "expectedContextGeneration": 11,
"navigationGeneration": 3, "status": "applied",
"receipt": { "operationId": "…", "navigationGeneration": 3, "pairGeneration": 1, "expectedContextGeneration": 11, "status": "applied", "artifactId": "<public id>" }
}
},
"navigation": { "…": "same as view.navigation" }
}
}
| Field | Description |
|---|---|
state | paired, or disconnected (then view and navigation are null) |
savedArtifactId | Public id of the artifact the tab shows, or null |
savedVersionId | The version the tab shows. Pass it as expectedVersionId when publishing a version |
savedRevision | The artifact’s workspace revision the tab shows. Pass it as expectedWorkspaceRevision on writes that take one |
pairedCredentialId | The API key the tab follows (yours) |
dirty / following | The person has unsaved edits / the tab follows navigation requests |
contextGeneration | Increments whenever the saved context changes. View Open takes it as expectedContextGeneration |
navigation | The latest navigation request and its receipt, or null |
savedArtifactId with those preconditions; the service never picks a write target from browser focus. When no tab follows your key (never paired, taken over by another key, idle for more than five minutes, or disconnected by the person), the response is state: "disconnected" rather than an error, and nothing changes. Revoking the key or losing workspace access also disconnects the tab. A workspace in the trash answers 410 WORKSPACE_DELETED.