Quotes
Create, update, and manage quotes linked to deals. Generate PDFs, duplicate quotes, and manage quote status.
All Quotes endpoints require JWT authentication via the
Authorization: Bearer <token> header. Some endpoints require Admin role.Core Endpoints
GET
/quotes
List quotes
JWT Required
Query Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| page | integer | Optional | Page number for pagination. Default: 1 |
| per_page | integer | Optional | Number of results per page (max 100). Default: 25. Max: 100 |
| search | string | Optional | Search term to filter results |
| status | string | Optional | Values: draft, sent, accepted, declined, expired |
| deal_id | integer | Optional | |
| sort_by | string | Optional | Sort field (default: quote_number). Values: quote_number, company_name, contact_name, deal_title, status, total, created_at, valid_until |
| sort_dir | string | Optional | Sort direction (default: ASC). Values: ASC, DESC |
Code Examples
curl -X GET "https://crm.revorbit.com/api/quotes" \ -H "Authorization: Bearer YOUR_JWT_TOKEN"
const response = await fetch(
"https://crm.revorbit.com/api/quotes",
{
method: "GET",
headers: {
"Authorization": "Bearer YOUR_JWT_TOKEN",
}
}
);
const data = await response.json();
POST
/quotes
Create quote
JWT Required
Request Body
| Name | Type | Required | Description |
|---|---|---|---|
| deal_id | integer | Required | |
| contact_id | integer | Optional | Ship To contact ID |
| bill_to_contact_id | integer | Optional | Bill To contact ID |
| company_id | integer | Optional | |
| status | string | Optional | Values: draft, sent, accepted, declined, expired |
| discount_type | string | Optional | Values: percentage, fixed |
| discount_value | number | Optional | |
| tax_rate | number | Optional | |
| valid_until | date | Optional | |
| notes | string | Optional | |
| items | array[object] | Optional |
Code Examples
curl -X POST "https://crm.revorbit.com/api/quotes" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"deal_id": 1,
"contact_id": 1,
"bill_to_contact_id": 1,
"company_id": 1,
"status": "draft",
"discount_type": "percentage",
"discount_value": 1,
"tax_rate": 1,
"valid_until": "2026-01-15",
"notes": "...",
"items": [
{
"product_id": 1,
"description": "...",
"quantity": 1,
"unit_price": 1
}
]
}'const response = await fetch(
"https://crm.revorbit.com/api/quotes",
{
method: "POST",
headers: {
"Authorization": "Bearer YOUR_JWT_TOKEN",
"Content-Type": "application/json"
},
body: JSON.stringify(
{
"deal_id": 1,
"contact_id": 1,
"bill_to_contact_id": 1,
"company_id": 1,
"status": "draft",
"discount_type": "percentage",
"discount_value": 1,
"tax_rate": 1,
"valid_until": "2026-01-15",
"notes": "...",
"items": [
{
"product_id": 1,
"description": "...",
"quantity": 1,
"unit_price": 1
}
]
}
)
}
);
const data = await response.json();
GET
/quotes/{id}
Get quote
JWT Required
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| id | integer | Required | Resource ID |
Code Examples
curl -X GET "https://crm.revorbit.com/api/quotes/{id}" \
-H "Authorization: Bearer YOUR_JWT_TOKEN"const response = await fetch(
"https://crm.revorbit.com/api/quotes/{id}",
{
method: "GET",
headers: {
"Authorization": "Bearer YOUR_JWT_TOKEN",
}
}
);
const data = await response.json();
PUT
/quotes/{id}
Update quote
JWT Required
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| id | integer | Required | Resource ID |
Request Body
| Name | Type | Required | Description |
|---|---|---|---|
| deal_id | integer | Required | |
| contact_id | integer | Optional | Ship To contact ID |
| bill_to_contact_id | integer | Optional | Bill To contact ID |
| company_id | integer | Optional | |
| status | string | Optional | Values: draft, sent, accepted, declined, expired |
| discount_type | string | Optional | Values: percentage, fixed |
| discount_value | number | Optional | |
| tax_rate | number | Optional | |
| valid_until | date | Optional | |
| notes | string | Optional | |
| items | array[object] | Optional |
Code Examples
curl -X PUT "https://crm.revorbit.com/api/quotes/{id}" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"deal_id": 1,
"contact_id": 1,
"bill_to_contact_id": 1,
"company_id": 1,
"status": "draft",
"discount_type": "percentage",
"discount_value": 1,
"tax_rate": 1,
"valid_until": "2026-01-15",
"notes": "...",
"items": [
{
"product_id": 1,
"description": "...",
"quantity": 1,
"unit_price": 1
}
]
}'const response = await fetch(
"https://crm.revorbit.com/api/quotes/{id}",
{
method: "PUT",
headers: {
"Authorization": "Bearer YOUR_JWT_TOKEN",
"Content-Type": "application/json"
},
body: JSON.stringify(
{
"deal_id": 1,
"contact_id": 1,
"bill_to_contact_id": 1,
"company_id": 1,
"status": "draft",
"discount_type": "percentage",
"discount_value": 1,
"tax_rate": 1,
"valid_until": "2026-01-15",
"notes": "...",
"items": [
{
"product_id": 1,
"description": "...",
"quantity": 1,
"unit_price": 1
}
]
}
)
}
);
const data = await response.json();
DELETE
/quotes/{id}
Delete quote
JWT Required
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| id | integer | Required | Resource ID |
Code Examples
curl -X DELETE "https://crm.revorbit.com/api/quotes/{id}" \
-H "Authorization: Bearer YOUR_JWT_TOKEN"const response = await fetch(
"https://crm.revorbit.com/api/quotes/{id}",
{
method: "DELETE",
headers: {
"Authorization": "Bearer YOUR_JWT_TOKEN",
}
}
);
const data = await response.json();
PUT
/quotes/{id}/status
Update quote status
JWT Required
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| id | integer | Required | Resource ID |
Request Body
| Name | Type | Required | Description |
|---|---|---|---|
| status | string | Required | Values: draft, sent, accepted, declined, expired |
Code Examples
curl -X PUT "https://crm.revorbit.com/api/quotes/{id}/status" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "Content-Type: application/json" \
-d '{"status":"draft"}'const response = await fetch(
"https://crm.revorbit.com/api/quotes/{id}/status",
{
method: "PUT",
headers: {
"Authorization": "Bearer YOUR_JWT_TOKEN",
"Content-Type": "application/json"
},
body: JSON.stringify(
{
"status": "draft"
}
)
}
);
const data = await response.json();
GET
/quotes/{id}/pdf
Generate PDF
JWT Required
Generate a PDF version of the quote.
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| id | integer | Required | Resource ID |
Response
PDF file (binary file download)
Code Examples
curl -X GET "https://crm.revorbit.com/api/quotes/{id}/pdf" \
-H "Authorization: Bearer YOUR_JWT_TOKEN"const response = await fetch(
"https://crm.revorbit.com/api/quotes/{id}/pdf",
{
method: "GET",
headers: {
"Authorization": "Bearer YOUR_JWT_TOKEN",
}
}
);
const data = await response.json();
POST
/quotes/{id}/duplicate
Duplicate quote
JWT Required
Create a copy of an existing quote.
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| id | integer | Required | Resource ID |
Code Examples
curl -X POST "https://crm.revorbit.com/api/quotes/{id}/duplicate" \
-H "Authorization: Bearer YOUR_JWT_TOKEN"const response = await fetch(
"https://crm.revorbit.com/api/quotes/{id}/duplicate",
{
method: "POST",
headers: {
"Authorization": "Bearer YOUR_JWT_TOKEN",
}
}
);
const data = await response.json();Quote Settings
GET
/quote-settings
Get quote settings
Admin Required
Retrieve organization quote settings (numbering, defaults, logo).
Code Examples
curl -X GET "https://crm.revorbit.com/api/quote-settings" \ -H "Authorization: Bearer YOUR_JWT_TOKEN"
const response = await fetch(
"https://crm.revorbit.com/api/quote-settings",
{
method: "GET",
headers: {
"Authorization": "Bearer YOUR_JWT_TOKEN",
}
}
);
const data = await response.json();
PUT
/quote-settings
Update quote settings
Admin Required
Request Body
| Name | Type | Required | Description |
|---|---|---|---|
| number_prefix | string | Optional | |
| tax_rate | number | Optional | |
| notes | string | Optional | |
| terms | string | Optional |
Code Examples
curl -X PUT "https://crm.revorbit.com/api/quote-settings" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "Content-Type: application/json" \
-d '{"number_prefix":"...","tax_rate":1,"notes":"...","terms":"..."}'const response = await fetch(
"https://crm.revorbit.com/api/quote-settings",
{
method: "PUT",
headers: {
"Authorization": "Bearer YOUR_JWT_TOKEN",
"Content-Type": "application/json"
},
body: JSON.stringify(
{
"number_prefix": "...",
"tax_rate": 1,
"notes": "...",
"terms": "..."
}
)
}
);
const data = await response.json();
POST
/quote-settings/logo
Upload quote logo
Admin Required
Request Body
| Name | Type | Required | Description |
|---|---|---|---|
| logo | file | Optional |
Code Examples
curl -X POST "https://crm.revorbit.com/api/quote-settings/logo" \ -H "Authorization: Bearer YOUR_JWT_TOKEN" \ -F "file=@/path/to/file"
const response = await fetch(
"https://crm.revorbit.com/api/quote-settings/logo",
{
method: "POST",
headers: {
"Authorization": "Bearer YOUR_JWT_TOKEN",
}
}
);
const data = await response.json();
DELETE
/quote-settings/logo
Delete quote logo
Admin Required
Code Examples
curl -X DELETE "https://crm.revorbit.com/api/quote-settings/logo" \ -H "Authorization: Bearer YOUR_JWT_TOKEN"
const response = await fetch(
"https://crm.revorbit.com/api/quote-settings/logo",
{
method: "DELETE",
headers: {
"Authorization": "Bearer YOUR_JWT_TOKEN",
}
}
);
const data = await response.json();