---
title: "POST /mcp/material/upload"
method: POST
path: "/v1/material/upload"
tags: ["material"]
---

# POST /mcp/material/upload

`POST /v1/material/upload`

## Request

- Base URL: `https://api.selda.ai`
- URL: `https://api.selda.ai/v1/material/upload`
- Auth: HTTP bearer

Raw file bytes in, a `storageId` out. Send the file's path in `X-Selda-Path`: that path is how Selda maps a file to a company. Then hand the ids to `material.import`.

The request body is the file itself, not JSON.

- Scope: `pipeline`
- A free sandbox key may call it

## Headers

- `X-Selda-Path` string, required

## Response `200`

Stored.

- object
  - `value` object, required
    - `storageId` string
    - `path` string
    - `sizeBytes` number
    - `mimeType` string
  - `request_id` string, required

## Other responses

- `400`: No `X-Selda-Path`, or an empty body.
- `401`: Missing, expired or revoked key.
- `403`: The key lacks the `pipeline` scope.
- `413`: The file is over the 25 MB per-file limit.

---

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