---
title: Upload Lifecycle Overview
url: https://docs.kaltura.com/docs/rich-media-cms-apis/content-management/upload-ingestion-upload-lifecycle-overview
---

## Upload Lifecycle Overview


Every file upload follows this pattern:


```
uploadToken.add  -->  uploadToken.upload (one or more chunks)  -->  entry.add  -->  entry.addContent
```


1. **Create an upload token** -- a server-side container that will hold the file  
2. **Upload file data** -- send the file bytes (single shot or chunked) to the token  
3. **Create an entry** -- the logical object (metadata, name, type)  
4. **Attach content** -- link the upload token to the entry, triggering transcoding  

Alternative paths:

| Method | Use Case | Requires Local File? |
|--------|----------|---------------------|
| `uploadToken` + `media.addContent` | Full control, chunked/resumable upload | Yes |
| `media.addContent` with `KalturaUrlResource` | Import from a remote URL (Kaltura fetches the file) | No |
| `media.addContent` with `KalturaEntryResource` | Copy content from an existing entry's source flavor | No |
| `media.addContent` with `KalturaAssetResource` | Create entry from a specific transcoded rendition | No |
| `media.addContent` with `KalturaOperationResource` | Clip/trim/effects from an existing entry | No |
| `media.addContent` with `KalturaOperationResources` | Concatenate segments from multiple entries | No |
| `media.addContent` with `KalturaAssetsParamsResourceContainers` | Multi-flavor ingest (pre-transcoded files) | No (URLs) or Yes (tokens) |
| `media.addContent` with `KalturaSshUrlResource` | Import from SFTP server with SSH keys | No |
| `media.addContent` with `KalturaRemoteStorageResource` | Register on external storage without copy | No |
| `media.bulkUploadAdd` | Batch ingest via CSV or XML | No (URLs in CSV) |
| `baseEntry.clone` | Deep-clone entry with all assets and metadata | No |
