# Create tasks from a list in one call

> Import up to 100 Dailybot tasks per request with the bulk endpoint: Idempotency-Key, a dry run first, per-item results and contiguous task keys.

Language: en
Canonical: https://www.dailybot.com/developers/plan/recipes/bulk-create
Markdown: send header `Accept: text/markdown` on any URL to receive Markdown instead of HTML.
Last Updated: 2026-09-25

---

> **Beta** — Plan is in beta. Everything under `/plan` in the web app, the CLI and agent skill commands for projects, goals, boards and tasks, and the `/v1/plan/` public API may change before general availability. Want to try it with your team? Write to **support@dailybot.com**.

Importing a list (a spreadsheet, a checklist, the output of a planning session) should not be one request per row, and a retry should not create everything twice. `POST /v1/plan/tasks/bulk/` creates up to **100 tasks per call**, requires an `Idempotency-Key`, and reports each item separately.

<h2 id="dry-run">1. Preview with a dry run</h2>

`?dry_run=true` runs the whole call and rolls it back, so you see what would happen without writing anything (no idempotency key needed):

```bash
curl -sS -X POST "https://api.dailybot.com/v1/plan/tasks/bulk/?dry_run=true" \
  -H "Authorization: Bearer $DAILYBOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "operation": "create",
    "board": "00000000-0000-4000-8000-000000000002",
    "items": [
      { "title": "Write the migration guide", "external_id": "row-1" },
      { "title": "Record the demo", "external_id": "row-2", "priority": 2 }
    ]
  }'
```

The preview answers `consequence` (a sentence to show a person), `items` with the changes each item would make, and `refused` with any item that would fail and why.

<h2 id="create">2. Create for real</h2>

Send the same body without `dry_run`, with an `Idempotency-Key`:

```bash
curl -sS -X POST "https://api.dailybot.com/v1/plan/tasks/bulk/" \
  -H "Authorization: Bearer $DAILYBOT_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: import-2026-09-25-batch-1" \
  -d '{
    "operation": "create",
    "board": "00000000-0000-4000-8000-000000000002",
    "items": [
      { "title": "Write the migration guide", "external_id": "row-1" },
      { "title": "Record the demo", "external_id": "row-2", "priority": 2 }
    ]
  }'
```

```json
{
  "succeeded": 2,
  "failed": 0,
  "results": [
    { "task": "00000000-0000-4000-8000-000000000105", "key": "ENG-150", "external_id": "row-1", "status": "ok", "version": 1 },
    { "task": "00000000-0000-4000-8000-000000000106", "key": "ENG-151", "external_id": "row-2", "status": "ok", "version": 1 }
  ]
}
```

- Items take a `title` (up to 512 characters) and optionally `description`, `state`, `owner`, `priority`, `estimate`, `start_date`, `due_date` and `external_id`.
- **`external_id` comes back** on each result, so you can match results to your rows and reconcile after a retry.
- Keys are allocated as **one contiguous block**, in the order you sent the items, so the import reads in order afterwards (`ENG-150`, `ENG-151`, …).
- New tasks land at the **bottom** of each column by default. Add `"position": "start"` next to `operation` to put them at the **top** instead, in the order of your items.

From the CLI:

```bash
dailybot plan task bulk --operation create --board 00000000-0000-4000-8000-000000000002 -f tasks.json --dry-run
dailybot plan task bulk --operation create --board 00000000-0000-4000-8000-000000000002 -f tasks.json
```

<h2 id="results">3. Read per-item results</h2>

The call answers `200` **even when some items fail**: the HTTP status says the batch was accepted, not that every item succeeded. Check `failed` and each result's `status`; a failed item carries `code`, `detail` and sometimes `extra`:

```json
{ "task": "ENG-9", "status": "error", "code": "version_conflict", "detail": "This task changed since you loaded it.", "extra": { "current_version": 4 } }
```

<h2 id="retry">4. Retry safely</h2>

If the connection drops, send **the same body with the same `Idempotency-Key`**. You get the first response back (with `Idempotency-Replayed: true`) and nothing is created twice. Keys are remembered for 24 hours. A different body with the same key is `409 idempotency_key_payload_mismatch`; use a new key for a new batch.

<h2 id="large">More than 100 rows</h2>

Split the list into batches of up to 100 items, one key per batch (for example `import-2026-09-25-batch-1`, `-batch-2`, …). More than 100 items in one call is `400 too_many_items`. Bulk calls count against a limit of 30 per minute per actor.

<h2 id="other-operations">Other bulk operations</h2>

