# Zip

> Export a space as a ZIP bundle. Returns raw binary with appropriate headers.

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

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

Export a space as a ZIP bundle. Returns raw binary with appropriate headers.

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

### 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/v2/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. |

### 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. If you need sustained throughput, prefer batching (operations like `/createTask` accept arrays) over tightening polling loops. See [Rate limits](https://www.taskade.com/docs/getting-started/action-api-guide#rate-limits).
