---
title: "Create up to 100 tasks in one chunk"
method: POST
path: "/api/v0/tasks/batch"
tags: ["Tasks"]
---

# Create up to 100 tasks in one chunk

`POST /api/v0/tasks/batch`

## Request

- Base URL: `https://app.vibeflow.tools`
- URL: `https://app.vibeflow.tools/api/v0/tasks/batch`
- Auth: HTTP bearer

Ticket b4c525fa: { items: [...] } (max 100/req, named constant V0_BATCH_MAX_ITEMS) runs the single-create validation + quota + plan checks PER ITEM and returns per-item results [{ id } | { error: { code, message } }] in request order — one bad item never sinks the batch and the ordered array is the idMap the links phase needs. One multi-row insert per chunk; quota consumes per created item; quota-hit items fail per-item with 402 TASK_LIMIT. Runner marks NOT-RUNNABLE locally.

## Request body

- TaskBatchCreate: Body of POST /api/v0/tasks/batch (ticket b4c525fa): one chunk of single-create bodies (max 100/req — the server answers 400 BATCH_TOO_LARGE over the cap). Each item accepts the TaskCreate field set.
  - `items` TaskCreate[], required
    - `title` string, required
    - `description` string
    - `status` 'backlog' | 'todo' | 'in-progress' | 'review' | 'done' | 'cancelled'
    - `selector` string: Optional in v0 (annotation is local-only); required by the local handler today
    - `priority` string
  - `boardId` string

## Response `200`

Create up to 100 tasks in one chunk — success

- TaskBatchResult: Envelope of POST /api/v0/tasks/batch (ticket b4c525fa): ALWAYS 200 past request-level validation — per-item failures are data, never transport errors. `results` aligns to request order (the links-phase idMap); `quota` carries post-batch remaining capacity for the CLI chunk loop.
  - `created` integer, required
  - `failed` integer, required
  - `results` union[], required
    - union
      - object
        - `id` string, required
      - object
        - `error` object, required
          - `code` string, required
          - `message` string, required
  - `quota` object
    - `openRemaining` integer, nullable
    - `totalRemaining` integer, nullable

## Other responses

- `400`: Malformed request (includes invalid task/comment id form)
- `401`: Missing or invalid principal
- `403`: Lacking scope or membership
- `404`: Unknown id
- `429`: Rate limited — cloud per-token quota exceeded (reads 300/min, writes 60/min, token creation 10/hour); counters are per-replica, so the effective limit is the configured value × replicas. The response carries Retry-After.

---

[API](https://skmtc.dev/vibeflow/apis/vibeflow-api-v0.md) · [All operations](https://skmtc.dev/vibeflow/apis/vibeflow-api-v0/llms.txt) · [OpenAPI document](https://skmtc.dev/vibeflow/apis/vibeflow-api-v0/revisions/efd4ba944b0b?raw)
