> ## Documentation Index
> This page is part of the Image and Video APIs product. Fetch the complete documentation index for Image and Video APIs at: https://cloudinary.com/documentation/llms-image-and-video-apis.txt?referrer=docpage and then use it to discover all relevant pages before exploring further.
> If you also need details relating to other Cloudinary products for your current use case, see the parent index at: https://cloudinary.com/documentation/llms.txt?referrer=docpage

# Programmatic upload (video tutorial)

## Overview

Would you rather upload programmatically than use the UI? This tutorial gives an overview of uploading assets to Cloudinary programmatically with a single function call, using the CLI or a Cloudinary SDK in the language of your choice.

You'll see how the upload call works with local files, remote URLs, or user uploads, and how the JSON response gives you useful information like image stats, delivery URLs, and transformation options. Learn more in the [Upload](upload_images) guide, or follow the [Upload programmatically](upload_programmatically_tutorial) tutorial for a detailed walkthrough.

## Video tutorial

  This video is brought to you by Cloudinary's video player - embed your own!Use the controls to set the playback speed, navigate to chapters of interest and select subtitles in your preferred language.
{videoTranscript:publicId=training/Programmatic_Upload}

## Tutorial contents
This tutorial presents the following topics. Click a timestamp to jump to that part of the video.### Beyond the upload widget
{table:class=tutorial-bullets}|  |
| --- | --- |
| | Uploading with the [Upload widget](upload_widget) is easy if you're comfortable clicking around on a desktop. But what if you'd rather upload programmatically? |

### One function call
{table:class=tutorial-bullets}|  |
| --- | --- |
| | If you're comfortable using the command line interface or coding tools, programmatic uploads can save hours on a big project with just one function call. |

### Set up the CLI or an SDK
{table:class=tutorial-bullets}|  |
| --- | --- |
| | Set up the [Cloudinary CLI](cloudinary_cli) or use a [Cloudinary SDK](cloudinary_sdks) to build this functionality into your project in whatever language you're using. |

### Upload from local files, URLs, or user uploads
{table:class=tutorial-bullets}|  |
| --- | --- |
| | This [upload call](image_upload_api_reference#upload) works with local files, remote URLs, or user uploads in your project. |

### A useful JSON response
{table:class=tutorial-bullets}|  |
| --- | --- |
| | The JSON response gives you useful info, including image stats, delivery info, transformation options, and more. |

### Ready for transformations and delivery
{table:class=tutorial-bullets}|  |
| --- | --- |
| | This is just getting started. With a simple upload, your assets are in the cloud, ready for [transformations](transformation_reference), optimizations, and global delivery. |

## Keep learning

> **READING**:
>
> * Get the full picture of upload options in the [Upload](upload_images) guide.

> * Check every available parameter in the [Upload API reference](image_upload_api_reference).

> * Browse more [programmatic upload tutorials](programmatic_upload_tutorials) across the CLI and every Cloudinary SDK.

#### If you like this, you might also like...

[Upload Programmatically](upload_programmatically_tutorial)

Use a Cloudinary SDK to upload media assets

[Create Upload Presets (Node.js)](create_upload_preset_tutorial)

Streamline media uploads using signed upload presets

[Edits at Scale](edits_at_scale_tutorial)

Reuse named transformations across all your images

&nbsp;

&nbsp;Check out the Cloudinary Academy for free self-paced Cloudinary courses on a variety of developer or DAM topics, or register for formal instructor-led courses, either virtual or on-site.
&nbsp;