# Get a form

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

Bitrix24 method: `crm.form.get` (REST v3).

Scope: `crm`. READONLY keys are supported.

## Behavior and parameters

Reads the form directly; an absent form returns 404. The selected blocks are `appearance`, `crm`, `fields`, `responsible`, `agreements`, `submission`, `callback`, `payment`, `booking`, `presetFields` and `dependencies`. Analytics, integrations and spam protection are excluded even if the upstream response contains them.

Legacy aliases remain: title/description/buttonCaption from appearance, result.successText/failureText from submission, responsible.userIds, fields and agreements. The raw agreement block is available as `agreementsSettings`. Agreement name is `AGREEMENT_<id>`; label is null. The separate consent API requires an additional scope and is not called. Person-name field type is now string; visible is true. Hidden-field equivalence is not established.

List/checkbox/radio fields receive items through one additional entity-field dictionary call; forms without such fields need one Bitrix24 call.

## Examples

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

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

For an OAuth application, use its key and add `Authorization: Bearer USER_SESSION_TOKEN`.

## Response fields

| Field | Type | Description |
|---|---|---|
| success | boolean | true |
| data | object | Result |
| data.id | number | ID |
| data.name | string | Name |
| data.fields | array | id, name, type, label, required, visible, multiple, placeholder, items, sort, valueType, value |
| data.result | object | successText, failureText |
| data.responsible | object | userIds, checkWorkTime |
| data.agreements | array | id, name, label, required, checked |
| data.agreementsSettings | object \| null | enabled, items |

## Errors

| HTTP | Code | Meaning |
|---|---|---|
| 400 | `INVALID_PARAMS` | Malformed query or id |
| 400 | `UNKNOWN_FILTER_FIELD` | Unknown query parameter or filter |
| 401 | `MISSING_API_KEY / TOKEN_MISSING` | Missing key or Bitrix24 credentials |
| 403 | `SCOPE_DENIED` | The key lacks crm |
| 403 | `BITRIX_ACCESS_DENIED / CRM_FORM_*` | Bitrix24 refused access |
| 404 | `ENTITY_NOT_FOUND` | Bitrix24 did not find the record |
| 409 | `CRM_FORM_*` | Bitrix24 domain refusal; code and message preserved |
| 422 | `BITRIX_ERROR` | Other Bitrix24 refusal; message and b24Code retained |
| 429 | `RATE_LIMITED` | Bitrix24 rate limit |
| 502 | `BITRIX_UNAVAILABLE` | Unavailable or malformed Bitrix24 response |
| 503 | `BITRIX_TIMEOUT` | Bitrix24 timeout |

[Common API errors](/docs/errors).

## See also

- [CRM forms](/docs/entities/crm-forms)
- [API reference](/docs/api-reference)
