---
title: "Context status + a fresh download URL"
method: GET
path: "/preview/contexts/{id}"
tags: ["contexts"]
---

# Context status + a fresh download URL

`GET /preview/contexts/{id}`

## Request

- Base URL: `https://autoresearch.sfcompute.com`
- URL: `https://autoresearch.sfcompute.com/preview/contexts/{id}`
- Auth: HTTP bearer

Status of an uploaded context plus, once finalized, a presigned download url - the import path for bytes that exist only in your sandbox (a prepared dataset, an eval set, a wheel): create_context → PUT → finalize_context → get_context, then land it on a node with one command - `run_command(node, "curl -o ~/data.tar.zst '<url>'", detach: true)` for the big ones, `tar xf` if you tarred it - the node has the bandwidth and the disk; nothing rides through MCP. Returns {status: "ready", size_bytes, sha256, download: {url, expires_at}}; the url expires in minutes (this is a read: re-call for a fresh one), the object lives ~30 days unless you delete_context it sooner (which also answers here: {status: "deleted", deleted_at, bytes_deleted_at once the store confirms removal}). One finalized upload is reusable: curl it onto five nodes, build a job image from it - same object. While a big finalize runs you may see `{status: "finalizing"}` (or "uploading" from the other api instance) - keep polling until ready. `{status: "failed", error}` means the last finalize attempt died server-side: the uploaded parts are untouched - re-call finalize_context to retry. The download url points at the object store's own hostname (currently fly.storage.tigris.dev), NOT the API's - an egress allowlist needs that host too.

## Path parameters

- `id` string, required: Context id from create_context (e.g. "ctx-5rq8d").

## Query parameters

- `workspace` string

## Response `200`

The capability's JSON result.

- Result: The capability's result: the same object the MCP tool returns as structuredContent. Resources carry an `object` type discriminator and an immutable id; money is integer micro-dollars in `*_usd_micros` fields.
  - `object` string: The resource type, when the result is one resource.

## Other responses

- `400`: Malformed request: bad JSON, a parameter that does not parse, or a value outside its range. Code `invalid`.
- `401`: No bearer token, or one this API cannot verify. Code `unauthenticated`.
- `403`: Authenticated, but the token's scopes or the account's role do not reach this operation. The message names the scope word to request. Code `forbidden`.
- `404`: No such route. Code `not_found`; the body names the OpenAPI document.
- `422`: A well-formed request the platform declined: no such node, a cap reached, a state that forbids the move. The message says which, and what to do instead. Code `refused`.
- `429`: Over this door's per-customer budget. Wait `Retry-After` seconds. Code `rate_limited`.
- `500`: Our fault. Retry; if it persists, quote the request-id. Code `internal`.

---

[API](https://skmtc.dev/givemeanode/apis/autoresearch-customer-api.md) · [All operations](https://skmtc.dev/givemeanode/apis/autoresearch-customer-api/llms.txt) · [OpenAPI document](https://skmtc.dev/givemeanode/apis/autoresearch-customer-api/revisions/f88dcb70ac6c?raw)
