# Upload a Dataset

You can upload datasets with images and/or annotations using the Roboflow CLI.

We have prepared a video that walks through how to upload a dataset:

{% embed url="<https://www.loom.com/share/19637984033a466b831af56f9404fa89>" %}

## Upload a Directory

Use `roboflow image upload` with a directory path to bulk-upload a dataset:

```bash
roboflow image upload /path/to/dataset/folder -p PROJECT_ID
```

Or use the shorthand alias:

```bash
roboflow upload /path/to/dataset/folder -p PROJECT_ID
```

The CLI auto-detects whether the path is a file or directory — a directory triggers a bulk import with parallel uploads.

### Options

| Flag                  | Description                               |
| --------------------- | ----------------------------------------- |
| `-p`, `--project`     | Project ID (required)                     |
| `-c`, `--concurrency` | Number of parallel uploads (default: 10)  |
| `-b`, `--batch`       | Batch name for grouping uploads           |
| `-r`, `--retries`     | Retry failed uploads N times (default: 0) |

Example with options:

```bash
roboflow upload ./my-dataset -p my-project -c 20 -b "april-batch" -r 3
```

## Upload a Single Image

To upload a single image:

```bash
roboflow image upload photo.jpg -p PROJECT_ID
```

### Options for Single Image Upload

| Flag                 | Description                                       |
| -------------------- | ------------------------------------------------- |
| `-p`, `--project`    | Project ID (required)                             |
| `-a`, `--annotation` | Path to annotation file                           |
| `-m`, `--labelmap`   | Path to labelmap file                             |
| `-s`, `--split`      | Split set: train, valid, or test (default: train) |
| `-t`, `--tag`        | Comma-separated tag names                         |
| `-M`, `--metadata`   | JSON string of metadata                           |
| `--is-prediction`    | Mark upload as a prediction                       |
| `-b`, `--batch`      | Batch name                                        |

### Examples

Upload with an annotation:

```bash
roboflow upload photo.jpg -p my-project -a annotation.xml -s valid
```

Upload with tags and metadata:

```bash
roboflow upload photo.jpg -p my-project -t "outdoor,daytime" -M '{"camera_id":"cam001"}'
```

## Supported Project Types

You can upload data for the following project types:

* Object Detection
* Single-Label Classification
* Multi-Label Classification
* Instance Segmentation
* Semantic Segmentation
* Keypoint Detection

## Supported data.yaml Formats

The CLI supports both list-style and key-value pair formatted class name mappings in `data.yaml` files during dataset uploads:

```yaml
nc: 3
names: ['Paper', 'Rock', 'Scissors']
```

OR

```yaml
nc: 3
names:
  0: Paper
  1: Rock
  2: Scissors
```

## JSON Output

For automation, use `--json`:

```bash
roboflow upload photo.jpg -p my-project --json
```

```json
{"status": "uploaded", "path": "photo.jpg", "project": "my-project"}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.roboflow.com/developer/command-line-interface/upload-a-dataset.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
