For AI agents: markdown of this page — /docs-content-en/entities/quotes/update.md documentation index — /llms.txt

Update a quote

PATCH /v1/quotes/:id

Updates fields of an existing CRM quote. Pass only the fields you want to change — the rest stay as they are.

Parameters

Parameter Type Required Description
Parameterid (path) Typenumber Requiredyes DescriptionQuote ID. List: GET /v1/quotes

Request fields (body)

All fields are optional. Frequently changed: stageId, amount together with isManualOpportunity, assignedById, closeDate.

Field Type Description
Fieldtitle Typestring DescriptionTitle
FieldquoteNumber Typestring DescriptionQuote number
FieldstageId Typestring DescriptionStatus: DRAFT, SENT, APPROVED. List: GET /v1/statuses?filter[entityId]=QUOTE_STATUS
Fieldamount Typenumber DescriptionQuote amount. Pass it together with isManualOpportunity: true — without this flag the amount is recalculated from the product rows
FieldisManualOpportunity Typeboolean Descriptiontrue — manual amount mode
Fieldcurrency Typestring DescriptionCurrency. List: GET /v1/currencies
FielddealId Typenumber DescriptionDeal ID. List: GET /v1/deals
FieldleadId Typenumber DescriptionLead ID. List: GET /v1/leads
FieldcontactId Typenumber DescriptionPrimary contact ID. List: GET /v1/contacts
FieldcontactIds Typearray DescriptionIDs of all contacts of the quote. The set of bindings is replaced as a whole, so pass the full list
FieldcompanyId Typenumber DescriptionCompany ID. List: GET /v1/companies
FieldmycompanyId Typenumber DescriptionYour company's details
FieldassignedById Typenumber DescriptionAssignee. List: GET /v1/users
Fieldopened Typeboolean DescriptionAvailable to everyone
Fieldcomments Typestring DescriptionComment
Fieldcontent Typestring DescriptionContent
Fieldterms Typestring DescriptionTerms
FieldbeginDate Typedatetime DescriptionStart date
FieldcloseDate Typedatetime DescriptionClose date
FieldactualDate Typedatetime DescriptionValid until
FieldlocationId Typestring DescriptionLocation
FieldwebformId Typenumber DescriptionCRM form that created the quote
FieldstorageTypeId Typenumber DescriptionFile storage type
FieldstorageElementIds Typearray DescriptionIDs of files in the storage
FieldlastActivityBy Typenumber DescriptionAuthor of the last activity. List: GET /v1/users
FieldutmSource Typestring DescriptionUTM Source
FieldutmMedium Typestring DescriptionUTM Medium
FieldutmCampaign Typestring DescriptionUTM Campaign
FieldutmContent Typestring DescriptionUTM Content
FieldutmTerm Typestring DescriptionUTM Term
FieldufCrm* Typeper field schema DescriptionA user field of the Bitrix24 account. The name and type are in the schema GET /v1/quotes/fields, and the value format for each type is in User fields (UF)

Fields marked RO on the Quote fields page cannot be changed — a request that includes them is rejected with 400 READONLY_FIELD.

Field names. In responses, fields are returned in camelCase: amount, currency, beginDate, closeDate. On write, both forms are accepted: these camelCase names and the original Bitrix24 names opportunity, currencyId, begindate, closedate. The API layer maps them to the names Bitrix24 expects.

Examples

curl — personal key

Terminal
curl -X PATCH "https://vibecode.bitrix24.com/v1/quotes/412" \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "stageId": "APPROVED",
    "isManualOpportunity": true,
    "opportunity": 1450
  }'

curl — OAuth application

Terminal
curl -X PATCH "https://vibecode.bitrix24.com/v1/quotes/412" \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "stageId": "APPROVED",
    "isManualOpportunity": true,
    "opportunity": 1450
  }'

JavaScript — personal key

javascript
const res = await fetch('https://vibecode.bitrix24.com/v1/quotes/412', {
  method: 'PATCH',
  headers: {
    'X-Api-Key': 'YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    stageId: 'APPROVED',
    isManualOpportunity: true,
    opportunity: 1450,
  }),
})

const { success, data } = await res.json()

JavaScript — OAuth application

javascript
const res = await fetch('https://vibecode.bitrix24.com/v1/quotes/412', {
  method: 'PATCH',
  headers: {
    'X-Api-Key': 'YOUR_APP_KEY',
    'Authorization': 'Bearer USER_SESSION_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    stageId: 'APPROVED',
    isManualOpportunity: true,
    opportunity: 1450,
  }),
})

const { success, data } = await res.json()

Response fields

Field Type Description
Fieldsuccess Typeboolean DescriptionAlways true on success
Fielddata Typeobject DescriptionThe updated quote object with all fields — see Quote fields
Fieldmeta.warnings Typearray DescriptionPresent when the body carries fields that are neither in the quote schema nor in the field list of GET /v1/quotes/fields, for example a misspelled name. The warning code is UNRECOGNIZED_WRITE_FIELD: such a field may not have been stored. The response status is 200. On a route that wraps the field map itself, an object under fields is rejected with 400 NESTED_FIELDS_ENVELOPE when the schema does not declare fields; pass fields flat at the JSON root.

Response example

JSON
{
  "success": true,
  "data": {
    "id": 412,
    "title": "Quote for server hardware",
    "amount": 1450,
    "currency": "USD",
    "stageId": "APPROVED",
    "dealId": 741,
    "assignedById": 1,
    "updatedTime": "2026-04-15T15:10:00.000Z"
  }
}

Error response example

404 — quote not found:

JSON
{
  "success": false,
  "error": {
    "code": "ENTITY_NOT_FOUND",
    "message": "Item not found"
  }
}

Errors

HTTP Code Description
HTTP404 CodeENTITY_NOT_FOUND DescriptionQuote not found
HTTP403 CodeACCESS_DENIED DescriptionNo access to the quote
HTTP400 CodeINVALID_REQUEST DescriptionInvalid fields
HTTP400 CodeREADONLY_FIELD DescriptionThe request body contains a read-only field, such as clientEmail. Such fields are marked in the RO column of Quote fields
HTTP403 CodeSCOPE_DENIED DescriptionThe API key lacks the crm scope
HTTP401 CodeTOKEN_MISSING DescriptionThe API key has no configured tokens

Full list of common API errors — Errors.

See also