{% note tip "" %}
If you are developing integrations for Bitrix24 using AI tools (Codex, Claude Code, Cursor), connect to the MCP server so that the assistant can utilize the official REST documentation.
{% endnote %}
An estimate is a CRM object that allows you to create printed documents and send them to clients before a deal. An estimate has a subject, a stage, an amount in a currency, a list of product items, and a client — a company and contacts.
{% note warning "" %}
Development of the crm.quote.* methods for working with estimates has been discontinued. For new development, use the universal methods crm.item.* with entityTypeId = 7. The custom field methods crm.quote.userfield.* continue to work.
{% endnote %}
Quick navigation: all methods and events
User documentation: estimates in Bitrix24
An estimate is one of the CRM object types, so it is managed by the universal methods crm.item.* with entityTypeId = 7. The crm.quote.* methods remain only to support existing integrations.
#|
|| If You Need To | Open the Method ||
|| Create an estimate | crm.item.add ||
|| Update an estimate | crm.item.update ||
|| Retrieve an estimate by its identifier | crm.item.get ||
|| Retrieve a list of estimates by filter | crm.item.list ||
|| Delete an estimate | crm.item.delete ||
|| Retrieve the description of estimate fields | crm.item.fields ||
|| Manage the product items of an estimate | crm.item.productrow.* with ownerType = Q ||
|| Replace the entire set of estimate contacts | crm.item.update with the contactIds field ||
|#
In the universal methods, field names are written in camelCase: TITLE becomes title, and ASSIGNED_BY_ID becomes assignedById. The conversion rules for custom fields are described in the section Universal CRM Methods.
Some fields are named differently in the universal methods: the estimate stage STATUS_ID arrives in the stageId field, and the multiple field CONTACT_IDS — in the contactIds field. The exact set of fields for an estimate is returned by the method crm.item.fields with entityTypeId = 7.
- Retrieve the description of estimate fields using the method crm.quote.fields — it returns both system and custom fields with their types
- Find out the available stages using the method crm.status.list with the filter
ENTITY_ID = QUOTE_STATUS, and the list of currencies using the method crm.currency.list - Create an estimate using the method crm.quote.add: pass the subject
TITLE, the stageSTATUS_ID, the client companyCOMPANY_IDor the contactsCONTACT_IDS, and your own companyMYCOMPANY_ID - Add product items using the method crm.quote.productrows.set; to check their composition, use the method crm.quote.productrows.get
- Subscribe to estimate events to receive notifications about changes in your application
Client. The company and contacts the estimate is addressed to. An estimate has a single company, and its identifier is passed in the field COMPANY_ID. There can be several contacts, and their identifiers are passed as an array in the multiple field CONTACT_IDS. You can find the required identifiers using the methods crm.company.list and crm.contact.list. To read and change the contacts of an estimate that already exists one by one, it is more convenient to use the group of methods crm.quote.contact.*: the CONTACT_IDS field is not returned by crm.quote.get and crm.quote.list.
Deal. An estimate can be created based on a deal and vice versa. The deal identifier is stored in the estimate field DEAL_ID and can be passed to the methods crm.quote.add and crm.quote.update.
Lead. If the estimate was issued for a lead, the lead identifier is stored in the field LEAD_ID. The field is filled in automatically when a lead is converted and can be modified using the same methods.
Invoice. An invoice is linked to an estimate using the universal method crm.item.add: pass entityTypeId = 31 and the estimate identifier in the field parentId7.
Products. The product items of an estimate are created and updated by the method crm.quote.productrows.set and returned by crm.quote.productrows.get. You can retrieve the product identifier for an item using the method catalog.product.list.
Details. Buyer details are pulled into the estimate form from the associated contact or company. Seller details are taken from the company specified in the field MYCOMPANY_ID. To explicitly specify a pair of buyer and seller details, use the method crm.requisite.link.register, passing ENTITY_TYPE_ID = 7 and the estimate identifier in ENTITY_ID.
{% note tip "User Documentation" %}
{% endnote %}
The main workspace of an estimate is the General tab of its detail form. It consists of two parts:
-
the left part contains fields with information. If the system fields are insufficient, add your own custom fields using the group of methods crm.quote.userfield.*. They store information in various data formats: string, number, link, address, and others. The name of such a field starts with the prefix
UF_CRM_, and it is under this name that the field is passed to crm.quote.add and returned by crm.quote.get -
the right part contains the estimate timeline. CRM activities in it are created, updated, and deleted by the group of methods crm.activity.* — the estimate is specified there by the pair
OWNER_TYPE_ID = 7andOWNER_ID. Timeline records are managed by the group of methods crm.timeline.*, where the estimate is specified by the pairENTITY_TYPE = quoteandENTITY_ID
{% note tip "User Documentation" %}
- CRM Detail Form: Features and Settings
- System Fields in CRM
- Custom Fields in CRM
- Timeline in CRM object
{% endnote %}
You can embed an application into the estimate detail form and work with it without leaving the form. There are two embedding scenarios:
- occupy a special embedding location — for example, create your own tab in the detail form
- create a custom field into which the content of your application is loaded
{% note tip "Typical use-cases and scenarios" %}
{% endnote %}
Scope:
crmWho can execute the method: depending on the method — estimate methods check access permissions for estimates, while creating, updating, and deleting custom fields is available only to a CRM administrator
{% list tabs %}
-
Methods
#| || Method | Description || || crm.quote.add | Creates a new estimate || || crm.quote.update | Modifies an existing estimate || || crm.quote.get | Returns an estimate by its identifier || || crm.quote.list | Returns a list of estimates based on a filter || || crm.quote.delete | Deletes an estimate || || crm.quote.fields | Returns the description of estimate fields || || crm.quote.productrows.get | Returns the product items of the estimate || || crm.quote.productrows.set | Creates or updates the product items of the estimate || |#
-
Events
#| || Event | Triggered || || onCrmQuoteAdd | When an estimate is created manually or via the method crm.quote.add || || onCrmQuoteUpdate | When an estimate is updated manually or via the method crm.quote.update || || onCrmQuoteDelete | When an estimate is deleted manually or via the method crm.quote.delete || |#
{% endlist %}
#| || Method | Description || || crm.quote.contact.add | Links a single contact to an estimate || || crm.quote.contact.delete | Removes a single contact from an estimate || || crm.quote.contact.items.get | Returns the set of contacts linked to an estimate || || crm.quote.contact.items.set | Replaces the set of estimate contacts with the one you pass || || crm.quote.contact.items.delete | Removes all contacts from an estimate || || crm.quote.contact.fields | Returns the description of the fields for the estimate-contact link || |#
{% list tabs %}
-
Methods
#| || Method | Description || || crm.quote.userfield.add | Creates a new custom field for estimates || || crm.quote.userfield.update | Updates an existing custom field for estimates || || crm.quote.userfield.get | Returns a custom field for estimates by ID || || crm.quote.userfield.list | Returns a list of custom fields for estimates by filter || || crm.quote.userfield.delete | Deletes a custom field for estimates || |#
-
Events
#| || Event | Triggered || || onCrmQuoteUserFieldAdd | When a custom field is added manually or via the method crm.quote.userfield.add || || onCrmQuoteUserFieldUpdate | When a custom field is updated manually or via the method crm.quote.userfield.update || || onCrmQuoteUserFieldDelete | When a custom field is deleted manually or via the method crm.quote.userfield.delete || || onCrmQuoteUserFieldSetEnumValues | When the set of values for a list-type custom field is changed manually or via the method crm.quote.userfield.update || |#
{% endlist %}