The same endpoint applies one operation to up to 100 existing tasks, addressed by uuid or key: `move`, `update`, `archive`, `restore` and `set_labels` (which replaces the whole label set). `set_owner`, `set_priority`, `set_due_date` and `set_parent` are aliases of `update`, and `delete` is an alias of `archive`. A payload that names a task from another organization is refused as a whole, before anything is written.

<h2 id="reference">Reference</h2>

- [`POST /v1/plan/tasks/bulk/`](/developers/api/plan-tasks#plan-tasks-bulk)
- [Conventions for Plan: idempotency](/developers/plan/conventions#idempotency)

---

## Developer portal navigation

**Getting Started**

- [Overview](/developers)
- [Quick start](/developers/getting-started)
- [Authentication](/developers/authentication)

**API Reference**

- [API Overview](/developers/api)
- [Users](/developers/api/users)
- [Organization](/developers/api/organization)
- [Teams](/developers/api/teams)
- [Invitations](/developers/api/invitations)
- [Check-ins](/developers/api/check-ins)
- [Forms](/developers/api/forms)
- [Labels](/developers/api/labels)
- [Report channels](/developers/api/report-channels)
- [Templates](/developers/api/templates)
- [Kudos](/developers/api/kudos)
- [Mood tracking](/developers/api/mood)
- [Important dates](/developers/api/important-dates)
- [Messaging](/developers/api/messaging)
- [Automations](/developers/api/workflows)
- [Webhooks](/developers/api/webhooks)
- [Commands platform](/developers/api/commands-platform)
- [Agents](/developers/api/agents)
- [OAuth2](/developers/api/oauth2)
- [Integrations](/developers/api/integrations)
- [CLI](/developers/api/cli)
- [Plan · Projects](/developers/api/plan-projects)
- [Plan · Goals](/developers/api/plan-goals)
- [Plan · Boards](/developers/api/plan-boards)
- [Plan · Tasks](/developers/api/plan-tasks)
- [Plan · Comments & files](/developers/api/plan-collaboration)
- [Plan · Home & search](/developers/api/plan-home)
- [Plan · Notifications & reports](/developers/api/plan-notifications)

**Dailybot Plan**

- [Overview](/developers/plan)
- [Concepts](/developers/plan/concepts)
- [Quickstart](/developers/plan/quickstart)
- [Authentication & scopes](/developers/plan/authentication)
- [Agents on Plan](/developers/plan/agents)
- [Conventions](/developers/plan/conventions)
- [Errors](/developers/plan/errors)
- [CLI for Plan](/developers/plan/cli)
- [Agent skill](/developers/plan/agent-skill)
- [Recipe: live board](/developers/plan/recipes/board-live-updates)
- [Recipe: home in one request](/developers/plan/recipes/home-in-one-request)
- [Recipe: bulk create](/developers/plan/recipes/bulk-create) (this page)
- [Recipe: move on PR merge](/developers/plan/recipes/move-on-pr-merge)
- [Recipe: goal progress](/developers/plan/recipes/goal-progress)
- [Recipe: webhooks](/developers/plan/recipes/webhooks)

**API guides**

- [Errors & Status Codes](/developers/errors)
- [Rate Limits](/developers/rate-limits)
- [Conventions](/developers/conventions)
- [API Changelog](/developers/api-changelog)
- [Recipes](/developers/recipes)

**Developer Features**

- [Custom commands](/developers/custom-commands)
- [Serverless commands](/developers/serverless)
- [Webhooks & events](/developers/webhooks)
- [Automation API trigger](/developers/workflow-trigger)
- [Activity API](/developers/activity-api)

**CLI**

- [Overview](/developers/cli)
- [Authentication](/developers/cli-authentication)
- [Command reference](/developers/cli-reference)
- [CI/CD recipes](/developers/cli-ci-cd)
- [Configuration](/developers/cli-configuration)
- [Troubleshooting](/developers/cli-troubleshooting)

**Agent Skill**

- [Overview](/developers/agent-skill)
- [Skills catalog](/skills)

---

## Site navigation

**Product:**
- [Home](/)
- [Product](/product)
- [Pricing](/pricing)
- [Enterprise](/enterprise)
- [Integrations](/integrations)
- [Templates](/templates)

**Resources:**
- [Blog](/blog)
- [Academy](/academy)
- [Changelog](/changelog)
- [Help Center](/help)
- [Developers](/developers)
- [Agents](/agents)

**Company:**
- [About](/about)
- [Careers](/careers)
- [Security](/security)
- [Contact Sales](/demo)

**Connect:**
- [LinkedIn](https://www.linkedin.com/company/dailybot/)
- [X/Twitter](https://twitter.com/dailybot)
- [GitHub](https://github.com/Dailybot-Inc)
- [YouTube](https://www.youtube.com/channel/UC3uM9V52vwX7e3vQpCc4qvA)

