---
title: "Fetch a stored blob"
method: GET
path: "/api/v1/files/{blobId}"
---

# Fetch a stored blob

`GET /api/v1/files/{blobId}`

## Request

- Base URL: `https://aicommander.dev`
- URL: `https://aicommander.dev/api/v1/files/{blobId}`
- Auth: one of:
  - none
  - HTTP bearer

Returns the blob's raw bytes. A blob id ALONE is never sufficient: pass either the `t` link token returned by /api/v1/pull (valid 1 hour, and the only path that works without an account) or an account credential that owns the blob (valid for the blob's whole 24-hour life). An unknown blob, an expired blob, and one belonging to somebody else all return the same 404 — distinguishing them would confirm that an id exists. This endpoint is also rate-limited PER IP, 120 requests a minute per IP and 20000 a minute relay-wide, answering 429 above that: it is reachable with no credential and both checks above happen only after a storage read.

## Path parameters

- `blobId` string, required

## Query parameters

- `t` string

## Response `200`

The blob's bytes.

## Other responses

- `404`: Session code or alias not found (anonymous callers get a unified message that does not confirm existence).
- `429`: Too many download requests from this IP: 120 a minute per IP, 20000 a minute relay-wide. This is the one transfer endpoint reachable with no credential at all, and both of its authorization checks happen only after a storage read, so it is bounded by IP rather than by subject. Retry after a short pause.
- `503`: The session exists but the agent is offline or disconnected mid-command.

---

[API](https://skmtc.dev/aicommander/apis/ai-commander-remote-shell-and-long-running-jobs-api.md) · [All operations](https://skmtc.dev/aicommander/apis/ai-commander-remote-shell-and-long-running-jobs-api/llms.txt) · [OpenAPI document](https://skmtc.dev/aicommander/apis/ai-commander-remote-shell-and-long-running-jobs-api/revisions/a6bb89f779a1?raw)
