---
title: "Create a Portfolio File Upload Request"
method: POST
path: "/portfolio_file_upload_requests"
tags: ["Portfolio Files"]
---

# Create a Portfolio File Upload Request

`POST /portfolio_file_upload_requests`

Create a presigned S3 POST upload request for a portfolio file upload.

File uploads use a three-step flow:
1. Create an upload request to receive a temporary S3 upload URL and required POST parameters.
2. Upload the file directly to S3 with a multipart/form-data POST. Include every key/value pair from `fields` as form parameters, followed by the file as the file part.
3. Finalize the upload by creating a portfolio file with `upload_request_id`.

Upload requests expire after 15 minutes and can only be finalized once.

## Request body

- PortfolioFileUploadRequestInput
  - `name` string, required — Name of the file to upload
  - `size` integer, required — Claimed upload size in bytes
  - `content_type` 'application/pdf' | 'application/msword' | 'application/vnd.ms-excel' | 'application/vnd.ms-powerpoint' | 'application/vnd.openxmlformats-officedocument.presentationml.presentation' | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' | 'image/gif' | 'image/heic' | 'image/jpeg' | 'image/png' | 'image/webp' | 'text/csv', required — MIME type of the file to upload
  - `portfolio_company_profile_id` string, uuid, required — ID of the portfolio company profile the file belongs to

## Response `201`

Upload request successfully created

- PortfolioFileUploadRequest
  - `portfolio_file_upload_request` object, required
    - `upload_request_id` string, uuid, required — Unique identifier for the upload request
    - `upload_url` string, uri, required — URL to POST the file to in S3
    - `fields` object, required — Form fields to include in the S3 POST request
    - `expires_at` string, date-time, required — When the upload request expires

## Other responses

- `400` — Bad Request - The request is invalid or malformed
- `401` — Unauthorized - Invalid or missing authentication token
- `403` — Forbidden - The authenticated user does not have access to the requested resource
- `422` — Unprocessable Entity - The request is valid but contains semantic errors
- `429` — Too Many Requests - Rate limit exceeded

---

[API](https://skmtc.dev/visible/apis/visible-api.md) · [All operations](https://skmtc.dev/visible/apis/visible-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/visible/visible-api/revisions/a04e0975020f/schema)
