For AI agents: markdown of this page — /docs-content-en/entities/crm-forms.md documentation index — /llms.txt
CRM forms
Read and configure CRM forms, publish them on a website and submit visitor data to them.
Scope: crm | Base URL: https://vibecode.bitrix24.com/v1 | Authorization: X-Api-Key
Documentation sections
- Form management — create, read, update, validate, activate and delete forms
- Builder dictionaries — form properties, CRM entity fields, Bitrix24 account settings and scenarios
- Publishing and results — embedding code, website widgets, Open Channels and visitor data submission
Key fields
| Field | Description |
|---|---|
Fieldid |
DescriptionForm ID. List: GET /v1/crm-forms |
Fieldname |
DescriptionForm name in the list of forms |
Fieldactive |
DescriptionWhether the form is active. Can be changed only through activation and deactivation |
FieldupdatedTime |
DescriptionTime of the last change. Passed in write requests to protect against overwriting someone else's changes |
Fieldfields[].name |
DescriptionForm field name, for example LEAD_NAME, LEAD_PHONE |
Fieldfields[].required |
DescriptionWhether the field is required for submission |
Fieldresponsible.userIds |
DescriptionUsers responsible for the form's results. List: GET /v1/users |
To read a full form or select specific properties, see Get a form. Form contract fields lists top-level metadata only. Take nested property names and values from the full GET response for your configured form.
What to know before you start
- A read-only key can use GET requests and both form validations —
POST /v1/crm-forms/validateandPOST /v1/crm-forms/:id/validate. Creating, updating, activating or deactivating, deleting and submitting visitor data require a key with write access. Submitting visitor data can create CRM records and trigger automation and notifications. - Without filters, the list includes active and inactive forms and returns one page. By default, it returns 11 scalar fields. Use
select, for exampleid,name,crm.entityScheme,responsible.userIds,updatedTime, to request sections or subfields. Bitrix24 validates filters, sorting and pagination. - A full form contains the 11 scalar fields and 14 configuration sections, including
analytics,integrationsandspamProtection. The object is passed through without rebuilding agreements, adding top-level aliases or filling missing fields. An explicitselectcan return a partial object withoutid,nameorfields. - User content, public URLs and embedding signatures are preserved. Only credentials for the current Bitrix24 connection are replaced, with affected paths in
meta.redacted. Such a response is not a complete configuration for saving back. Credentials are always hidden in errors and logs. - For an update, first read the form and keep
updatedTime. Activate and deactivate return the actualactiveandupdatedTime, including the unchanged version when no write was needed. If the additional read after a confirmed create or update fails, the response remains successful withdata.idandmeta.warnings. Read the form before the next write, without repeating the successful operation. - Create, update, validate and embedding-update requests accept a flat body or an object-valued
fieldswrapper. For versioned updates, keepupdatedTimeat the root. The form's ownfieldsarray remains a form property. Bitrix24 validates settings and business rules. CRM_FORM_PARTIALLY_CREATEDis an error: the form already exists; its ID is inerror.id. GET the form, then correct or delete it. Do not repeat creation. There is no automatic deletion or retry.
Limits
| Limit | Value |
|---|---|
| LimitForms per list page | ValueBitrix24 defaults when limit and offset are omitted. Both parameters are optional and validated by Bitrix24 |
| LimitActive forms | Valuelimits.activeForms in the builder configuration |
| LimitDeletion | Valueirreversible; an active form is deleted only with confirm=true or confirmed=true |
| LimitRequest rate | Valueshared across the Vibecode API — see Limits and optimization |
Quick start
Get the first two forms in your Bitrix24 account:
curl 'https://vibecode.bitrix24.com/v1/crm-forms?limit=2' \
-H 'X-Api-Key: YOUR_API_KEY'
{
"success": true,
"data": [
{
"id": 1,
"code": "1_kontaktnye_dannye",
"name": "Contact details",
"active": true,
"system": true,
"languageId": "ru",
"templateId": "light",
"createdTime": "2020-04-22T06:13:05Z",
"updatedTime": "2020-04-22T06:13:05Z",
"activeChangedById": 1,
"activeChangedTime": "2020-04-22T06:13:05Z"
},
{
"id": 3,
"code": "3_obratnaya_svyaz",
"name": "Feedback form",
"active": true,
"system": true,
"languageId": "ru",
"templateId": "light",
"createdTime": "2020-04-22T06:13:05Z",
"updatedTime": "2020-04-22T06:13:05Z",
"activeChangedById": 1,
"activeChangedTime": "2020-04-22T06:13:05Z"
}
]
}
Live response from a Russian-language portal: code and languageId are portal values returned as stored. code is the exact value for the ?code= filter, and another portal has its own codes. Only the display name appears here in English.
Full example
Validate a draft, create an inactive form, activate it, submit visitor data, deactivate it and delete it.
- Validate the draft without saving it:
curl -X POST 'https://vibecode.bitrix24.com/v1/crm-forms/validate' \
-H 'X-Api-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"name":"Contact form","crm":{"entityScheme":1},"fields":[{"name":"LEAD_NAME","type":"string","label":"Name","required":true,"multiple":false},{"name":"LEAD_PHONE","type":"phone","label":"Phone","required":false,"multiple":false}]}'
{ "success": true, "data": { "valid": true, "violations": [] } }
- Create the form inactive — with the same body plus
"active":false:
curl -X POST 'https://vibecode.bitrix24.com/v1/crm-forms' \
-H 'X-Api-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"name":"Contact form","active":false,"crm":{"entityScheme":1},"fields":[{"name":"LEAD_NAME","type":"string","label":"Name","required":true,"multiple":false},{"name":"LEAD_PHONE","type":"phone","label":"Phone","required":false,"multiple":false}]}'
The 201 response contains the saved form, or data.id with meta.warnings if the additional read failed. Keep data.id, which is 87 in this example. A warning does not mean creation failed: GET the form instead of repeating POST. If creation returns CRM_FORM_PARTIALLY_CREATED, use error.id to read and correct or delete the existing form, without repeating creation.
- Activate the form:
curl -X POST 'https://vibecode.bitrix24.com/v1/crm-forms/87/activate' \
-H 'X-Api-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{}'
{ "success": true, "data": { "active": true, "updatedTime": "2026-10-27T13:48:44Z" } }
- Submit visitor data:
curl -X POST 'https://vibecode.bitrix24.com/v1/crm-forms/87/results' \
-H 'X-Api-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"fields":{"LEAD_NAME":"Anna","LEAD_PHONE":"+12025550123"},"fromUrl":"https://example.com/contact"}'
{ "success": true, "data": { "resultId": 235 } }
- Deactivate the form:
curl -X POST 'https://vibecode.bitrix24.com/v1/crm-forms/87/deactivate' \
-H 'X-Api-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{}'
{ "success": true, "data": { "active": false, "updatedTime": "2026-10-27T13:48:46Z" } }
- Delete the form. An inactive form is deleted without
confirm:
curl -X DELETE 'https://vibecode.bitrix24.com/v1/crm-forms/87' \
-H 'X-Api-Key: YOUR_API_KEY'
{ "success": true, "data": { "deleted": true } }
Endpoint reference
| Method | Path | Bitrix24 method | Description |
|---|---|---|---|
| MethodPOST | Path/v1/crm-forms |
Bitrix24 methodcrm.form.add |
DescriptionCreate a form |
| MethodGET | Path/v1/crm-forms |
Bitrix24 methodcrm.form.list |
DescriptionList forms |
| MethodGET | Path/v1/crm-forms/:id |
Bitrix24 methodcrm.form.get |
DescriptionGet a form |
| MethodPATCH | Path/v1/crm-forms/:id |
Bitrix24 methodcrm.form.update |
DescriptionUpdate a form |
| MethodDELETE | Path/v1/crm-forms/:id |
Bitrix24 methodcrm.form.delete |
DescriptionDelete a form |
| MethodPOST | Path/v1/crm-forms/validate |
Bitrix24 methodcrm.form.validate |
DescriptionValidate a form without saving it |
| MethodPOST | Path/v1/crm-forms/:id/activate |
Bitrix24 methodcrm.form.activate |
DescriptionActivate a form |
| MethodPOST | Path/v1/crm-forms/:id/deactivate |
Bitrix24 methodcrm.form.deactivate |
DescriptionDeactivate a form |
| MethodGET | Path/v1/crm-forms/fields |
Bitrix24 methodcrm.form.field.list |
DescriptionForm contract fields |
| MethodGET | Path/v1/crm-forms/fields/:name |
Bitrix24 methodcrm.form.field.get |
DescriptionGet a form contract field |
| MethodGET | Path/v1/crm-forms/configuration |
Bitrix24 methodcrm.form.configuration.get |
DescriptionGet the builder configuration |
| MethodGET | Path/v1/crm-forms/entity-fields |
Bitrix24 methodcrm.form.entityfield.list |
DescriptionList entity fields |
| MethodGET | Path/v1/crm-forms/scenarios |
Bitrix24 methodcrm.form.scenario.list |
DescriptionList scenarios |
| MethodGET | Path/v1/crm-forms/scenario-categories |
Bitrix24 methodcrm.form.scenariocategory.list |
DescriptionList scenario categories |
| MethodGET | Path/v1/crm-forms/:id/embedding |
Bitrix24 methodcrm.form.embedding.get |
DescriptionEmbedding code |
| MethodPATCH | Path/v1/crm-forms/:id/embedding |
Bitrix24 methodcrm.form.embedding.update |
DescriptionEmbedding settings |
| MethodGET | Path/v1/crm-forms/:id/site-buttons |
Bitrix24 methodcrm.form.sitebutton.list |
DescriptionWebsite widgets |
| MethodGET | Path/v1/crm-forms/:id/openlines |
Bitrix24 methodcrm.form.openline.list |
DescriptionOpen Channels for a form |
| MethodPOST | Path/v1/crm-forms/:id/results |
Bitrix24 methodcrm.webform.result.add |
DescriptionSubmit visitor data, REST v2 |
The PRD name crm.form.embed.get maps to crm.form.embedding.get. The PRD name crm.form.fields.get for fields of selected CRM entities maps to crm.form.entityfield.list. crm.form.field.list and crm.form.field.get describe the form model itself. Visitor submissions use REST v2 and are separate from these REST v3 methods.
Error codes
CRM form errors
| HTTP | Code | When |
|---|---|---|
| HTTP400 | CodeINVALID_PARAMS |
WhenInvalid request structure or a parameter rejected by Bitrix24. The original code is in error.b24Code, with field diagnostics in error.validation when supplied |
| HTTP400 | CodeCRM_FORM_PARTIALLY_CREATED |
WhenThe form exists, but some settings were not saved. GET the form by error.id, then correct or delete it. Do not repeat creation |
| HTTP402 | CodeCRM_FORM_WRITE_RESTRICTED |
WhenThe Bitrix24 plan (free or demo) does not allow writing CRM forms |
| HTTP402 | CodeCRM_FORM_ACTIVATION_LIMIT_REACHED |
WhenThe active-form limit has been reached |
| HTTP403 | CodeCRM_FORM_SYSTEM_IMMUTABLE |
WhenA system form cannot be updated or deleted |
| HTTP409 | CodeCRM_FORM_VERSION_MISMATCH |
WhenThe form changed after it was read. The current version is in error.currentUpdatedTime |
| HTTP409 | CodeCRM_FORM_DELETE_CONFIRMATION_REQUIRED |
WhenAn active form is deleted only with confirm=true or confirmed=true |
| HTTP500 | CodeCRM_FORM_SIDE_EFFECT_FAILED |
WhenThe write has already been performed, but the next step failed. Read the form before retrying |
System errors
| HTTP | Code | When |
|---|---|---|
| HTTP401 | CodeMISSING_API_KEY |
WhenX-Api-Key is not passed |
| HTTP403 | CodeSCOPE_DENIED |
WhenThe key does not have the crm scope |
| HTTP403 | CodeBITRIX_ACCESS_DENIED |
WhenThe Bitrix24 user lacks permission. Original code: error.b24Code |
| HTTP403 | CodeBITRIX_INSUFFICIENT_SCOPE |
WhenThe Bitrix24 token lacks the required scope. Original code: error.b24Code |
| HTTP409 | CodeCRM_FORM_REST_NOT_ENABLED |
WhenCRM form REST methods are disabled. The condition is detected from the missing-method code in error.b24Code |
| HTTP403 | CodeWRITE_BLOCKED_READONLY_KEY |
WhenA write was attempted with a read-only key |
| HTTP404 | CodeENTITY_NOT_FOUND |
WhenThe form was not found |
| HTTP422 | CodeBITRIX_ERROR |
WhenAnother Bitrix24 refusal, with the original code in error.b24Code |
Full list of common API errors — Errors.