---
title: "get_upload_session"
method: GET
path: "/v1/workspaces/{workspace_id}/upload-sessions/{session_id}"
tags: ["files"]
---

# get_upload_session

`GET /v1/workspaces/{workspace_id}/upload-sessions/{session_id}`

## Request

- Base URL: `https://ndi-api.nace.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://ndi-api.nace.ai/v1/workspaces/{workspace_id}/upload-sessions/{session_id}`
- Auth: API key in header `X-Upload-Token`
- TypeScript: <https://skmtc.dev/nace/apis/ndi-service/docs/v1/workspaces/:workspace_id/upload-sessions/:session_id/get.ts> (a function with typed inputs; its response is checked against the schema)

Read a chunked upload's lifecycle state and landed parts. Cost class: **fast**.

The resume entry point: after a dropped connection (or a page reload),
diff ``parts`` against what was already sent and PUT only what is
missing — never re-derive part numbers, and never resend a part that
already landed.

Args:
    auth: The resolved session context and row.

Returns:
    An :class:`UploadSessionStatusResponse`.

## Path parameters

- `workspace_id` string, uuid, required: Workspace identifier.
- `session_id` string, uuid, required: Upload session identifier.

## Response `200`

Successful Response

- UploadSessionStatusResponse: Result of ``GET .../upload-sessions/{session_id}`` — for resuming after a drop. A resuming client diffs ``parts`` against what it already sent and PUTs only what is missing; it never needs to re-derive part numbers itself.
  - `session_id` string, uuid, required
  - `status` 'open' | 'completing' | 'completed' | 'aborted', required
  - `chunk_size` integer, required
  - `total_parts` integer, required
  - `parts` UploadSessionPart[], required: Parts landed so far, unordered.
    - `part_number` integer, required
    - `size_bytes` integer, required
  - `received_bytes` integer, required: Sum of parts[*].size_bytes.
  - `declared_size_bytes` integer, required
  - `expires_at` string, date-time, required

## Other responses

- `400`: Bad Request
- `401`: Unauthorized
- `402`: Payment Required
- `403`: Forbidden
- `404`: Not Found
- `409`: Conflict
- `410`: Gone
- `413`: Request Entity Too Large
- `422`: Unprocessable Entity
- `424`: Failed Dependency
- `429`: Too Many Requests
- `500`: Internal Server Error
- `501`: Not Implemented
- `503`: Service Unavailable
- `504`: Gateway Timeout

---

[API](https://skmtc.dev/nace/apis/ndi-service.md) - [All operations](https://skmtc.dev/nace/apis/ndi-service/llms.txt) - [OpenAPI document](https://skmtc.dev/nace/apis/ndi-service/revisions/d9d1f8ec2207?raw)
