Estimates
The Estimate object represents a job estimate or quote in your Custom Trades CRM account.
Endpoints
The Estimate object
Attributes
uuidstringUnique identifier for the estimate
estimate_numberstring |nullEstimate number (assigned automatically; cannot be set when creating. Use [Numbering](/developer/docs/rest/api/numbering) to view or change the next number.)
customer_uuidUUIDCustomer UUID (required)
job_uuidUUID |nullAssociated job UUID
template_uuidUUIDTemplate UUID (required)
location_uuidUUID |nullLocation UUID
created_by_user_idUUIDUser ID who created the estimate
statusstringStatus: 'Pending', 'Accepted', 'Declined', 'Expired'
template_namestringTemplate name
pricing_typestringPricing type from template
selected_tierstring |nullSelected tier ('good', 'better', 'best')
base_amountnumberBase amount
addons_amountnumberAdd-ons amount
tax_amountnumberTax amount
total_amountnumberTotal amount
quantitynumberQuantity (default: 1)
selected_addonsarray |nullSelected add-on identifiers
adjustmentsJSONB |nullManual adjustments
service_descriptionstring |nullService description
internal_notesstring |nullInternal notes
customer_notesstring |nullCustomer-facing notes
response_notesstring |nullCustomer response notes
expires_atstring |nullExpiration date (ISO format)
responded_atstring |nullResponse timestamp
created_atstringISO timestamp of creation
updated_atstringISO timestamp of last update
deleted_atstring |nullISO timestamp of soft deletion (null if not deleted)
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)requiredInclude 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)requiredPage number
limit(number, default: 50, max: 100)requiredItems per page
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.
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)requiredCustomer UUID (must belong to your company)
template_uuid(string)requiredTemplate 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)
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)requiredTemplate 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
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:**
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 code | Description |
|---|---|
| 200 | Success |
| 400 | Validation error |
| 401 | Unauthorized (invalid API key) |
| 403 | Forbidden (add-on required, IP restriction, or usage limit exceeded) |
| 404 | Estimate not found |
| 500 | Server error |
curl -X DELETE \ https://customtradescrm.com/api/v1/estimates/123e4567-e89b-12d3-a456-426614174000 \ -H "Authorization: Bearer ctc_live_..."