---
title: "Start or resume a project object upload"
method: POST
path: "/api/project-upload/start"
tags: ["Project ingest"]
---

# Start or resume a project object upload

`POST /api/project-upload/start`

## Request

- Base URL: `https://api.cernion.de`
- URL: `https://api.cernion.de/api/project-upload/start`
- Auth: none declared

Tenant-scoped resumable project ingest. SHA-256 hashes are lowercase hex. Chunks use a raw octet stream; status lists received and missing indexes. Completed originals trigger project.object.received.v1. The async job is polled through /api/jobs/:jobId/status.

## Query parameters

- `token` string

## Request body

- object
  - `projectId` string, required
  - `name` string, required
  - `size` integer, required
  - `hash` string, required
  - `mimeType` string
  - `sensitivityLevel` 'public' | 'tenant_internal' | 'restricted' | 'highly_sensitive'
  - `requiredClearance` string[]
  - `chunks` object[]
    - `hash` string
    - `size` integer
  - `token` string: Optional Cernion MCP token for this request. Overrides CERNION_TOKEN when provided.

## Response `200`

Start or resume a project object upload

- object
  - `uploadId` string
  - `objectId` string
  - `chunkSize` integer
  - `status` 'receiving' | 'received' | 'failed' | 'extracted'
  - `chunks` object[]
  - `missing` integer[]
  - `job` object
    - `jobId` string
    - `status` string

## Other responses

- `403`: Insufficient sensitivity clearance or authentication
- `404`: Upload/project absent or invisible
- `409`: Immutable project, failed upload or missing chunks
- `413`: Project, file, chunk or archive limit exceeded
- `422`: Invalid hash or unsafe archive
- `429`: Tenant async job quota exhausted
- `507`: Insufficient free disk space

---

[API](https://skmtc.dev/cernion/apis/cernion-energy-tools-api.md) · [All operations](https://skmtc.dev/cernion/apis/cernion-energy-tools-api/llms.txt) · [OpenAPI document](https://skmtc.dev/cernion/apis/cernion-energy-tools-api/revisions/cdb94473b538?raw)
