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

Create a quote

POST /v1/quotes

Creates a new CRM quote.

Request fields (body)

Parameter Type Description
title string Quote name
opportunity number Amount. To prevent the amount from being recalculated from line items, pass it together with isManualOpportunity: true. The camelCase name amount is also accepted
isManualOpportunity boolean true — manual amount mode (required if you set opportunity/amount directly). Bitrix24 stores the flag as Y/N; the boolean is converted automatically (the string "Y" is also accepted)
currencyId string Currency. List: GET /v1/currencies
stageId string Status: DRAFT, SENT, APPROVED. List: GET /v1/statuses?filter[entityId]=QUOTE_STATUS
dealId number Deal ID. Lookup: GET /v1/deals
contactId number Contact ID. Lookup: GET /v1/contacts
companyId number Company ID. Lookup: GET /v1/companies
assignedById number Assignee ID. Employee list: GET /v1/users
comments string Comment
begindate datetime Start date
closedate datetime Close date

Field names. In responses, fields are returned in camelCase: amount, currency, beginDate, closeDate. On write, both variants are accepted — these camelCase names and the B24-native opportunity / currencyId / begindate / closedate: the API layer maps them to the name Bitrix24 expects.

Full list of fields: GET /v1/quotes/fields. User fields (ufCrm_*) are also accepted.

Examples

curl — personal key

Terminal
curl -X POST https://vibecode.bitrix24.com/v1/quotes \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Quote for server hardware",
    "opportunity": 150000,
    "isManualOpportunity": true,
    "currencyId": "USD",
    "stageId": "DRAFT",
    "dealId": 741,
    "assignedById": 1
  }'

curl — OAuth app

Terminal
curl -X POST https://vibecode.bitrix24.com/v1/quotes \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Quote for server hardware",
    "opportunity": 150000,
    "isManualOpportunity": true,
    "currencyId": "USD",
    "stageId": "DRAFT",
    "dealId": 741,
    "assignedById": 1
  }'

JavaScript — personal key

javascript
const res = await fetch('https://vibecode.bitrix24.com/v1/quotes', {
  method: 'POST',
  headers: {
    'X-Api-Key': 'YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    title: 'Quote for server hardware',
    opportunity: 150000,
    isManualOpportunity: true,
    currencyId: 'USD',
    stageId: 'DRAFT',
    dealId: 741,
    assignedById: 1,
  }),
})

const { success, data } = await res.json()
console.log('Quote ID:', data.id)

JavaScript — OAuth app

javascript
const res = await fetch('https://vibecode.bitrix24.com/v1/quotes', {
  method: 'POST',
  headers: {
    'X-Api-Key': 'YOUR_APP_KEY',
    'Authorization': 'Bearer USER_SESSION_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    title: 'Quote for server hardware',
    opportunity: 150000,
    isManualOpportunity: true,
    currencyId: 'USD',
    stageId: 'DRAFT',
    dealId: 741,
    assignedById: 1,
  }),
})

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

Response fields

Field Type Description
id number ID of the created quote
title string Name
amount number Amount
currency string Currency
stageId string Status
dealId number Deal ID
assignedById number Assignee
createdBy number Creator
createdTime datetime Creation date
updatedTime datetime Modification date

The response contains all quote fields, including user fields (ufCrm_*). The main ones are shown above.

The URL of the quote card in Bitrix24 is built from id:

https://<portal>.bitrix24.com/crm/type/7/details/<id>/

7 — the entityTypeId of a quote in Bitrix24. <portal> — the Bitrix24 account domain. Access is restricted by the employee's permissions in Bitrix24.

Response example

JSON
{
  "success": true,
  "data": {
    "id": 412,
    "title": "Quote for server hardware",
    "amount": 150000,
    "isManualOpportunity": true,
    "currency": "USD",
    "stageId": "DRAFT",
    "dealId": 741,
    "contactId": 0,
    "companyId": 0,
    "assignedById": 1,
    "createdBy": 1,
    "comments": "",
    "beginDate": "2026-04-15T00:00:00.000Z",
    "closeDate": "2026-05-15T00:00:00.000Z",
    "createdTime": "2026-04-15T10:30:00.000Z",
    "updatedTime": "2026-04-15T10:30:00.000Z"
  }
}

Error response example

403 — no scope:

JSON
{
  "success": false,
  "error": {
    "code": "SCOPE_DENIED",
    "message": "This endpoint requires 'crm' scope"
  }
}

Errors

HTTP Code Description
403 SCOPE_DENIED The API key lacks the crm scope
401 TOKEN_MISSING The API key has no configured tokens
400 INVALID_REQUEST Invalid fields

Full list of common API errors — Errors.

See also