## Get a form

`GET /v1/crm-forms/:id`

Reads the settings of one CRM form by ID to learn the field names before submitting visitor data or to prepare a form update.

## Parameters

| Parameter | Type | Required | Description |
|----------|-----|:-----:|----------|
| `id` (path) | integer | yes | Form ID. List: [List forms](/docs/entities/crm-forms/list) |
| `select` (query) | string | no | Comma-separated properties or nested paths. Without it, all 11 scalar properties and 14 sections are requested |

## Examples

### curl — personal key

```bash
curl "https://vibecode.bitrix24.com/v1/crm-forms/91" \
  -H "X-Api-Key: YOUR_API_KEY"
```

### curl — OAuth application

```bash
curl "https://vibecode.bitrix24.com/v1/crm-forms/91" \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN"
```

### JavaScript — personal key

```javascript
const res = await fetch('https://vibecode.bitrix24.com/v1/crm-forms/91', {
  headers: {
    'X-Api-Key': 'YOUR_API_KEY',
  },
})

const { data } = await res.json()
for (const field of data.fields) console.log(field.name, field.type, field.required)
```

### JavaScript — OAuth application

```javascript
const res = await fetch('https://vibecode.bitrix24.com/v1/crm-forms/91', {
  headers: {
    'X-Api-Key': 'YOUR_APP_KEY',
    'Authorization': 'Bearer USER_SESSION_TOKEN',
  },
})

const { data } = await res.json()
```

## Response fields

| Field | Type | Description |
|------|-----|----------|
| `success` | boolean | `true` on success |
| `data` | object | Form properties as returned by Bitrix24, restricted to the requested `select`. Top-level property metadata: [Form contract fields](/docs/entities/crm-forms/fields) |
| `meta.redacted` | string[] | Present only when credentials of the current connection are found in the content. `JSON Pointer` paths identify replaced values. Do not save this representation back as a complete configuration |

The 14 sections are `appearance`, `crm`, `dependencies`, `presetFields`, `responsible`, `agreements`, `submission`, `payment`, `callback`, `booking`, `analytics`, `spamProtection`, `integrations`, `fields`. Content and field properties are preserved, including strings that resemble credentials. Only exact occurrences of the current connection's credentials are replaced.

Take nested property names and their values from the full `GET /v1/crm-forms/:id` response for a specific configured form. The metadata reference describes only the top level, not the structure of nested sections.

## Response example

The main properties are shown. The full response also includes the other properties from [Form contract fields](/docs/entities/crm-forms/fields).

```json
{
  "success": true,
  "data": {
    "id": 91,
    "name": "VIBE-PROBE 777758 parity",
    "active": false,
    "updatedTime": "2026-11-05T08:16:55Z",
    "crm": {
      "entityScheme": 1,
      "duplicateMode": "",
      "dealCategoryId": null,
      "dealDuplicateControlEnabled": false,
      "smartProcessCategoryId": null,
      "smartProcessDuplicateControlEnabled": false
    },
    "responsible": {
      "userIds": [],
      "checkWorkTime": false
    },
    "agreements": {
      "enabled": false,
      "items": []
    },
    "fields": [
      {
        "name": "LEAD_NAME",
        "type": "string",
        "label": null,
        "sort": 10,
        "required": false,
        "multiple": false,
        "placeholder": null,
        "valueType": null,
        "value": null
      }
    ]
  }
}
```

## Error response example

404 — no form with this `id`:

```json
{
  "success": false,
  "error": {
    "code": "ENTITY_NOT_FOUND",
    "message": "Record with ID = `999999999` not found",
    "b24Code": "BITRIX_REST_V3_EXCEPTION_ENTITYNOTFOUNDEXCEPTION"
  }
}
```

## Errors

| HTTP | Code | Description |
|------|-----|----------|
| 400 | `INVALID_PARAMS` | `id` is not a positive safe integer |
| 400 | `INVALID_PARAMS` | An unknown query parameter was passed or `select` has an invalid structure |
| 400 | `INVALID_PARAMS` | Bitrix24 rejected the projection. The original code is in `error.b24Code` |
| 404 | `ENTITY_NOT_FOUND` | No form with this `id`. The original code is in `error.b24Code` |
| 403 | `BITRIX_ACCESS_DENIED` | The Bitrix24 user lacks permission to access forms |
| 403 | `BITRIX_INSUFFICIENT_SCOPE` | The Bitrix24 token lacks the required scope |
| 409 | `CRM_FORM_REST_NOT_ENABLED` | The CRM form REST methods are unavailable on this Bitrix24 account. This does not mean that an individual form is missing |
| 400–599 | `CRM_FORM_*` | Rejection under form rules. The code and HTTP status are preserved. The original code is in `error.b24Code` |
| 422 | `BITRIX_ERROR` | Another Bitrix24 rejection. The reason is in `error.message`. The original code is in `error.b24Code` |
| 429 | `RATE_LIMITED` | Request rate exceeded. Follow the `Retry-After` header |
| 502 | `BITRIX_UNAVAILABLE` | Bitrix24 returned an unexpected response shape |
| 502 | `BITRIX_UNAVAILABLE` | Bitrix24 is unavailable: a server error or a dropped connection |
| 503 | `BITRIX_TIMEOUT` | Bitrix24 did not respond in time. The read can be retried |
| 401 | `MISSING_API_KEY` | The `X-Api-Key` header is missing |
| 401 | `TOKEN_MISSING` | The key has no configured Bitrix24 credentials |
| 403 | `SCOPE_DENIED` | The Vibecode API key lacks the `crm` scope |

Full list of common API errors — [Errors](/docs/errors).

## Known specifics

Reading the form makes one request. Fetch value options for CRM fields separately from [List entity fields](/docs/entities/crm-forms/entity-fields). They are not added to `fields[]` automatically.

## See also

- [List forms](/docs/entities/crm-forms/list)
- [Update a form](/docs/entities/crm-forms/update)
- [Submit visitor data](/docs/entities/crm-forms/results)
- [Get the builder configuration](/docs/entities/crm-forms/configuration)
- [Form contract fields](/docs/entities/crm-forms/fields)
- [CRM forms](/docs/entities/crm-forms)
