# List fields

> Get all custom fields for a project

- Source: https://www.taskade.com/docs/actions/list-fields
- Section: Action API
- Endpoint: `POST /listFields` (API v2)
- Index of all pages: https://www.taskade.com/docs/llms.txt

## POST `/listFields`

Get all custom fields for a project

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
```

### Request body

`application/json`

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `projectId` | `string` | Yes | The project ID to get fields for |

### Example request

```bash
curl -X POST "https://www.taskade.com/api/v2/listFields" \
  -H "Authorization: Bearer $TASKADE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"projectId":"<projectId>"}'
```

### Responses

#### `200` — Default response

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `ok` | `boolean` | Yes | — |
| `items` | `object[]` | Yes | — |
| `items[].id` | `string` | Yes | — |
| `items[].data` | `object` | Yes | — |
| `items[].data.type` | `string` | Yes | Allowed values: `boolean`, `Note`, `Timestamp`, `TimestampAt`, `TimestampAuthor`, `Select`, `number`, `string`, `Password`, `Rating`, `Relationship`, `Assign`, `DateTime`, `DateRange`, `Event`, `NodeText`, `NodeCompleted`, `Media`, `TimeTracking`, `Unimplemented`. |
| `items[].data.fillerConfig` | `object` | No | — |
| `items[].data.fillerConfig.type` | `string` | Yes | Allowed values: `string.translate`, `string.summarize`, `string.extract`, `string.custom`, `Select.pick`. |
| `items[].data.fillerConfig.sourceRef` | `object` | Depends | Required when `type` is `string.translate`, `string.summarize`, `string.extract`, or `Select.pick`. |
| `items[].data.fillerConfig.sourceRef.type` | `string` | Yes | Allowed values: `field`. |
| `items[].data.fillerConfig.sourceRef.fieldPath` | `string` | Yes | — |
| `items[].data.fillerConfig.targetLang` | `string` | Depends | Required when `type` is `string.translate`. |
| `items[].data.fillerConfig.additionalInstructions` | `string` | No | — |
| `items[].data.fillerConfig.entity` | `object` | Depends | Required when `type` is `string.extract`. |
| `items[].data.fillerConfig.entity.type` | `string` | Yes | Allowed values: `email_address`, `first_name`, `last_name`, `phone_number`, `domain_name`, `link`, `date`, `time`, `year`, `custom`. |
| `items[].data.fillerConfig.entity.instructions` | `string` | Depends | Required when `type` is `custom`. |
| `items[].data.fillerConfig.instructions` | `string` | Depends | Required when `type` is `string.custom`. |
| `items[].data.fillerConfig.permittedOptionIds` | `string[]` | Depends | Required when `type` is `Select.pick`. |
| `items[].data.displayName` | `string` | Depends | Required when `type` is `Select`, `number`, `string`, `Rating`, `Relationship`, or `TimeTracking`. |
| `items[].data.description` | `string` | No | — |
| `items[].data.options` | `object` | Depends | Required when `type` is `Select`. |
| `items[].data.defaultOption` | `string` | No | — |
| `items[].data.render` | `object` | Depends | Required when `type` is `number`. |
| `items[].data.render.type` | `string` | Yes | Allowed values: `text`. |
| `items[].data.format` | `object` | Depends | Required when `type` is `number`. |
| `items[].data.format.type` | `string` | Yes | Allowed values: `decimal`, `currency`, `unit`. |
| `items[].data.format.config` | `object` | Depends | Required when `type` is `currency` or `unit`. |
| `items[].data.format.config.type` | `string` | Yes | Allowed values: `standard`. |
| `items[].data.format.config.code` | `string` | Yes | — |
| `items[].data.constraints` | `object` | No | — |
| `items[].data.constraints.unique` | `object` | No | — |
| `items[].data.constraints.unique.type` | `string` | Yes | Allowed values: `unique`. |
| `items[].data.title` | `string` | No | — |
| `items[].data.hashAlgorithm` | `string` | No | Allowed values: `bcrypt`, `argon2`, `scrypt`, `pbkdf2`. |
| `items[].data.minLength` | `integer` | No | — |
| `items[].data.maxLength` | `integer` | No | — |
| `items[].data.max` | `integer` | No | — |
| `items[].data.icon` | `string` | No | Allowed values: `star`, `heart`. |

A nested field marked Yes is required whenever its parent object is present.

### 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).
