Estimates

The Estimate object represents a job estimate or quote in your Custom Trades CRM account.

View as Markdown

Endpoints

GET/api/v1/estimates
GET/api/v1/estimates/{uuid}
POST/api/v1/estimates
POST/api/v1/estimates/preview
PUT/api/v1/estimates/{uuid}
DELETE/api/v1/estimates/{uuid}

The Estimate object

Attributes

uuidstring

Unique identifier for the estimate

estimate_numberstring |null

Estimate number (assigned automatically; cannot be set when creating. Use [Numbering](/developer/docs/rest/api/numbering) to view or change the next number.)

customer_uuidUUID

Customer UUID (required)

job_uuidUUID |null

Associated job UUID

template_uuidUUID

Template UUID (required)

location_uuidUUID |null

Location UUID

created_by_user_idUUID

User ID who created the estimate

statusstring

Status: 'Pending', 'Accepted', 'Declined', 'Expired'

template_namestring

Template name

pricing_typestring

Pricing type from template

selected_tierstring |null

Selected tier ('good', 'better', 'best')

base_amountnumber

Base amount

addons_amountnumber

Add-ons amount

tax_amountnumber

Tax amount

total_amountnumber

Total amount

quantitynumber

Quantity (default: 1)

selected_addonsarray |null

Selected add-on identifiers

adjustmentsJSONB |null

Manual adjustments

service_descriptionstring |null

Service description

internal_notesstring |null

Internal notes

customer_notesstring |null

Customer-facing notes

response_notesstring |null

Customer response notes

expires_atstring |null

Expiration date (ISO format)

responded_atstring |null

Response timestamp

created_atstring

ISO timestamp of creation

updated_atstring

ISO timestamp of last update

deleted_atstring |null

ISO timestamp of soft deletion (null if not deleted)

View as Markdown

THE ESTIMATE OBJECT

{
"uuid": "123e4567-e89b-12d3-a456-426614174000",
"estimate_number": "EST-001",
"status": "Pending",
"total_amount": 500,
"customer": {
"uuid": "...",
"first_name": "John",
"last_name": "Doe"
}
}

List estimates

Returns a paginated list of estimates for your company.

Parameters

include_deleted(boolean, default: false)required

Include soft-deleted estimates

status(string)

Filter by status ('Pending', 'Accepted', 'Declined', 'Expired')

customer_uuid(UUID)

Filter by customer

job_uuid(UUID)

Filter by job

search(string)

Search term (searches estimate_number, template_name, service_description)

page(number, default: 1)required

Page number

limit(number, default: 50, max: 100)required

Items per page

GET/api/v1/estimates
curl -G \
https://customtradescrm.com/api/v1/estimates?status=Pending \
-H "Authorization: Bearer ctc_live_..."

Response

{
"success": true,
"data": {
"estimates": [
{
"uuid": "123e4567-e89b-12d3-a456-426614174000",
"estimate_number": "EST-001",
"status": "Pending",
"total_amount": 500,
"customer": {
"uuid": "...",
"first_name": "John",
"last_name": "Doe"
}
}
],
"pagination": {
"page": 1,
"limit": 50,
"total": 1,
"total_pages": 1
}
}
}

Get an estimate

Returns a specific estimate by UUID with related customer, job, template, and location information.

GET/api/v1/estimates/{uuid}
curl -G \
https://customtradescrm.com/api/v1/estimates/123e4567-e89b-12d3-a456-426614174000 \
-H "Authorization: Bearer ctc_live_..."

Create an estimate

Creates a new estimate from a template. **Request Body:** You can send **multiple line items** in `line_items` (labor, parts, fees) when creating an **invoice**—see [Invoices](/developer/docs/rest/api/invoices). Estimates are created from templates (tier, add-ons, quantity, adjustments) as follows:

Parameters

customer_uuid(string)required

Customer UUID (must belong to your company)

template_uuid(string)required

Template UUID (must belong to your company)

job_uuid(string)

Associated job UUID

location_uuid(string)

Location UUID

selected_tier(string)

'good', 'better', or 'best' (for tiered pricing)

quantity(string)

Quantity (default: 1)

selected_addons(string)

Array of add-on identifiers

adjustments(string)

JSONB object for manual adjustments

service_description(string)

Service description

internal_notes(string)

Internal notes

customer_notes(string)

Customer-facing notes

expires_at(string)

Expiration date (ISO format)

POST/api/v1/estimates
curl -G \

Response

{
"customer_uuid": "123e4567-e89b-12d3-a456-426614174000",
"template_uuid": "123e4567-e89b-12d3-a456-426614174001",
"selected_tier": "better",
"quantity": 1,
"selected_addons": [
"addon1",
"addon2"
],
"service_description": "Full plumbing service"
}

Preview estimate totals (dry run)

Preview estimate totals without creating the estimate. This is useful for calculating totals including tax and addons before creating the estimate. **Request Body:**

Parameters

template_uuid(string)required

Template UUID (must belong to your company)

selected_tier(string)

'good', 'better', or 'best' (for tiered pricing)

quantity(string)

Quantity (default: 1)

selected_addons(string)

Array of add-on identifiers

adjustments(string)

JSONB object with `base_amount?`, `addons_amount?`, `tax_amount?` for manual adjustments

POST/api/v1/estimates/preview
curl -G \

Response

{
"success": true,
"data": {
"preview": {
"base_amount": 1000,
"addons_amount": 150,
"tax_amount": 50,
"total_amount": 1200
},
"breakdown": {
"base_amount": 1000,
"addons": [
{
"name": "addon1",
"price": 75
},
{
"name": "addon2",
"price": 75
}
],
"adjustments": {
"tax_amount": 50
}
}
}
}

Update an estimate

Updates an estimate. Only permitted fields can be updated. **Request Body:**

PUT/api/v1/estimates/{uuid}
curl -G \

Response

{
"status": "Accepted",
"response_notes": "Customer accepted via phone"
}

Delete an estimate

Soft deletes an estimate (sets `deleted_at` timestamp).

Error codes

HTTP status codeDescription
200Success
400Validation error
401Unauthorized (invalid API key)
403Forbidden (add-on required, IP restriction, or usage limit exceeded)
404Estimate not found
500Server error
DELETE/api/v1/estimates/{uuid}
curl -X DELETE \
https://customtradescrm.com/api/v1/estimates/123e4567-e89b-12d3-a456-426614174000 \
-H "Authorization: Bearer ctc_live_..."