> ## Documentation Index
> Fetch the complete documentation index at: https://docs.klara-ai.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Field Catalog

> Discover the field IDs, types, and allowed option values for an application

Returns every field on an application's form with its type, category, allowed option values, and whether it can be written via [Update Application](/api-reference/update-application). Use it to drive your integration programmatically instead of maintaining a hand-copied field list — the catalog always matches what the API accepts.

```text theme={null}
GET /api/external/applications/{id}/fields
```

The catalog is the same for every application on the same form, so fetching it once (e.g. for your first application) is enough until you're told the form has changed.

## Authentication

Requires an API key with `applications:read` scope. The application must belong to the organization associated with the API key.

```bash theme={null}
Authorization: Bearer klara_{client_id}.{secret}
```

## Path parameters

<ParamField path="id" type="string" required>
  UUID of the application — from the [Create Application](/api-reference/create-application) response, a webhook, or [List Applications](/api-reference/list-applications).
</ParamField>

## Response

<ResponseField name="application_id" type="string">
  UUID of the application.
</ResponseField>

<ResponseField name="fields" type="array">
  Every field on the application's form, in form order.

  <Expandable title="field properties">
    <ResponseField name="id" type="string">
      Field ID — the key used in `data.fields` on [Get Application](/api-reference/get-application) and in the [Update Application](/api-reference/update-application) request body.
    </ResponseField>

    <ResponseField name="label" type="string">
      The label shown to the applicant.
    </ResponseField>

    <ResponseField name="type" type="string">
      Field type: `text`, `select`, `multi_select`, `boolean`, `date`, `currency`, `address`, `phone`, `percentage`, or `document`.
    </ResponseField>

    <ResponseField name="category" type="string">
      The form stage the field belongs to (e.g., `company`, `people`).
    </ResponseField>

    <ResponseField name="patchable" type="boolean">
      Whether the field can be written via [Update Application](/api-reference/update-application). `false` for document, person-scoped, and confirmation fields.
    </ResponseField>

    <ResponseField name="description" type="string | undefined">
      Helper text shown to the applicant, when configured.
    </ResponseField>

    <ResponseField name="sensitive" type="boolean | undefined">
      `true` when the field's value is excluded from outbound webhook payloads.
    </ResponseField>

    <ResponseField name="options" type="array | undefined">
      For `select` and `multi_select` fields: the allowed values as `{ value, label }` pairs. [Update Application](/api-reference/update-application) rejects values not in this list.
    </ResponseField>
  </Expandable>
</ResponseField>

## Examples

<CodeGroup>
  ```bash cURL theme={null}
  curl "https://app.klara-ai.com/api/external/applications/550e8400-e29b-41d4-a716-446655440000/fields" \
    -H "Authorization: Bearer klara_abc123def456.your-secret-here"
  ```

  ```javascript Node.js theme={null}
  const applicationId = '550e8400-e29b-41d4-a716-446655440000';

  const response = await fetch(
    `https://app.klara-ai.com/api/external/applications/${applicationId}/fields`,
    {
      headers: {
        'Authorization': 'Bearer klara_abc123def456.your-secret-here'
      }
    }
  );

  const catalog = await response.json();
  const patchable = catalog.fields.filter((f) => f.patchable);
  ```

  ```python Python theme={null}
  import requests

  application_id = '550e8400-e29b-41d4-a716-446655440000'

  response = requests.get(
      f'https://app.klara-ai.com/api/external/applications/{application_id}/fields',
      headers={'Authorization': 'Bearer klara_abc123def456.your-secret-here'}
  )

  catalog = response.json()
  patchable = [f for f in catalog['fields'] if f['patchable']]
  ```
</CodeGroup>

**Response:**

```json theme={null}
{
  "application_id": "550e8400-e29b-41d4-a716-446655440000",
  "fields": [
    {
      "id": "company_name",
      "label": "Company name",
      "type": "text",
      "category": "company",
      "patchable": true
    },
    {
      "id": "industry",
      "label": "Industry",
      "type": "select",
      "category": "company",
      "patchable": true,
      "options": [
        { "value": "technology", "label": "Technology" },
        { "value": "finance", "label": "Finance" }
      ]
    },
    {
      "id": "full_name",
      "label": "Full name",
      "type": "text",
      "category": "people",
      "patchable": false,
      "sensitive": true
    },
    {
      "id": "proof_of_id",
      "label": "Proof of ID",
      "type": "document",
      "category": "people",
      "patchable": false
    }
  ]
}
```

## Errors

| Status | Error                                                | Cause                                                             |
| ------ | ---------------------------------------------------- | ----------------------------------------------------------------- |
| `401`  | `Invalid API key`                                    | API key is invalid, expired, or inactive                          |
| `401`  | `API key missing required scopes: applications:read` | Key lacks the required scope                                      |
| `404`  | `Application not found`                              | Application does not exist or belongs to a different organization |
| `500`  | `Internal server error`                              | An unexpected error occurred                                      |
