Discover more about construction estimates with the ConstructionOnline API
Table of Contents
- Introduction
- api/Estimates
- api/EstimateCategories
- api/EstimateSubCategories
- api/EstimateItems
- api/EstimateMarkup
Introduction
Each estimate created in ConstructionOnline has a specific structure and calculation setting. By default, all estimates are set as 3-Level estimates, which consists of the Category > Subcategory > Item structure. All estimates are also initially set to apply the Standard Calculation Method, where a line items' base cost is calculated by multiplying the unit cost by the entered quantity value.
An estimate's structure and settings will impact which fields are returned with each endpoint. Each 3-Level estimate is made up of individual categories, subcategories, and items that are each assigned a unique reference ID. Because estimate components are hierarchically related, each object will contain references to the objects it is related to. For example, an estimate item will list the IDs of the related project, estimate, estimate category, and estimate subcategory.
The ConstructionOnline API provides five different types of estimating endpoints:
- The api/Estimates endpoints return high-level information about an estimate, such as its name, related project, base cost, and more. These endpoints do not return any categories, subcategories, or items associated with the estimate. Each estimate will return as an indidividual object.
- The api/EstimateCategories endpoints return information about an estimate's categories. These endpoints will return specific information about each individual category, such as its ID and name. These endpoints do not return information on any subcategories or items within the category itself. Each category will return as an individual object.
- The api/EstimateSubcategories endpoints return information about an estimate's subcategories. These endpoints will return specific information about each individual subcategory, such as its name, markup type, base cost, and more. These endpoints do not return information any items within the category itself, but will reference the estimate and estimate category the subcategory belongs to. Each subcategory will return as an individual object.
- The api/EstimateItems endpoints return information about an estimate's items. These endpoints will return specific information about each individual item, such as its name, markup type, base cost, and tax. These endpoints will reference the estimate, estimate category, and estimate subcategory the item belongs to. Each item will return as an individual object.
- The api/EstimateMarkup endpoints return information about an estimate's Company Overhead and Margin (COM) section. Each component of the COM section, such as Company Overhead, will return as an individual object. These endpoints do not return data on markup calculated from individual estimate items or subcategories.
❗ IMPORTANT: 2-Level estimates are a legacy option that are not compatible with many of ConstructionOnline's financial features. Certain fields for some endpoints are only applicable to 2-Level estimates and will return null or a zero value for a 3-Level estimate.
Additionally, all value used for financial calulations are stored with 6 decimals, but displayed in ConstructionOnline as rounded values. More information on financial rounding can be found here.
api/Estimates
The following properties will return when an api/Estimates endpoint is called:
Name | Type | Description |
ID | integer | Unique identifier for the estimate. |
NAME | string | Name of the estimate as it appears in ConstructionOnline. |
MARKUP_NAME | string | Name of the estimate's Company Overhead and Margin section. |
TOTAL_PRICE | decimal | Total value of the estimate (also displayed as project total in the estimate). This includes the base cost of the estimate, markup, selections allowance, approved change orders, and company overhead and margin. Selection overages are not included in this total. |
TOTAL_ALLOWANCE | decimal | Total selections allowance for the estimate. |
TOTAL_COM | decimal | Total value of the estimate's company overhead and margin section. This total does not include markup applied to individual estimate subcategories or items. |
TOTAL_MARKUP | decimal | Total markup calculated for each estimate subcategory or item. This total does not include the estimate's company overhead and margin. |
TOTAL_BASECOST | decimal | Base cost of the estimate before any tax or markup. This total does not include selections allowance, company overhead and margin, change orders, or overages. |
TOTAL_SALES_TAX | decimal | Total amount of tax calculated from the base cost of the estimate. |
ORIGINAL_CONTRACT_VALUE | decimal | Original contract price/total of the estimate. This includes the base cost of the estimate, markup, selections allowance, and company overhead and margin. |
TOTAL_ACTUALS | decimal | Total actual costs recorded in ConstructionOnline for estimate subcategories or items, and approved change orders. |
TOTAL_COMMITTED | decimal | Total committed costs recorded in ConstructionOnline for estimate subcategories or items. |
TOTAL_INVOICED | decimal | Total amount invoiced for the estimate. |
TOTAL_REMAINING | decimal | Internal estimate calculation value. |
TOTAL_BALANCE | decimal | Internal estimate calculation value. |
TOTAL_ADJUSTMENT | decimal | Total adjustments entered in ConstructionOnline for estimate subcategories or items. |
TOTAL_ADJUSTEDCOST | decimal | Total adjusted cost for the estimate, which is base cost + total tax + adjustments + cost of all change orders linked to estimate. |
TOTAL_QB_ACTUALS | decimal | Total value of QuickBooks Actuals associated with the estimate. This value is populated by importing from QuickBooks and can include Bills and Expenses. |
TOTAL_QB_INVOICED | decimal | Total value of existing invoices within QuickBooks associated with the estimate. This value is populated by importing from QuickBooks. |
TOTAL_LINKED_CO_PRICE | decimal | Total client price (cost + tax + markup) of all approved change orders linked to the estimate. |
TOTAL_LINKED_CO_COST | decimal | Total cost of all approved change orders linked to the estimate. This value does not include tax or markup. |
TOTAL_CONTRACTPRICE | decimal | Total contract price for the estimate, which is base cost + total tax + total markup (not including |
CREATED_BY | integer | Unique identifier for the user who created the estimate. |
DATE_CREATED | string | Date and time the estimate was created. |
CREATOR | string | Name of the user who created the estimate. |
LMOD_BY | integer | Unique identifier for the user who last modified the estimate. |
LMOD | string | Date and time the estimate was last modified. |
MODIFIER | string | Name of the user who last modified the estimate. |
FIVE_COLUMN_ESTIMATE | boolean | Signifies the estimate's calculation method. Returns true if the 5-column calculation method was used, false if the standard calculation method was used. |
ADVANCED_ESTIMATE | boolean | Signifies the estimate's level of detail. Returns true if the estimate is a standard 3-level estimate, false if the estimate is a basic 2-level estimate. |
COST_TOTAL | decimal | Internal estimate calculation value (base cost). |
COST_ACTUAL | decimal | Internal estimate calculation value (actual costs). |
COST_INVOICED | decimal | Internal estimate calculation value (invoiced costs). |
COST_VARIENCE | decimal | Internal estimate calculation value (estimate - actual cost) |
COST_COMMITTED | decimal | Internal estimate calculation value (committed costs). |
COST_PAID | decimal | Internal estimate calculation value (costs paid). |
TOTAL_PROFIT | decimal | Total profit recorded for the estimate. |
PROJECT_ID | integer | Unique identifier for the project/opportunity that contains the estimate. |
PROJECT_NAME | string | Name of the project/opportunity containing the estimate. |
LAST_QBD_ESTIMATE_DATE | string | Date the estimate was last sent over to QuickBooks Desktop. |
LAST_QBD_ACTUAL_DATE | string | Date the estimate's actuals were last sent over to QuickBooks Desktop. |
LAST_QBD_INVOICE_DATE | string | Date the estimate was last invoiced in QuickBooks Desktop. |
LAST_QBD_PO_DATE | string | Date a purchase order was last created and sent to QuickBooks Desktop. |
Example response:
{
"ID": 367610,
"NAME": "1342 S Ross St - version w/out pool Estimate 2",
"MARKUP_NAME": "Company Overhead and Margin",
"TOTAL_PRICE": 1465228.6539999999,
"TOTAL_ALLOWANCE": 14750.0,
"TOTAL_COM": 521056.14139999985,
"TOTAL_MARKUP": 7278.7456,
"TOTAL_BASECOST": 896697.625,
"TOTAL_SALES_TAX": 20377.892,
"ORIGINAL_CONTRACT_VALUE": 1460160.4039999999,
"TOTAL_ACTUALS": 850.0,
"TOTAL_COMMITTED": 654.0,
"TOTAL_INVOICED": 306099.07,
"TOTAL_REMAINING": 1454876.1584,
"TOTAL_BALANCE": 1157928.8339999998,
"TOTAL_ADJUSTMENT": -1070.0,
"TOTAL_ADJUSTEDCOST": 916500.51700000011,
"TOTAL_QB_ACTUALS": 0.0,
"TOTAL_QB_INVOICED": 0.0,
"TOTAL_QB_COMMITTED": 0.0,
"TOTAL_LINKED_CO_PRICE": 668.25,
"TOTAL_LINKED_CO_COST": 495.0,
"TOTAL_CONTRACTPRICE": 924354.2626,
"CREATED_BY": 999997,
"DATE_CREATED": "2022-09-22T14:44:14.263",
"CREATOR": "Alex Kim",
"LMOD_BY": 999997,
"LMOD": "2022-09-22T14:44:14.257",
"MODIFIER": "Alex Kim",
"FIVE_COLUMN_ESTIMATE": false,
"ADVANCED_ESTIMATE": true,
"COST_TOTAL": 365852.50000000006,
"COST_ACTUAL": 915308.12500000012,
"COST_INVOICED": 850.0,
"COST_VARIENCE": 306099.07,
"COST_COMMITTED": 654.0,
"COST_PAID": 850.0,
"TOTAL_PROFIT": 8319.5956,
"PROJECT_ID": 1312899,
"PROJECT_NAME": "1342 S Ross St - version w/out pool",
"LAST_QBD_ESTIMATE_DATE": null,
"LAST_QBD_ACTUAL_DATE": null,
"LAST_QBD_INVOICE_DATE": null,
"LAST_QBD_PO_DATE": null
}
api/EstimateCategories
The following properties will return when an api/EstimateCategories endpoint is called:
Name | Type | Description |
ID | integer | Unique identifier for the estimate category. |
ESTIMATE_ID | integer | Unique identifier for the estimate. |
ROW_NUMBER | integer | Row number of the estimate that the estimate category is located on. |
NAME | string | Name of the estimate category. |
DESCRIPTION | string | Description entered for the estimate category. |
NOTES_TEAMLINK | string | TeamLink notes entered for the estimate category. |
NOTES_CLIENTLINK | string | ClientLink notes entered for the estimate category. |
NOTES_GENERAL | string | General notes entered for the estimate category. |
TRAFFIC_COLOR | integer | Represents the traffic light color assigned to the estimate category. The number 1 corresponds to the color green, 2 corresponds to the color yellow, 3 corresponds to the color red, and 0 means no color has been assigned to the category. |
COST_CODE | string | Corresponds to the Code column of the estimate subcategory. |
COST_CODE_ID | integer | Unique identifier for the cost code assigned to the estimate category. |
COST_ESTIMATE | decimal | Base cost of the estimate category. |
{
"ID": 4393211,
"ESTIMATE_ID": 367610,
"ROW_NUMBER": 1,
"NAME": "Planning",
"DESCRIPTION": "",
"NOTES_TEAMLINK": "",
"NOTES_CLIENTLINK": "",
"NOTES_GENERAL": "",
"TRAFFIC_COLOR": 0,
"COST_CODE": "",
"COST_CODE_ID": 0,
"COST_ESTIMATE": 97080.0
},
{
"ID": 4393212,
"ESTIMATE_ID": 367610,
"ROW_NUMBER": 19,
"NAME": "Foundation",
"DESCRIPTION": "",
"NOTES_TEAMLINK": "",
"NOTES_CLIENTLINK": "",
"NOTES_GENERAL": "",
"TRAFFIC_COLOR": 0,
"COST_CODE": "",
"COST_CODE_ID": 0,
"COST_ESTIMATE": 19078.100000000002
}
api/EstimateSubcategories
The following properties will return when an api/EstimateSubcategories endpoint is called:
Name | Type | Description |
ID | integer | Unique identifier for the estimate subcategory |
ESTIMATE_ID | integer | Unique identifier for the estimate. |
CATEGORY_ID | integer | Unique identifier for the estimate category. |
ROW_NUMBER | integer | Row number of the estimate that the estimate subcategory is located on. |
NAME | string | Name of the estimate subcategory. |
DESCRIPTION | string | Description entered for the estimate subcategory. |
CLASSIFICATION | integer | Reserved for future use. |
STATUS | integer | Reserved for future use. |
COST_ESTIMATE | decimal | Base cost of the estimate subcategory. |
NOTES_TEAMLINK | string | TeamLink notes entered for the estimate subcategory. |
NOTES_CLIENTLINK | string | ClientLink notes entered for the estimate subcategory. |
NOTES_GENERAL | string | General notes entered for the estimate subcategory. |
LINE_ITEM_MARKUP | integer | Only applicable to 2-level estimates. Individual markup value for the estimate subcategory. |
RATE | decimal | Only applicable to 2-level estimates. Quantity of the estimate subcategory. |
RATE_QTY | decimal | Only applicable to 2-level estimates. Unit cost of the estimate subcategory. |
LINE_ITEM_MARKUP_TYPE | integer | Only applicable to 2-level estimates. Signifies which markup calculation type was selected for the estimate subcategory. A value of 1 represents Percent Markup (%), 2 is Dollar Markup, 3 is Dollar per Unit Markup, and 4 is Classification Markups Applied. |
ADJUSTMENT | decimal | Total adjustments entered for the estimate subcategory. |
FIVE_COLUMN_EQUIPMENT | decimal | Total equipment costs entered for a 5-column estimate. Returns null if estimate is not 5-column. |
FIVE_COLUMN_LABOR | decimal | Total labor costs entered for a 5-column estimate. Returns null if estimate is not 5-column. |
FIVE_COLUMN_MATERIAL | decimal | Total material costs entered for a 5-column estimate. Returns null if estimate is not 5-column. |
FIVE_COLUMN_OTHER | decimal | Total other costs entered for a 5-column estimate. Returns null if estimate is not 5-column. |
FIVE_COLUMN_SUB | decimal | Total subcontractor costs entered for a 5-column estimate. Returns null if estimate is not 5-column. |
TRAFFIC_COLOR | integer | Represents the traffic light color assigned to the estimate subcategory. The number 1 corresponds to the color green, 2 corresponds to the color yellow, 3 corresponds to the color red, and 0 means no color has been assigned to the subcategory. |
COST_CODE | string | Name of the cost code assigned to the subcategory. |
COST_CODE_ID | integer | Unique identifier for the cost code assigned to the subcategory. |
DOLLAR_MARKUP | decimal | Total markup calculated from the subcategory. |
TOTAL_MARKUP | decimal | Total markup calculated from the subcategory. |
COMMITTED_COSTS | decimal | Total committed costs recorded for the estimate subcategory. |
INVOICED_AMOUNTS | decimal | Total amount invoiced for the estimate subcategory. |
ACTUAL | decimal | Total actual costs recorded for the estimate subcategory. |
QB_COMMITTED | decimal | Total committed costs recorded in QuickBooks for the the estimate subcategory. |
QB_INVOICED | decimal | Total amount invoiced in QuickBooks for the estimate subcategory. |
QB_ACTUAL | decimal | Total actual costs recorded in QuickBooks for the estimate subcategory. |
SALES_TAX | decimal | Total tax calculated for the estimate subcategory. |
UNIT | integer | Unique identifier of the unit used to measure the estimate subcategory. |
UNIT_NAME | string | Name of the unit used to measure the estimate subcategory. |
ASSIGNED | string | Only applicable to 2-level estimates. Unique identifier for the user(s) assigned to the estimate subcategory as a resource. |
Example response:
{
"ID": 22069965,
"ESTIMATE_ID": 367610,
"CATEGORY_ID": 4393211,
"ROW_NUMBER": 2,
"NAME": "Design Services",
"DESCRIPTION": "",
"CLASSIFICATION": 6,
"STATUS": 0,
"COST_ESTIMATE": 5000.0,
"NOTES_TEAMLINK": "",
"NOTES_CLIENTLINK": "",
"NOTES_GENERAL": "",
"LINE_ITEM_MARKUP": "0",
"RATE": 0.0,
"RATE_QTY": 0.0,
"LINE_ITEM_MARKUP_TYPE": 1,
"ADJUSTMENT": 0.0,
"FIVE_COLUMN_EQUIPMENT": null,
"FIVE_COLUMN_LABOR": null,
"FIVE_COLUMN_MATERIAL": null,
"FIVE_COLUMN_OTHER": null,
"FIVE_COLUMN_SUB": null,
"TRAFFIC_COLOR": null,
"COST_CODE": "",
"COST_CODE_ID": 0,
"DOLLAR_MARKUP": 0.0,
"TOTAL_MARKUP": 0.0,
"COMMITTED_COSTS": 0.0,
"INVOICED_AMOUNTS": 0.0,
"ACTUAL": 0.0,
"QB_COMMITTED": 0.0,
"QB_INVOICED": 0.0,
"QB_ACTUAL": 0.0,
"SALES_TAX": 0.0,
"UNIT": "0",
"UNIT_NAME": null,
"ASSIGNED": null
},
api/EstimateItems
The following properties will return when an api/EstimateItems endpoint is called:
Name | Type | Description |
ID | integer | Unique identifier for the estimate item. |
ESTIMATE_ID | integer | Unique identifier for the estimate. |
CATEGORY_ID | integer | Unique identifier for the category containing the estimate item. |
SUBCATEGORY_ID | integer | Unique identifier for the subcategory containing the estimate item. |
ROW_NUMBER | integer | Row number of the estimate that the estimate item is located on. |
NAME | string | Name of the estimate item. |
DESCRIPTION | string | Description entered for the estimate item. |
CLASSIFICATION | integer | Designates the classification assigned to the estimate item. A value of 1 is the classification Material, 2 is Labor, 3 is Subcontractor, 4 is Equipment, 5 is Other, and 6 is Unclassified. |
STATUS | integer | Designates the status assigned to the estimate item. A value of 1 is the status Estimated, 2 is Firm, and 3 is Bid. |
COST_ESTIMATE | decimal | Base cost of the estimate item. |
NOTES_TEAMLINK | string | TeamLink notes entered for the estimate item. |
NOTES_CLIENTLINK | string | ClientLink notes entered for the estimate item. |
NOTES_GENERAL | string | General notes entered for the estimate item. |
LINE_ITEM_MARKUP | integer | Markup value for the estimate item. |
RATE | decimal | Quantity of the estimate item. |
RATE_QTY | decimal | Unit cost of the estimate item. |
LINE_ITEM_MARKUP_TYPE | integer | Signifies which markup calculation type was selected for the estimate item. A value of 1 represents Percent Markup (%), 2 is Dollar Markup, 3 is Dollar per Unit Markup, and 4 is Classification Markups Applied. |
ADJUSTMENT | decimal | Adjustment value entered for the estimate item. |
FIVE_COLUMN_EQUIPMENT | decimal | Total equipment costs entered for a 5-column estimate. Returns null if estimate is not 5-column. |
FIVE_COLUMN_LABOR | decimal | Total labor costs entered for a 5-column estimate. Returns null if estimate is not 5-column. |
FIVE_COLUMN_MATERIAL | decimal | Total material costs entered for a 5-column estimate. Returns null if estimate is not 5-column. |
FIVE_COLUMN_OTHER | decimal | Total other costs entered for a 5-column estimate. Returns null if estimate is not 5-column. |
FIVE_COLUMN_SUB | decimal | Total subcontractor costs entered for a 5-column estimate. Returns null if estimate is not 5-column. |
TRAFFIC_COLOR | integer | Represents the traffic light color assigned to the estimate item. The number 1 corresponds to the color green, 2 corresponds to the color yellow, 3 corresponds to the color red, and 0 means no color has been assigned to the item. |
COST_CODE | string | Name of the cost code assigned to the estimate item. |
COST_CODE_ID | integer | Unique identifier for the cost code assigned to the estimate item. |
DOLLAR_MARKUP | decimal | Individual markup calculated from the estimate item. |
COMMITTED_COSTS | decimal | Total committed costs recorded for the estimate item. |
INVOICED_AMOUNTS | decimal | Total amount invoiced for the estimate item. |
ACTUAL | decimal | Total actual costs recorded for the estimate item. |
QB_COMMITTED | decimal | Total committed costs recorded in QuickBooks for the the estimate item. |
QB_INVOICED | decimal | Total amount invoiced in QuickBooks for the estimate item. |
QB_ACTUAL | decimal | Total actual costs recorded in QuickBooks for the estimate item. |
SALES_TAX | decimal | Total tax calculated for the estimate item. |
UNIT | integer | Unique identifier of the unit used to measure the estimate item. |
UNIT_NAME | string | Name of the unit used to measure the estimate item. |
ASSIGNED | string | Unique identifier for user(s) assigned to the estimate item as a resource. |
Example response:
{
"ID": 47440788,
"ESTIMATE_ID": 367610,
"CATEGORY_ID": 4393211,
"SUBCATEGORY_ID": 22069965,
"ROW_NUMBER": 3,
"NAME": "Site Work",
"DESCRIPTION": "",
"CLASSIFICATION": 5,
"STATUS": 0,
"COST_ESTIMATE": 5000.0,
"NOTES_TEAMLINK": "",
"NOTES_CLIENTLINK": "",
"NOTES_GENERAL": "Specifications require a 10' uncleared buffer area.",
"LINE_ITEM_MARKUP": "1",
"RATE": 500.0,
"RATE_QTY": 10.0,
"LINE_ITEM_MARKUP_TYPE": 1,
"ADJUSTMENT": 0.0,
"FIVE_COLUMN_EQUIPMENT": null,
"FIVE_COLUMN_LABOR": null,
"FIVE_COLUMN_MATERIAL": null,
"FIVE_COLUMN_OTHER": null,
"FIVE_COLUMN_SUB": null,
"TRAFFIC_COLOR": 1,
"COST_CODE": "",
"COST_CODE_ID": 75,
"DOLLAR_MARKUP": 0.0,
"COMMITTED_COSTS": 0.0,
"INVOICED_AMOUNTS": 1000.0,
"ACTUAL": 0.0,
"QB_COMMITTED": null,
"QB_INVOICED": null,
"QB_ACTUAL": 0.0,
"SALES_TAX": 0.0,
"UNIT": "0",
"UNIT_NAME": null,
"ASSIGNED": 123456
}
api/EstimateMarkup
The following properties will return when an api/EstimateMarkup endpoint is called:
Name | Type | Description |
ID | integer | Unique identifier for the markup entry. |
NAME | string | Name of the markup entry. |
ESTIMATE_ID | integer | Unique identifier for the estimate containing the markup entry. |
VALUE | double | Value assigned to the markup entry. |
MARKUP_TYPE | integer | Markup type assigned to the markup entry. A value of 1 represents Percent Margin, 2 represents Percent of Costs, and 3 represents Fixed Amount. |
INVOICED | double | Amount invoiced towards the markup entry. |
ACTUALS | double | Actual cost of the markup entry; amount recorded in the Actuals column of the estimate. |
QB_ACTUALS | double | Value of QuickBooks Actuals associated with the markup entry. |
QB_INVOICED | double | Value of invoices within QuickBooks associated with the markup entry. |
TOTAL_MARKUP | double | Total amount calculated for the markup entry. |
Example response:
{
"ID": 1396830,
"NAME": "Company Overhead",
"ESTIMATE_ID": 367610,
"VALUE": 8.0,
"MARKUP_TYPE": 2,
"INVOICED": 0.0,
"ACTUALS": 0.0,
"QB_ACTUALS": 0.0,
"QB_INVOICED": 0.0,
"TOTAL_MARKUP": 29305.000000000004
},
{
"ID": 1396831,
"NAME": "Company Margin",
"ESTIMATE_ID": 367610,
"VALUE": 30.0,
"MARKUP_TYPE": 1,
"INVOICED": 0.0,
"ACTUALS": 0.0,
"QB_ACTUALS": 0.0,
"QB_INVOICED": 0.0,
"TOTAL_MARKUP": 169550.35714285722
},
{
"ID": 1396832,
"NAME": "Contingency",
"ESTIMATE_ID": 367610,
"VALUE": 0.0,
"MARKUP_TYPE": 3,
"INVOICED": 0.0,
"ACTUALS": 0.0,
"QB_ACTUALS": 0.0,
"QB_INVOICED": 0.0,
"TOTAL_MARKUP": 0.0
}