---
title: "Run a batch of job operations"
method: POST
path: "/jobs/batch"
tags: ["Jobs"]
---

# Run a batch of job operations

`POST /jobs/batch`

## Request

- Base URL: `https://api.cavuno.com/v1`
- URL: `https://api.cavuno.com/v1/jobs/batch`
- Auth: HTTP bearer

Runs up to 100 job operations in a single request. Supported sub-operations are create (`POST`), update (`PATCH`), delete (`DELETE`), publish, pause, expire, and duplicate. Each sub-operation runs independently; the response is HTTP 200 for any well-formed batch, and the per-operation outcome is reported on each entry of the `data` array.

## Request body

- BatchRequestBody
  - `operations` union[], required: Array of sub-operations to execute. Each entry runs independently and reports its result on the corresponding entry of the response `data` array. Sub-operation `id` values must be unique within the batch. Up to 100 entries.
    - union
      - object
        - `id` string, required
        - `method` 'POST', required
        - `body` unknown
        - `action` string
        - `resourceId` string
      - object
        - `id` string, required
        - `method` 'PATCH', required
        - `body` unknown
        - `resourceId` string, required
      - object
        - `id` string, required
        - `method` 'DELETE', required
        - `resourceId` string, required

## Response `200`

Successful response. Inspect each entry of the `data` array for the per-sub-operation status.

- object
  - `object` 'batch_result', required
  - `data` object[], required
    - `id` string, required
    - `status` number, required
    - `data` unknown
    - `error` object
      - `code` string, required
      - `message` string, required
      - `details` unknown
      - `upgrade` PlanUpgradeHint: Present only on Operator API errors caused by the board's Cavuno plan. Read `GET /v1/billing/subscription` to choose between `checkout` and `changePlan`, call it with `{ "planKey": requiredPlan }`, and give the returned `url` to a person to confirm. Each `path` is relative to the API origin, not to a `/v1` base URL. Both endpoints need `billing.manage`. Board API errors never include it.
        - `capability` 'activeJobsLimit' | 'teamSeatLimit' | 'canBePublic' | 'canRemoveBranding' | 'apiAccess', required: The plan capability that blocked the request, named as in `GET /v1/billing/subscription` `capabilities`.
        - `requiredPlan` 'starter' | 'basic' | 'grow' | 'advanced' | 'scale': The cheapest self-serve plan that unlocks the action. Pass it as `planKey`. Omitted when it cannot be told without more information; read `GET /v1/billing/subscription` and pick a higher plan.
        - `checkout` object, required: Starts a hosted checkout when the board has no active subscription (for example during a trial).
          - `method` 'POST', required
          - `path` '/v1/billing/checkout', required
        - `changePlan` object, required: Starts a hosted plan change when the board already has an active subscription.
          - `method` 'POST', required
          - `path` '/v1/billing/upgrade', required

## Other responses

- `400`: The batch was malformed (too many sub-operations, duplicate sub-operation IDs, or invalid sub-operation shapes).
- `413`: The request body exceeded 5 MB.

## Changes

- **2026-10-19** `c34152c38176`: 3 info
  - added the optional property `data/items/error/upgrade` to the response with the `200` status
  - added the optional property `error/upgrade` to the response with the `400` status
  - added the optional property `error/upgrade` to the response with the `413` status

[Operation history](https://skmtc.dev/cavuno/apis/cavuno-v1-rest-api/changes/jobs/batch/post.md)

---

[API](https://skmtc.dev/cavuno/apis/cavuno-v1-rest-api.md) · [All operations](https://skmtc.dev/cavuno/apis/cavuno-v1-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/cavuno/apis/cavuno-v1-rest-api/revisions/d5974dabff14?raw)
