# Bundle export zip

> Export a space (subspace / app) as a ZIP bundle containing all agents, automations, projects, templates, apps, and media files. The ZIP includes a manifest.json, individual item files in type directories, and media files downloaded from storage.

- Source: https://www.taskade.com/docs/rest/bundle-export-zip
- Section: REST API
- Endpoint: `GET /bundles/{spaceId}/export/zip` (API v1)
- Index of all pages: https://www.taskade.com/docs/llms.txt

## GET `/bundles/{spaceId}/export/zip`

Export a space (subspace / app) as a ZIP bundle containing all agents, automations, projects, templates, apps, and media files. The ZIP includes a manifest.json, individual item files in type directories, and media files downloaded from storage.

Base URL: `https://www.taskade.com/api/v1`

### Authentication

Send a personal access token or an OAuth 2.0 access token as a bearer token. Create a personal access token at [taskade.com/settings/api](https://www.taskade.com/settings/api).

```http
Authorization: Bearer tskdp_your_token_here
```

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `format` | query | `string` | No | Export format: "zip" (default) or "tsk" (.tsk app kit). |
| `spaceId` | path | `string` | Yes | The space (subspace / app) ID to export. |

### Example request

```bash
curl -X GET "https://www.taskade.com/api/v1/bundles/<spaceId>/export/zip" \
  -H "Authorization: Bearer $TASKADE_TOKEN"
```

### Responses

#### `402` — Payment required: the workspace plan does not include app bundle export. The body carries code "PAYMENT_REQUIRED" and featureId "space.bundle.export".

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `ok` | `boolean` | Yes | — |
| `message` | `string` | Yes | — |
| `code` | `string` | Yes | — |
| `statusMessage` | `string` | Yes | — |
| `featureId` | `string` | No | The plan entitlement the request needs, set on some PAYMENT_REQUIRED errors. |

#### `4XX` — Error description

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `ok` | `boolean` | Yes | — |
| `message` | `string` | Yes | — |
| `code` | `string` | Yes | — |
| `statusMessage` | `string` | Yes | — |
| `featureId` | `string` | No | The plan entitlement the request needs, set on some PAYMENT_REQUIRED errors. |

### Errors

Errors return an `ok: false` envelope. Rate limiting returns `429` with `x-rate-limit-limit`, `x-rate-limit-remaining` and `x-rate-limit-reset` headers. `x-rate-limit-reset` is the number of seconds until the window reopens. `Retry-After` is not sent, so schedule retries from `x-rate-limit-reset`; retrying sooner will fail again.

```json
{ "ok": false, "message": "Unauthorized", "code": "UNAUTHORIZED" }
```

Rate limits for this version: enforced per endpoint; ceilings are not published and can change without notice. A `429` response carries `x-rate-limit-limit`, `x-rate-limit-remaining`, and `x-rate-limit-reset` (seconds until the window reopens). Back off from those headers rather than hardcoding numbers. Bundle import and export run under tighter limits than regular reads and writes, so schedule bulk transfers accordingly. See [Rate limits](https://www.taskade.com/docs/getting-started/rest-api-guide#rate-limits).
