สำหรับเอเจนต์ AI: markdown ของหน้านี้ — /docs-content-en/automation/workflows.md ดัชนีเอกสาร — /llms.txt
บทความในเอกสารมีให้บริการเป็นภาษาอังกฤษในขณะนี้
Workflows
A workflow is a multi-step scenario that runs on a Bitrix24 document. Unlike CRM triggers, which change an entity's state instantly, a workflow can include pauses to wait for external events, conditional branching, parallel branches, and delays. Typical scenarios: approval chains, automatic document preparation, scheduled notifications.
Lifecycle: launch (start) → execution → instance inspection (list) → pause handling via an event (event) or a log entry (activity-log) → termination (terminate).
Bitrix24 API: bizproc.workflow.*, bizproc.event.*, bizproc.activity.*
Scope: bizproc
Start a workflow
POST /v1/workflows/start
Starts a workflow instance from a template for a CRM entity, a list element or another Bitrix24 document. The document is given in one of two shapes: a type and ID for a deal, lead, contact or company, or an explicit Bitrix24 document identifier for everything else.
Request fields (body)
Pass templateId and exactly one document shape. A body that carries entityType or entityId together with documentId is rejected with 400 CONFLICTING_PARAMS.
| Field | Type | Required | Description |
|---|---|---|---|
templateId |
number | yes | Workflow template ID. Source: GET /v1/bizproc-templates |
entityType |
string | no | CRM entity type: deal, lead, contact, company. Required together with entityId when documentId is not passed |
entityId |
number | no | CRM entity ID. Required together with entityType when documentId is not passed. Source: GET /v1/deals, GET /v1/leads, GET /v1/contacts, GET /v1/companies |
documentId |
array | no | Bitrix24 document as an array of three non-empty strings [module, class, identifier]. Required when entityType and entityId are not passed. The module is crm, lists or disk. Pass the identifier as a string: a number in the third element is rejected. Values for CRM and lists are in the table below |
parameters |
object | no | Template parameter values. The set of fields is defined by the specific template in Bitrix24 |
documentId values by module:
| Module | Class | Identifier | Example |
|---|---|---|---|
crm |
CCrmDocumentDeal, CCrmDocumentLead, CCrmDocumentContact, CCrmDocumentCompany |
Type prefix plus entity ID: DEAL_5141, LEAD_12 |
["crm", "CCrmDocumentDeal", "DEAL_5141"] |
lists |
Bitrix\Lists\BizprocDocumentLists |
Element ID of an ordinary list. Source: GET /v1/lists/:iblockId/elements |
["lists", "Bitrix\\Lists\\BizprocDocumentLists", "7147"] |
lists |
BizprocDocument |
Element ID of a process in the Feed, infoblock type bitrix_processes. Source: GET /v1/lists/:iblockId/elements?iblockTypeId=bitrix_processes |
["lists", "BizprocDocument", "7171"] |
The class is the second element of the template's documentType in the GET /v1/bizproc-templates response, and the iblockId for the element source is the number in the third element, iblock_<id>. Pass the class as is: an ordinary list and a process in the Feed share the module lists, but their classes differ. Templates can be read only with an OAuth app key. If your template request passes select, include moduleId and entity in it, otherwise the first two elements of documentType come back as null.
The class and the identifier are passed to Bitrix24 unchanged. In JSON, escape the backslash in the class name by doubling it, as in the Bitrix\Lists\BizprocDocumentLists example.
Examples
curl — personal key
curl -X POST https://vibecode.bitrix24.com/v1/workflows/start \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"templateId":713,"entityType":"deal","entityId":5141}'
curl — OAuth application
curl -X POST https://vibecode.bitrix24.com/v1/workflows/start \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{"templateId":713,"entityType":"deal","entityId":5141}'
JavaScript — personal key
const res = await fetch('https://vibecode.bitrix24.com/v1/workflows/start', {
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
templateId: 713,
entityType: 'deal',
entityId: 5141,
}),
})
const data = await res.json()
console.log(data.data.workflowId)
JavaScript — OAuth application
const res = await fetch('https://vibecode.bitrix24.com/v1/workflows/start', {
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
'Content-Type': 'application/json',
},
body: JSON.stringify({
templateId: 713,
entityType: 'deal',
entityId: 5141,
}),
})
const data = await res.json()
Response fields
| Field | Type | Description |
|---|---|---|
success |
boolean | true on a successful start |
data.workflowId |
string | Unique identifier of the started workflow instance |
Response example
HTTP 201 Created
{
"success": true,
"data": {
"workflowId": "69f0c2d5ade389.22457798"
}
}
Error response example
400 — both document shapes in one body:
{
"success": false,
"error": {
"code": "CONFLICTING_PARAMS",
"message": "Pass either { entityType, entityId } OR { documentId }, not both. Pick the shape that matches your target document namespace."
}
}
Errors
| HTTP | Code | Description |
|---|---|---|
| 400 | MISSING_PARAMS |
templateId was not provided |
| 400 | MISSING_PARAMS |
documentId was not provided and the CRM shape is incomplete: entityType or entityId is missing |
| 400 | CONFLICTING_PARAMS |
entityType or entityId was passed together with documentId |
| 400 | INVALID_DOCUMENT_ID |
documentId is not an array, does not have three elements, or one of the elements is empty or not a string |
| 400 | INVALID_DOCUMENT_ID |
The module in documentId is not crm, lists or disk |
| 400 | INVALID_ENTITY_TYPE |
entityType is not deal, lead, contact or company. For other documents, use documentId |
| 401 | MISSING_API_KEY |
The X-Api-Key header was not provided |
| 401 | INVALID_API_KEY |
The key is not recognized — no such key exists on the platform |
| 401 | TOKEN_MISSING |
The key has no connected Bitrix24 tokens |
| 401 | TOKEN_EXPIRED |
The OAuth user session expired — re-authorize via /v1/oauth/authorize |
| 403 | SCOPE_DENIED |
The key is missing the bizproc scope |
| 403 | BITRIX_ACCESS_DENIED |
Bitrix24 denied access |
| 409 | BIZPROC_MODULE_NOT_ENABLED |
Business Processes are not available on the account: the module is not included in the plan, or it is switched off in account settings. Ask an account administrator to enable Business Processes — until then the method answers the same way for any number of retries |
| 422 | BITRIX_ERROR |
No template with the given templateId was found. message is Template not found |
| 422 | BITRIX_ERROR |
The class in documentId does not match the template's document type. message is Template type and DOCUMENT_ID mismatch! |
| 422 | BITRIX_ERROR |
There is no document with the identifier from the third element of documentId: the document does not exist, or a value other than its ID was passed, for example iblock_<id> from the template's documentType. message is Wrong DOCUMENT_ID! |
| 429 | RATE_LIMITED |
Request limit exceeded. Retry in 1–2 seconds |
| 502 | BITRIX_UNAVAILABLE |
Bitrix24 is unavailable |
Full list of common API errors — Errors.
Known specifics
- One template — multiple instances. The same
templateIdcan be started for different entities simultaneously. Each start receives its own uniqueworkflowId. - A repeated call starts another instance. A request with the same body is not rejected and does not return the already running workflow: every
201means a new instance on the same document. If a request may have gone through but the response was lost, check the list of running workflows before retrying. It shows only active instances: a workflow that has already finished does not appear there. No Vibecode API method returns finished instances, so an empty list does not prove that the workflow was never started.