<!-- https://cutedyno.com/docs/api/create-media-upload -->

# Create a media upload URL

`POST https://api.cutedyno.com/v1/media/upload`

Returns a presigned PUT URL. Upload the bytes directly to it, then reference publicUrl in a post.



Required permission: `media:write`

Accepts `profileId` to target a specific profile. Omit it to use the key’s home profile.

Required permission: `media:write`

MCP tool: `upload_media`

## Body

- `fileName` (string, required) — Original file name, used to pick an extension.
- `fileType` (enum, required) — MIME type of the file you are about to upload. One of: image/jpeg, image/jpg, image/png, image/webp, image/gif, video/mp4, video/quicktime, video/webm, video/x-msvideo.
- `profileId` (string) — Profile to act on. Defaults to the profile the API key was created in.

## Request

```bash
curl -X POST "https://api.cutedyno.com/v1/media/upload" \
  -H "Authorization: Bearer $CUTEDYNO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "profileId": "profile_a1b2c3d4",
  "fileName": "Acme Corp",
  "fileType": "image/jpeg"
}'
```

```typescript
import { CuteDyno } from '@cutedyno/node';

const cutedyno = new CuteDyno();

const result = await cutedyno.media.createUpload({
  profileId: "profile_a1b2c3d4",
  fileName: "Acme Corp",
  fileType: "image/jpeg"
});
console.log(result);
```

```python
import os
import requests

url = "https://api.cutedyno.com/v1/media/upload"
headers = {"Authorization": f"Bearer {os.environ['CUTEDYNO_API_KEY']}"}

payload = {
    "profileId": "profile_a1b2c3d4",
    "fileName": "Acme Corp",
    "fileType": "image/jpeg"
}

response = requests.post(url, json=payload, headers=headers)
response.raise_for_status()
print(response.json())
```

## Response 200

- `signedUrl` (string, required) — PUT the file bytes here.
- `publicUrl` (string, required) — Use this URL in the post's media array.
- `key` (string, required)
- `expiresIn` (number, required) — Seconds until signedUrl expires.
- `maxBytes` (number, required) — Largest file the upload will accept.

```json
{
  "signedUrl": "https://cdn.example.com/media/launch.jpg",
  "publicUrl": "https://cdn.example.com/media/launch.jpg",
  "key": "string",
  "expiresIn": 0,
  "maxBytes": 0
}
```

## Errors

- `invalid_request` (400) — The request body or query string failed validation. The message names the offending field.
- `invalid_api_key` (401) — The key does not exist, was revoked, or is malformed. Keys start with cdyn_live_.
- `unsupported_media_type` (415) — The fileType passed to POST /v1/media/upload is not an accepted image or video type.
- `rate_limit_exceeded` (429) — Too many requests for this key. Honour the Retry-After header before retrying.
- `internal_error` (500) — Something failed on our side. Retry with the same Idempotency-Key; report the requestId if it persists.