Skip to content

Import API

All endpoints use a base URL in the form https://{base_url}/api/v2/. Requests and responses use JSON with Content-Type: application/json.

Every endpoint supports these optional query parameters:

ParameterTypeDefaultDescription
schemabooleanfalseWhen true, returns a JSON schema instead of executing the request
schemaTypestringrequestWhen schema=true, specifies which schema to return: request or response
CodeDescription
200The operation was successful
301The requested resource should be accessed through the returned URI in the Location header
400Request was not processed due to a client error
401Credentials could not be verified
403This operation is not allowed for your account type
404Requested resource could not be found
405Unsupported method for URL
415Invalid content type
500Internal server error
503Service is currently unavailable

Most endpoints return a top-level success boolean. On partial or full failure, per-record error messages are returned in an errorMessages array nested within each affected record.

Success response:

{
"success": true
}

Error response:

{
"success": false,
"messages": \["Top-level error message"\],
"records": \[
{
"fieldName": "value",
"errorMessages": \["Record-level error detail"\]
}
\],
"supportId": "XXXXXXX"
}


Description: Creates or updates one or more account code options for an account code segment.

Request URI: https://{base_url}/api/v2/AccountCodeOptions/Import

Method: POST

FieldRequiredTypeDescription
segmentIdYesintegerThe sequence number of the account code segment
optionYesintegerThe value of the code option (max 5 characters)
descriptionNostringDescription of the code option
{
"data": \[
{
"header": {
"segmentId": 1
},
"items": \[
{
"option": "578",
"description": "Test desc a1"
},
{
"option": "579",
"description": "test desc a2"
},
{
"option": "577",
"description": "test desc a3"
}
\]
}
\]
}
{
"success": true
}
{
"success": false,
"messages": \["Error in Import."\],
"records": \[
\[
{
"option": "578test",
"description": "Test desc a1",
"errorMessages": \[
"Option Is Too Long. Option should not be more than 5 character(s)"
\]
}
\]
\]
}

Description: Creates one or more account funding processes. Supports two import modes: LineItem (each row is a funding source or transaction item) and Entity (header-level process information only).

Request URI: https://{base_url}/api/v2/AccountFundingProcesses/Import

Method: POST

FieldRequiredTypeDescription
processPrefixYesstringAssociates the import with a specific process
importModeYesstringEntity or LineItem
projectIdentifierNostringField used for project lookup. Default is ProjectName; can be a unique project custom field name
createAsDraftNobooleanWhen true, creates process instances as saved drafts (not submitted)
readOnlyThrowExceptionsNobooleanWhen true, halts import on read-only field exceptions
updatesOnlyViaCostNumberNobooleanWhen true, updates use the cost entity number instead of the process counter
abortOnExceptionNobooleanAborts the entire import if any exception occurs

Request Body Example — Line Item Mode (Create)

Section titled “Request Body Example — Line Item Mode (Create)”
{
"options": {
"processPrefix": "AFPT",
"importMode": "LineItem",
"createAsDraft": false,
"readOnlyThrowExceptions": true,
"abortOnException": false
},
"data": \[
{
"header": {
"processIdentifier": "MY\_PID",
"overallDateDue": "05.28.2021",
"stepDateDue": "05.29.2021",
"subject": "Funding Source Only Import",
"customFields": {
"FS Custom Field 1": "Funding Source CF Value 1",
"FS Custom Field 2": "Funding Source CF Value 2"
}
},
"items": \[
{
"accountFundingSourceName": "Funding Source A",
"fundingSourceDescription": "Funding Source A Created via API Import",
"fundingCategory": "1st category",
"adjustmentDescription": "ABCDEFGHIJ",
"adjustmentItemAmount": 18888.80,
"customFields": {
"TX Custom Field 1": "TX1 Value 1",
"TX Custom Field 2": "TX1 Value 2"
}
}
\]
}
\]
}

Request Body Example — Entity Mode (Create)

Section titled “Request Body Example — Entity Mode (Create)”
{
"options": {
"processPrefix": "AFPT",
"importMode": "Entity",
"createAsDraft": false,
"readOnlyThrowExceptions": true,
"abortOnException": false
},
"data": \[
{
"header": {
"overallDateDue": "05.28.2021",
"stepDateDue": "05.29.2021",
"subject": "New Account Funding Process",
"customFields": {
"FS Custom Field 1": "Funding Source CF Value 1"
}
}
}
\]
}

Request Body Example — Entity Mode (Update)

Section titled “Request Body Example — Entity Mode (Update)”

To update an existing account funding process, include processCounter to identify the instance:

{
"options": {
"processPrefix": "AFPT",
"importMode": "Entity",
"readOnlyThrowExceptions": true,
"abortOnException": false
},
"data": \[
{
"header": {
"processCounter": "AFPT-0012",
"step": "Finance Review",
"action": "Approve",
"comment": "Approved via API",
"customFields": {
"FS Custom Field 1": "Updated CF Value"
}
}
}
\]
}
{
"success": false,
"records": \[
{
"header": {
"processIdentifier": "ATF \- 1",
"processCounter": "",
"overallDateDue": "2018-05-28T00:00:00",
"stepDateDue": "2018-05-29T00:00:00",
"subject": "API subject 2",
"step": "",
"action": "",
"comment": null
},
"items": \[
{
"accountFundingSourceName": "API Funding 18",
"fundingSourceDescription": "This funding source created via API 18",
"fundingCategory": "1st category",
"adjustmentDescription": "ABCDEFGHIJ",
"adjustmentItemAmount": 1888880,
"errorMessages": \["Funding source already exists"\]
}
\]
}
\]
}

Description: Creates one or more budget change processes. Supports Entity and LineItem import modes.

Request URI: https://{base_url}/api/v2/BudgetChangeProcesses/Import

Method: POST

FieldRequiredTypeDescription
processPrefixYesstringAssociates the import with a specific process
importModeYesstringEntity or LineItem
projectIdentifierNostringField used for project lookup. Default is ProjectName
createAsDraftNobooleanWhen true, creates process instances as drafts
readOnlyThrowExceptionsNobooleanWhen true, halts on read-only field exceptions
updatesOnlyViaCostNumberNobooleanWhen true, updates via cost entity number instead of process counter
abortOnExceptionNobooleanAborts the entire import on any exception

Request Body Example — Entity Mode (Create)

Section titled “Request Body Example — Entity Mode (Create)”
{
"options": {
"processPrefix": "BCP",
"importMode": "Entity",
"projectIdentifier": "ProjectName",
"createAsDraft": false
},
"data": \[
{
"header": {
"projectIdentifier": "My Project A",
"budgetChangeNumber": "015",
"reasonCode": "Design Change",
"description": "Budget change process entity import",
"dateOfChange": "09/01/2023",
"approvalRequested": false,
"customFields": {
"budget cf 1": "cf value"
}
}
}
\]
}

Request Body Example — Entity Mode (Update)

Section titled “Request Body Example — Entity Mode (Update)”

To update an existing budget change process, include processCounter to identify the instance:

{
"options": {
"processPrefix": "BCP",
"importMode": "Entity",
"projectIdentifier": "ProjectName"
},
"data": \[
{
"header": {
"projectIdentifier": "My Project A",
"processCounter": "BCP-0015",
"step": "Director Approval",
"action": "Approve",
"comment": "Approved via API"
}
}
\]
}

Request Body Example — Line Item Mode (Create)

Section titled “Request Body Example — Line Item Mode (Create)”
{
"options": {
"processPrefix": "BCP",
"importMode": "LineItem",
"projectIdentifier": "ProjectName"
},
"data": \[
{
"header": {
"projectIdentifier": "My Project A",
"budgetChangeNumber": "016",
"reasonCode": "Design Change",
"description": "Budget change with line items",
"dateOfChange": "09/01/2023"
},
"items": \[
{
"itemNumber": "001",
"description": "Line item 1",
"changeItemAmount": 5000,
"budgetLineItem": "b1.1000"
},
{
"itemNumber": "002",
"description": "Line item 2",
"changeItemAmount": 3000,
"budgetLineItem": "b1.1001"
}
\]
}
\]
}
{
"success": true
}

Description: Updates the status of one or more budget changes.

Request URI: https://{base_url}/api/v2/BudgetChanges/Status

Method: PUT

FieldRequiredTypeDescription
projectIdentifierNostringField used for project lookup. Default is ProjectName
abortOnExceptionNobooleanAborts the entire import on any exception
{
"options": {
"projectIdentifier": "ProjectName",
"abortOnException": false
},
"data": \[
{
"projectIdentifier": "My Project A",
"status": "Pending",
"budgetChangeNumber": "001"
}
\]
}
{
"success": "true"
}

Description: Performs one or more budget change imports. This import only updates existing budget items; it does not add new budget items.

Request URI: https://{base_url}/api/v2/BudgetChanges/Import

Method: POST

FieldRequiredTypeDescription
projectIdentifierNostringField used for project lookup. Default is ProjectName
abortOnExceptionNobooleanAborts the entire import on any exception
FieldRequiredTypeDescription
projectIdentifierYesstringProject name or custom field value
budgetChangeNumberYesstringBudget change number
reasonCodeYesstringReason for the change
descriptionYesstringDescription of the change
dateOfChangeYesstring (date-time)Date of the change
approvalRequestedNobooleanWhether approval is requested
dateApprovedNostring (date-time)Date the change was approved
statusNostringStatus of the budget change
customFieldsNoobjectKey-value pairs of custom field names and values
FieldRequiredTypeDescription
budgetLineItemYesstringBudget line item code
changeItemAmountYesnumberAmount of the change for this item
itemNumberNostringItem number
descriptionNostringItem description
{
"options": {
"ProjectIdentifier": "ProjectName",
"AbortOnException": false
},
"data": \[
{
"header": {
"ProjectIdentifier": "My Project A",
"BudgetChangeNumber": "015",
"ReasonCode": "Design Change",
"Description": "Sample demo",
"ApprovalRequested": false,
"DateOfChange": "09/01/2023",
"customFields": {
"all cost entities \- string": "cf value"
}
},
"items": \[
{
"ItemNumber": "001",
"description": "sample item 1",
"ChangeItemAmount": 5000,
"BudgetLineItem": "b1.1000"
},
{
"ItemNumber": "002",
"description": "sample item 2",
"ChangeItemAmount": 3450,
"BudgetLineItem": "b1.1000"
}
\]
}
\]
}
{
"success": "true"
}

Description: Performs one or more budget line item imports.

Request URI: https://{base_url}/api/v2/BudgetLineItems/Import

Method: POST

FieldRequiredTypeDescription
projectIdentifierNostringField used for project lookup. Default is ProjectName
budgetControlYesstringValid values: Uncontrolled, Controlled Total, Controlled by Line Item
setBudgetStatusApprovedNobooleanWhen true, sets the budget status to Approved
abortOnExceptionNobooleanAborts the entire import on any exception
FieldRequiredTypeDescription
projectIdentifierYesstringProject name or custom field value
customFieldsNoobjectKey-value pairs of project-level custom fields
FieldRequiredTypeDescription
descriptionYesstringBudget line item description
allowChargesNobooleanWhether charges are allowed
amountNonumberBudget amount
assumptionNostringAssumption notes
fundingRuleNostringFunding rule name
approvalRequiredForChangeNobooleanWhether approval is required for changes
accountCodesNoobjectAccount code segment key-value pairs (e.g., {"Category": "C12", "Line Item": "L2"})
fundingSourcesNoobjectFunding source key-value pairs (e.g., {"fund 1": "5000", "fund 2": "1000"})
customFieldsNoobjectKey-value pairs of custom fields
{
"options": {
"ProjectIdentifier": "ProjectName",
"BudgetControl": "Uncontrolled"
},
"data": \[
{
"header": {
"projectIdentifier": "My Project A",
"customFields": {
"all cost entities \- string": "cf value"
}
},
"items": \[
{
"allowCharges": true,
"description": "budget line item 1",
"amount": 5000,
"fundingSources": {
"fund 1": "5000",
"fund 2": "1000"
},
"accountCodes": {
"Category": "C12",
"Line Item": "L2"
},
"customFields": {
"budget cf 1": "Sample cf value"
}
},
{
"allowCharges": true,
"description": "budget line item 2",
"amount": 3450,
"fundingSources": {
"fund 1": "2000",
"fund 2": "1450"
},
"accountCodes": {
"Category": "C13",
"Line Item": "L3"
},
"customFields": {
"budget cf 1": "Sample cf value 2"
}
}
\]
}
\]
}
{
"success": "true"
}

Description: Updates the status of one or more commitment changes.

Request URI: https://{base_url}/api/v2/CommitmentChanges/Status

Method: PUT

FieldRequiredTypeDescription
projectIdentifierNostringField used for project lookup. Default is ProjectName
abortOnExceptionNobooleanAborts the entire import on any exception
FieldRequiredTypeDescription
projectIdentifierYesstringProject identifier value
commitmentNumberYesstringCommitment number
commitmentChangeNumberYesstringCommitment change number
statusYesstringNew status value
{
"options": {
"projectIdentifier": "ProjectName"
},
"data": \[
{
"projectIdentifier": "My Project A",
"Status": "Pending",
"CommitmentNumber": "001",
"CommitmentChangeNumber": "001"
}
\]
}
{
"success": "true"
}

Description: Updates the header fields of an existing commitment change.

Request URI: https://{base_url}/api/v2/CommitmentChanges

Method: PUT

The lookup object identifies the commitment change to update. Provide a unique combination of the following fields:

Lookup FieldTypeDescription
projectIDstringProject GUID
projectNamestringProject name
projectCustomFieldName + projectCustomFieldValuestringProject custom field lookup
commitmentIDstringCommitment GUID
commitmentNumberstringCommitment number
commitmentCustomFieldName + commitmentCustomFieldValuestringCommitment custom field lookup
commitmentChangeCustomFieldName + commitmentChangeCustomFieldValuestringCommitment change custom field lookup
companyNamestringCompany name
companyNumberstringCompany number

Standard lookup (preferred):

  • projectIdentifier + commitmentNumber + commitmentChangeNumber
  • projectIdentifier + unique commitment change custom field name + value
FieldTypeDescription
commitmentChangeIDstringCommitment change GUID
commitmentChangeNumberstringCommitment change number
dateOfChangestring (date-time)Date of the change
descriptionstringDescription
reasonCodestringReason code
customFieldsobjectCustom field key-value pairs
{
"lookup": {
"projectID": "0b8e35c5-0dc6-487a-9fd3-bf43c95a5382",
"commitmentChangeNumber": "24b5590a-03a2-43af-bef7-e85947d957e1"
},
"header": {
"description": "Sample description",
"reasonCode": "Design Change",
"customFields": {
"commitment change cf 1": "Sample cf value"
}
}
}
{
"success": "true"
}

Description: Creates one or more commitment changes.

Request URI: https://{base_url}/api/v2/CommitmentChanges/Import

Method: POST

FieldRequiredTypeDescription
projectIdentifierNostringField used for project lookup. Default is ProjectName
abortOnExceptionNobooleanAborts the entire import on any exception
FieldRequiredTypeDescription
projectIdentifierYesstringProject name or custom field value
commitmentNumberYesstringAssociated commitment number
commitmentChangeNumberYesstringChange number
dateofChangeYesstring (date-time)Date of the change
reasonCodeYesstringReason code
descriptionYesstringDescription
approvalRequestedNobooleanWhether approval is requested
dateApprovedNostring (date-time)Approval date
statusNostringStatus
companyNameNostringCompany name
customFieldsNoobjectCustom field key-value pairs
FieldRequiredTypeDescription
commitmentChangeItemNumberYesstringChange item number
commitmentItemNumberYesstringAssociated commitment item number
amountYesnumberItem amount
budgetLineItemNostringAssociated budget line item
masterCommitmentItemNumberNostringMaster commitment item number
descriptionNostringItem description
retainagePercentNonumberRetainage percentage
unitOfMeasureNostringUnit of measure
unitCostNonumberUnit cost
quantityNonumberQuantity
fundingRuleNostringFunding rule
fundingSourcesNoobjectFunding source key-value pairs
customFieldsNoobjectCustom field key-value pairs
{
"options": {
"projectIdentifier": "ProjectName"
},
"data": \[
{
"header": {
"projectIdentifier": "My Project A",
"CommitmentNumber": "001",
"CommitmentChangeNumber": "008",
"description": "Sample description",
"companyName": "ACME Corp",
"dateOfChange": "09/01/2023",
"reasonCode": "Design Change",
"customFields": {
"commitment change cf 1": "Sample cf value"
}
},
"items": \[
{
"commitmentChangeItemNumber": "001",
"commitmentItemNumber": "001",
"amount": 3000,
"fundingSources": {
"fund 1": "1000",
"fund 2": "2000"
},
"customFields": {
"commitment item cf 1": "Sample cf value"
}
},
{
"commitmentChangeItemNumber": "002",
"commitmentItemNumber": "002",
"amount": 6000,
"customFields": {
"commitment item cf 1": "Sample cf value 2"
}
}
\]
}
\]
}
{
"success": "true"
}

Description: Creates one or more commitment processes. Supports two import modes: LineItem (creates a process with items) and Entity (header-level only; can also update existing processes).

Request URI: https://{base_url}/api/v2/CommitmentProcesses/Import

Method: POST

Notes:

  • In Entity mode, a row with a processCounter value is treated as an update; a row without one is treated as a new process creation.
  • In LineItem mode, the processIdentifier field groups items into the same process instance.
  • When createAsDraft is false, the process is submitted immediately (the Start step’s Submit action is taken).
  • For person/user fields (Member on Account, Role Member, User on Project), use the format Last Name, First Name.
FieldRequiredTypeDescription
processPrefixYesstringAssociates the import with a specific process
importModeYesstringEntity or LineItem
projectIdentifierNostringField used for project lookup. Default is ProjectName
createAsDraftNobooleanWhen true, creates process instances as drafts
readOnlyThrowExceptionsNobooleanWhen true, halts on read-only field exceptions
updatesOnlyViaCostNumberNobooleanWhen true, updates use the cost entity number
abortOnExceptionNobooleanAborts the entire import on any exception
FieldRequiredTypeDescription
projectIdentifierYesstringProject name or custom field value
commitmentTypeNostringType of commitment (e.g., Contract)
commitmentNumberNostringCommitment number
commitmentControlNostringCommitment control type (e.g., Uncontrolled)
descriptionNostringDescription
companyNameNostringCompany name
companyNumberNostringCompany number
defaultRetainagePercentNonumberDefault retainage percentage
scopeOfWorkNostringScope of work
commitmentDateNostring (date-time)Commitment date
noticeToProceedDateNostring (date-time)Notice to proceed date
dateApprovedNostring (date-time)Approval date
approvalRequestedNostringWhether approval is requested
useUnitCostNobooleanWhether unit cost pricing is used
masterCommitmentNumberNostringMaster commitment number
processCounterNostringProcess counter (for entity-mode updates)
processIdentifierNostringGroups line items into the same process (LineItem mode)
trackingPrefixNostringTracking prefix
overallDateDueNostring (date-time)Overall due date
stepDateDueNostring (date-time)Step due date
subjectNostringProcess subject
statusNostringStatus
stepNostringStep name
actionNostringAction to take
commentNostringComment
paidDateNostring (date-time)Paid date
customFieldsNoobjectCustom field key-value pairs
processDataFieldsNoobjectProcess data field key-value pairs
FieldRequiredTypeDescription
budgetLineItemYesstringAssociated budget line item
commitmentItemNumberNostringCommitment item number
masterCommitmentItemNumberNostringMaster commitment item number
descriptionNostringItem description
retainagePercentNonumberRetainage percentage
unitOfMeasureNostringUnit of measure
unitCostNostringUnit cost
quantityNostringQuantity
amountNostringAmount
isAllowanceNobooleanWhether item is an allowance
fundingRuleNostringFunding rule
fundingSourcesNoobjectFunding source key-value pairs
customFieldsNoobjectCustom field key-value pairs

Request Body Example — Line Item Mode (Create)

Section titled “Request Body Example — Line Item Mode (Create)”
{
"options": {
"processPrefix": "CP",
"importMode": "LineItem",
"projectIdentifier": "ProjectName"
},
"data": \[
{
"header": {
"projectIdentifier": "My Project A",
"subject": "New Commitment Process",
"commitmentNumber": "001",
"description": "First commitment process",
"companyName": "ACME Corp",
"commitmentType": "Contract",
"commitmentControl": "Uncontrolled",
"overallDateDue": "08/22/2023"
},
"items": \[
{
"commitmentItemNumber": "001",
"description": "item 1",
"amount": "5000",
"fundingSources": {
"fund 1": "3000",
"fund 2": "2000"
},
"budgetLineItem": "b1.1000",
"customFields": {
"commitment item cf 1": "Code A"
}
},
{
"commitmentItemNumber": "002",
"description": "item 2",
"amount": "5000",
"quantity": "60",
"fundingSources": {
"fund 1": "3000",
"fund 2": "2000"
},
"budgetLineItem": "b1.1000",
"customFields": {
"commitment item cf 1": "Code B"
}
}
\]
}
\]
}

Request Body Example — Entity Mode (Create)

Section titled “Request Body Example — Entity Mode (Create)”
{
"options": {
"processPrefix": "CP",
"importMode": "Entity",
"projectIdentifier": "ProjectName",
"createAsDraft": false
},
"data": \[
{
"header": {
"projectIdentifier": "My Project A",
"subject": "New Contract",
"commitmentNumber": "002",
"description": "Entity-mode commitment process",
"companyName": "ACME Corp",
"commitmentType": "Contract",
"commitmentControl": "Uncontrolled",
"overallDateDue": "08/22/2023",
"customFields": {
"commitment cf 1": "Sample cf value"
}
}
}
\]
}

Request Body Example — Entity Mode (Update)

Section titled “Request Body Example — Entity Mode (Update)”

To update an existing commitment process via entity mode, include the processCounter in the header:

{
"options": {
"processPrefix": "CP",
"importMode": "Entity",
"projectIdentifier": "ProjectName"
},
"data": \[
{
"header": {
"projectIdentifier": "My Project A",
"processCounter": "CP-0042",
"status": "Approved",
"step": "Review",
"action": "Approve",
"comment": "Approved via API"
}
}
\]
}
{
"success": false,
"records": \[
{
"header": {
"projectIdentifier": "My Project A",
"commitmentNumber": "001",
"description": "First commitment process"
},
"items": \[
{
"commitmentItemNumber": "001",
"budgetLineItem": "b1.1000",
"errorMessages": \[
"Commitment Item Amount is required"
\]
}
\]
}
\]
}

Description: Creates one or more commitment change processes. Supports Entity and LineItem import modes.

Request URI: https://{base_url}/api/v2/CommitmentChangeProcesses/Import

Method: POST

FieldRequiredTypeDescription
processPrefixYesstringAssociates the import with a specific process
importModeYesstringEntity or LineItem
projectIdentifierYesstringField used for project lookup
createAsDraftNobooleanWhen true, creates process instances as drafts
readOnlyThrowExceptionsNobooleanWhen true, halts on read-only field exceptions
abortOnExceptionNobooleanAborts the entire import on any exception
FieldRequiredTypeDescription
projectIdentifierYesstringProject name or custom field value
processIdentifierYesstringProcess identifier for grouping items
commitmentNumberYesstringCommitment number
commitmentChangeNumberNostringCommitment change number
dateofChangeNostring (date-time)Date of the change
dateApprovedNostring (date-time)Approval date
reasonCodeNostringReason code
customFieldsNoobjectCustom field key-value pairs
processDataFieldsNoobjectProcess data field key-value pairs
FieldRequiredTypeDescription
commitmentItemNumberYesstringAssociated commitment item number
itemNumberNostringChange item number
itemAmountNonumberItem amount
itemQuantityNonumberQuantity
itemDescriptionNostringItem description

Request Body Example — Entity Mode (Create)

Section titled “Request Body Example — Entity Mode (Create)”
{
"options": {
"processPrefix": "CCP",
"importMode": "Entity",
"projectIdentifier": "ProjectName",
"createAsDraft": false
},
"data": \[
{
"header": {
"projectIdentifier": "My Project A",
"processIdentifier": "CCP-NEW-001",
"commitmentNumber": "001",
"commitmentChangeNumber": "002",
"dateofChange": "09/01/2023",
"reasonCode": "Design Change",
"customFields": {
"ccp cf 1": "cf value"
}
}
}
\]
}

Request Body Example — Entity Mode (Update)

Section titled “Request Body Example — Entity Mode (Update)”

To update an existing commitment change process, include processCounter to identify the instance:

{
"options": {
"processPrefix": "CCP",
"importMode": "Entity",
"projectIdentifier": "ProjectName"
},
"data": \[
{
"header": {
"projectIdentifier": "My Project A",
"processCounter": "CCP-0008",
"step": "Approval",
"action": "Approve",
"comment": "Approved via API"
}
}
\]
}

Request Body Example — Line Item Mode (Create)

Section titled “Request Body Example — Line Item Mode (Create)”
{
"options": {
"processPrefix": "CCP",
"importMode": "LineItem",
"projectIdentifier": "ProjectName"
},
"data": \[
{
"header": {
"projectIdentifier": "My Project A",
"processIdentifier": "CCP-GROUP-001",
"commitmentNumber": "001",
"commitmentChangeNumber": "002",
"dateofChange": "09/01/2023",
"reasonCode": "Design Change"
},
"items": \[
{
"commitmentItemNumber": "001",
"itemNumber": "001",
"itemAmount": 5000,
"itemDescription": "Change item 1"
},
{
"commitmentItemNumber": "002",
"itemNumber": "002",
"itemAmount": 3000,
"itemDescription": "Change item 2"
}
\]
}
\]
}
{
"success": true
}

Description: Updates the status of one or more commitments. Commitments may be voided by setting the status to Void (void must be enabled on the account).

Request URI: https://{base_url}/api/v2/Commitments/StatusUpdate

Method: PUT

FieldRequiredTypeDescription
projectIdentifierYesstringField used for project lookup. Valid values: ProjectName or a unique project custom field name
abortOnExceptionNobooleanAborts the entire import on any exception
FieldRequiredTypeDescription
projectIdentifierYesstringProject identifier value
commitmentNumberYesstringCommitment number
statusYesstringNew status (e.g., Void)
{
"options": {
"projectIdentifier": "ProjectName"
},
"data": \[
{
"projectIdentifier": "Project A",
"Status": "Void",
"CommitmentNumber": "1002"
}
\]
}
{
"success": false,
"records": \[
{
"projectIdentifier": "Project A",
"commitmentNumber": "1002",
"status": "Void",
"errorMessages": \[
"Commitment must be in approved status",
"current status is Void"
\]
}
\]
}

Description: Creates one or more commitments.

Request URI: https://{base_url}/api/v2/Commitments/Import

Method: POST

FieldRequiredTypeDescription
projectIdentifierNostringField used for project lookup. Default is ProjectName
abortOnExceptionNobooleanAborts the entire import on any exception
FieldRequiredTypeDescription
projectIdentifierYesstringProject name or custom field value
commitmentTypeYesstringType of commitment (e.g., Contract)
commitmentNumberYesstringCommitment number
descriptionYesstringDescription
companyNameYesstringCompany name
commitmentControlNostringControl type
defaultRetainagePercentNonumberDefault retainage percentage
scopeOfWorkNostringScope of work
statusNostringInitial status
commitmentDateNostring (date-time)Commitment date
noticeToProceedDateNostring (date-time)Notice to proceed date
dateApprovedNostring (date-time)Approval date
companyNumberNostringCompany number
approvalRequestedNobooleanWhether approval is requested
useUnitCostNobooleanWhether unit cost pricing is used
masterCommitmentNumberNostringMaster commitment number
customFieldsNoobjectCustom field key-value pairs
FieldTypeDescription
commitmentItemNumberstringItem number
budgetLineItemstringAssociated budget line item
descriptionstringItem description
retainagePercentnumberRetainage percentage
unitOfMeasurestringUnit of measure
unitCostnumberUnit cost
quantitynumberQuantity
amountnumberItem amount
isAllowanceItembooleanWhether item is an allowance
fundingRulestringFunding rule
masterCommitmentItemNumberstringMaster commitment item number
fundingSourcesobjectFunding source key-value pairs
customFieldsobjectCustom field key-value pairs
{
"options": {
"projectIdentifier": "ProjectName"
},
"data": \[
{
"header": {
"projectIdentifier": "My Project A",
"commitmentType": "Contract",
"CommitmentNumber": "026",
"description": "Sample description",
"commitmentControl": "Uncontrolled",
"companyName": "ACME Corp",
"DefaultRetainagePercent": 10,
"useUnitCost": true,
"customFields": {
"commitment cf 1": "Sample cf value"
}
},
"items": \[
{
"commitmentItemNumber": "001",
"amount": 5000,
"quantity": 50,
"unitCost": 100,
"fundingSources": {
"fund 1": "4000",
"fund 2": "1000"
},
"budgetLineItem": "b1.1000",
"customFields": {
"commitment item cf 1": "Code A"
}
},
{
"commitmentItemNumber": "002",
"description": "item 2",
"amount": 6000,
"quantity": 60,
"unitCost": 100,
"fundingSources": {
"fund 1": "2000",
"fund 2": "4000"
},
"budgetLineItem": "b1.1000",
"customFields": {
"commitment item cf 1": "Code A"
}
}
\]
}
\]
}
{
"success": "true"
}

Description: Creates one or more companies.

Request URI: https://{base_url}/api/v2/Companies/Import

Method: POST

FieldRequiredTypeDescription
updateDuplicatesNobooleanWhen true, updates existing records that match by company name or company number
abortOnExceptionNobooleanAborts the entire import on any exception
FieldTypeDescription
companyNamestringRequired. Company name
isActivebooleanWhether the company is active
addressstringStreet address
suitestringSuite/unit
citystringCity
statestringState
zipstringZIP/postal code
countrystringCountry
countystringCounty
phonestringPhone number
faxstringFax number
webSiteUrlstringWebsite URL
externalIDstringExternal system identifier
companyNumberstringCompany number (must be unique)
isPrequalifiedbooleanWhether the company is prequalified
doNotUsebooleanWhether the company is marked as do-not-use
classificationWbebooleanWomen Business Enterprise
classificationMbebooleanMinority Business Enterprise
classificationDbebooleanDisadvantaged Business Enterprise
classificationVbebooleanVeteran Business Enterprise
classificationSbebooleanSmall Business Enterprise
classificationOtherbooleanOther classification
customFieldsobjectCustom field key-value pairs
{
"options": {
"updateDuplicates": true,
"abortOnException": false
},
"data": \[
{
"companyName": "ACME Corp",
"isActive": true,
"address": "1800 NW 69th Ave \#201",
"city": "Plantation",
"state": "FL",
"zip": "33313",
"country": "United States",
"phone": "954-556-6701",
"webSiteUrl": "www.acmecorp.com",
"classificationWbe": false,
"classificationMbe": false,
"classificationDbe": false,
"classificationVbe": false,
"classificationSbe": false,
"classificationOther": false,
"isPrequalified": false,
"doNotUse": false,
"customFields": {
"GPP / JV Firm?": "No"
}
}
\]
}
{
"success": "true"
}
{
"success": false,
"records": \[
{
"companyName": "ACME Existing Company",
"companyNumber": "ACM003",
"errorMessages": \[
"Company Number already exists"
\]
}
\]
}

Description: Creates one or more contacts. Contacts are nested within a company header.

Request URI: https://{base_url}/api/v2/Contacts/Import

Method: POST

FieldRequiredTypeDescription
updateDuplicatesNobooleanWhen true, updates existing records
abortOnExceptionNobooleanAborts the entire import on any exception
FieldTypeDescription
companyNamestringRequired. Company the contacts belong to
isActivebooleanCompany active status
addressstringCompany address
citystringCity
statestringState
zipstringZIP
countrystringCountry
phonestringPhone
companyNumberstringCompany number
customFieldsobjectCompany-level custom fields
FieldRequiredTypeDescription
firstNameYesstringContact first name
lastNameYesstringContact last name
salutationNostringSalutation
emailNostringEmail address
primaryNobooleanWhether this is the primary contact
titleNostringJob title
departmentNostringDepartment
contactPhoneNostringDirect phone number
mobilePhoneNostringMobile phone number
otherPhoneNostringOther phone number
pagerNostringPager number
contactFaxNostringFax number
addressNostringContact address
suiteNostringSuite
contactCityNostringCity
contactStateNostringState
contactZipNostringZIP
contactCountryNostringCountry
contactExternalIDNostringExternal system identifier
doNotUseContactNobooleanWhether this contact is marked as do-not-use
customFieldsNoobjectCustom field key-value pairs
{
"options": {
"updateDuplicates": true,
"abortOnException": false
},
"data": \[
{
"header": {
"companyName": "ACME Corp",
"isActive": true,
"address": "1800 NW 69th Ave \#201",
"city": "Plantation",
"state": "FL",
"zip": "33313",
"country": "United States",
"phone": "954-556-6701",
"customFields": {
"GPP / JV Firm?": "No"
}
},
"items": \[
{
"firstName": "John",
"lastName": "Smith",
"address": "Alver 1345",
"contactZip": "2000",
"customFields": {
"Test CF Cont": "Sample CF value"
}
}
\]
}
\]
}
{
"success": "true"
}

Description: Creates a document placeholder in the system and returns a pre-signed S3 URI for uploading the actual file. This is a two-step process:

  1. Call this endpoint to create the document record and receive the upload URI and headers.
  2. Upload the file directly to S3 using the URI and headers returned in the response (see Document Create — File Upload to S3).

Request URI: https://{base_url}/api/v2/Documents/Create

Method: POST

Notes:

  • The upload step must be completed within 5 minutes of calling this endpoint, after which the URI expires.
  • Expired URIs or failed uploads leave incomplete document records that must be manually removed.
FieldRequiredTypeDescription
projectIdentifierNobooleanSelects the project identifier behavior for identifying a project by name or custom field value
{
"projectName": "My Project A",
"folderPath": "/Documents/Contracts",
"fileName": "contract\_2023.pdf",
"fileSize": 204800,
"customFields": {
"Document Type": "Contract",
"Review Status": "Pending"
}
}

The response includes the pre-signed URI, required upload headers, HTTP method, and expiry time:

{
"success": true,
"uploadParameters": {
"uri": "https://s3.amazonaws.com/bucket/path/file?AWSAccessKeyId=...\&Expires=...\&Signature=...",
"headers": {
"content-Length": "204800",
"content-Type": "application/pdf",
"x-amz-meta-s-aid": "account-guid",
"x-amz-meta-s-pid": "project-guid",
"x-amz-meta-s-fid": "folder-guid",
"x-amz-meta-s-vn": "1"
},
"httpMethod": "PUT",
"expiresAt": "2023-09-01T18:00:00.000+00:00"
}
}
{
"success": false,
"messages": \["Project not found."\],
"supportId": "XXXXXXX"
}

Description: Uploads the actual file to S3. This is step 2 of the Documents Create flow — the URI and required headers are obtained from the POST /Documents/Create response.

Method: PUT

URI: Use the exact uri value returned from POST /Documents/Create.

Headers: Use the exact headers object returned from POST /Documents/Create. All headers in the response must be included on the upload request to ensure signature verification succeeds.

PUT https://s3.amazonaws.com/bucket/path/…?AWSAccessKeyId=…\&Expires=…\&Signature=

content-Length: 204800

content-Type: application/pdf

x-amz-meta-s-aid: account-guid

x-amz-meta-s-pid: project-guid

x-amz-meta-s-fid: folder-guid

x-amz-meta-s-vn: 1

[binary file content]

A successful upload returns HTTP 200. No JSON body is returned.


Description: Imports document metadata (custom fields and properties) for an existing document. The document itself must already exist in the system.

Request URI: https://{base_url}/api/v2/Documents/Import

Method: POST

FieldRequiredTypeDescription
projectIdentifierNostringField used for project lookup. Default is ProjectName
abortOnExceptionNobooleanAborts the entire import on any exception

Request Body Example — Update a document in a project folder

Section titled “Request Body Example — Update a document in a project folder”
{
"options": {
"projectIdentifier": "ProjectName"
},
"data": \[
{
"projectIdentifier": "My Project A",
"folderPath": "/Documents/Contracts",
"fileName": "contract\_2023.pdf",
"customFields": {
"Document Type": "Contract",
"Review Status": "Approved"
}
}
\]
}
{
"success": "true"
}

Description: Uploads one or more documents as Base64-encoded content. Limited to 3 MB per document.

Request URI: https://{base_url}/api/v2/Documents/Upload

Method: POST

FieldRequiredTypeDescription
base64EncodedFileYesstringBase64-encoded file content
fileNameYesstringFile name including extension
folderPathYesstringDestination folder path in the project
projectNameYesstringTarget project name
{
"base64EncodedFile": "JVBERi0xLjQKJcOkw7zDtsO...",
"fileName": "report\_Q3.pdf",
"folderPath": "/Documents/Reports",
"projectName": "My Project A"
}
{
"success": true
}
{
"success": false,
"messages": \["File size exceeds the 3 MB limit."\],
"supportId": "XXXXXXX"
}

Description: Creates or updates multiple rows within multiple dynamic grids on multiple process instances.

Request URI: https://{base_url}/api/v2/NonCostProcesses/DynamicGrid/Import

Method: POST

FieldRequiredTypeDescription
processIdentifierYesstringDefines the process type
projectIdentifierYesstringDefines the field containing the project identifier value
instanceIdentifierYesstringDefines the field containing the process instance identifier value
FieldRequiredTypeDescription
instanceIdentifierValueYesstringValue of the instance identifier used to locate the process instance
projectIdentifierValueYesstringValue of the project identifier
dynamicGridsYesarrayArray of dynamic grid objects to update
FieldRequiredTypeDescription
dynamicGridVariableNameYesstringVariable name uniquely identifying the dynamic grid
dynamicGridRowIdentifierYesstringRow identifier type: customcolumn or rownumber
dynamicGridRowIdentifierValueYesstringValue of the row identifier
dynamicGridDataYesarrayArray of rows to create or update
FieldRequiredTypeDescription
rowNumberYesstringSequence number of the row
rowDataYesarrayArray of column name/value pairs
columnVariableNameNostringVariable name of the dynamic grid column
columnDataNostringValue to set for the column
{
"data": \[
{
"header": {
"processIdentifier": "ADGI",
"projectIdentifier": "ProjectName",
"instanceIdentifier": "ProcessNumber"
},
"items": \[
{
"instanceIdentifierValue": "ADGI-0001",
"projectIdentifierValue": "My Project A",
"dynamicGrids": \[
{
"dynamicGridVariableName": "String\_Column",
"dynamicGridRowIdentifier": "customcolumn",
"dynamicGridRowIdentifierValue": "Custom\_String\_Column",
"dynamicGridData": \[
{
"rowNumber": 1,
"rowData": \[
{
"columnVariableName": "Custom\_String\_Column",
"columnData": "Row 1 description"
},
{
"columnVariableName": "Custom\_Dropdown\_Column",
"columnData": "Option A"
},
{
"columnVariableName": "Custom\_Decimal\_column",
"columnData": "12.50"
},
{
"columnVariableName": "Custom\_Date\_Column",
"columnData": "09/01/2023"
},
{
"columnVariableName": "Custom\_Integer\_Column",
"columnData": "42"
}
\]
}
\]
}
\]
}
\]
}
\]
}
{
"success": true
}

Description: Creates one or more invoice processes. Supports Entity and LineItem import modes.

Request URI: https://{base_url}/api/v2/InvoiceProcesses/Import

Method: POST

Notes:

  • In Entity mode, a row with a processCounter is treated as an update; without one it creates a new process.
  • In LineItem mode, the processIdentifier groups line items into the same process instance.
  • For person/user fields, use the format Last Name, First Name.
FieldRequiredTypeDescription
processPrefixYesstringAssociates the import with a specific process
importModeYesstringEntity or LineItem
projectIdentifierNostringField used for project lookup. Default is ProjectName
createAsDraftNobooleanWhen true, creates process instances as drafts
readOnlyThrowExceptionsNobooleanWhen true, halts on read-only field exceptions
updatesOnlyViaCostNumberNobooleanWhen true, updates via cost entity number
abortOnExceptionNobooleanAborts the entire import on any exception
FieldRequiredTypeDescription
projectIdentifierYesstringProject name or custom field value
invoiceNumberNostringInvoice number
commitmentNumberNostringAssociated commitment number
companyNameNostringCompany name
invoiceDateNostring (date-time)Invoice date
periodFromNostring (date-time)Billing period start date
periodToNostring (date-time)Billing period end date
descriptionNostringDescription
statusNostringStatus
stepNostringStep name
actionNostringAction to take
commentNostringComment
overallDateDueNostring (date-time)Overall due date
processCounterNostringProcess counter (for entity-mode updates)
processIdentifierNostringGroups line items (LineItem mode)
customFieldsNoobjectCustom field key-value pairs
processDataFieldsNoobjectProcess data field key-value pairs
FieldTypeDescription
commitmentItemNumberstringAssociated commitment item number
descriptionstringItem description
scheduledValuenumberScheduled value
workCompletedPreviousnumberWork completed in previous periods
workCompletedThisPeriodnumberWork completed this period
storedMaterialsnumberStored materials value
retainagePercentnumberRetainage percentage
customFieldsobjectCustom field key-value pairs

Request Body Example — Line Item Mode (Create)

Section titled “Request Body Example — Line Item Mode (Create)”
{
"options": {
"processPrefix": "IP",
"importMode": "LineItem",
"projectIdentifier": "ProjectName"
},
"data": \[
{
"header": {
"projectIdentifier": "My Project A",
"invoiceNumber": "INV-2023-001",
"commitmentNumber": "001",
"companyName": "ACME Corp",
"invoiceDate": "09/01/2023",
"periodFrom": "08/01/2023",
"periodTo": "08/31/2023",
"description": "Monthly invoice",
"overallDateDue": "09/15/2023"
},
"items": \[
{
"commitmentItemNumber": "001",
"description": "Labor \- August",
"workCompletedThisPeriod": 5000,
"retainagePercent": 10
},
{
"commitmentItemNumber": "002",
"description": "Materials \- August",
"workCompletedThisPeriod": 3000,
"storedMaterials": 500
}
\]
}
\]
}

Request Body Example — Entity Mode (Create)

Section titled “Request Body Example — Entity Mode (Create)”
{
"options": {
"processPrefix": "IP",
"importMode": "Entity",
"projectIdentifier": "ProjectName",
"createAsDraft": false
},
"data": \[
{
"header": {
"projectIdentifier": "My Project A",
"invoiceNumber": "INV-2023-002",
"commitmentNumber": "001",
"companyName": "ACME Corp",
"invoiceDate": "09/01/2023",
"periodFrom": "08/01/2023",
"periodTo": "08/31/2023",
"description": "Entity-mode invoice",
"overallDateDue": "09/15/2023",
"customFields": {
"invoice cf 1": "cf value"
}
}
}
\]
}

Request Body Example — Entity Mode (Update)

Section titled “Request Body Example — Entity Mode (Update)”
{
"options": {
"processPrefix": "IP",
"importMode": "Entity",
"projectIdentifier": "ProjectName"
},
"data": \[
{
"header": {
"projectIdentifier": "My Project A",
"processCounter": "IP-0015",
"status": "Approved",
"step": "Finance Review",
"action": "Approve",
"comment": "Approved via API"
}
}
\]
}
{
"success": true
}

Description: Updates the status of one or more invoices.

Request URI: https://{base_url}/api/v2/Invoices/StatusUpdate

Method: POST

FieldRequiredTypeDescription
projectIdentifierNostringField used for project lookup. Default is ProjectName
abortOnExceptionNobooleanAborts the entire import on any exception
FieldRequiredTypeDescription
projectIdentifierYesstringProject identifier value
invoiceNumberYesstringInvoice number
statusYesstringNew status value
{
"options": {
"projectIdentifier": "ProjectName"
},
"data": \[
{
"projectIdentifier": "My Project A",
"invoiceNumber": "INV-2023-001",
"status": "Void"
}
\]
}
{
"success": "true"
}

Description: Creates one or more invoices.

Request URI: https://{base_url}/api/v2/Invoices/Import

Method: POST

FieldRequiredTypeDescription
projectIdentifierNostringField used for project lookup. Default is ProjectName
abortOnExceptionNobooleanAborts the entire import on any exception
FieldRequiredTypeDescription
projectIdentifierYesstringProject name or custom field value
invoiceNumberYesstringInvoice number
commitmentNumberYesstringAssociated commitment number
companyNameNostringCompany name
invoiceDateNostring (date-time)Invoice date
periodFromNostring (date-time)Billing period start
periodToNostring (date-time)Billing period end
descriptionNostringDescription
statusNostringInitial status
customFieldsNoobjectCustom field key-value pairs
FieldTypeDescription
commitmentItemNumberstringAssociated commitment item number
descriptionstringItem description
scheduledValuenumberScheduled value
workCompletedThisPeriodnumberWork completed this period
workCompletedPreviousnumberWork completed in prior periods
storedMaterialsnumberStored materials value
retainagePercentnumberRetainage percentage
customFieldsobjectCustom field key-value pairs
{
"options": {
"projectIdentifier": "ProjectName"
},
"data": \[
{
"header": {
"projectIdentifier": "My Project A",
"invoiceNumber": "INV-2023-001",
"commitmentNumber": "001",
"companyName": "ACME Corp",
"invoiceDate": "09/01/2023",
"periodFrom": "08/01/2023",
"periodTo": "08/31/2023",
"description": "Monthly billing",
"customFields": {
"invoice cf 1": "cf value"
}
},
"items": \[
{
"commitmentItemNumber": "001",
"description": "Labor",
"scheduledValue": 50000,
"workCompletedPrevious": 20000,
"workCompletedThisPeriod": 5000,
"retainagePercent": 10
},
{
"commitmentItemNumber": "002",
"description": "Materials",
"scheduledValue": 30000,
"workCompletedThisPeriod": 3000,
"storedMaterials": 500
}
\]
}
\]
}
{
"success": "true"
}

POST /MasterCommitmentChangeProcesses/Import

Section titled “POST /MasterCommitmentChangeProcesses/Import”

Description: Creates one or more master commitment change processes. Supports Entity and LineItem import modes.

Request URI: https://{base_url}/api/v2/MasterCommitmentChangeProcesses/Import

Method: POST

FieldRequiredTypeDescription
processPrefixYesstringAssociates the import with a specific process
importModeYesstringEntity or LineItem
projectIdentifierNostringField used for project lookup. Default is ProjectName
createAsDraftNobooleanWhen true, creates process instances as drafts
readOnlyThrowExceptionsNobooleanWhen true, halts on read-only field exceptions
updatesOnlyViaCostNumberNobooleanWhen true, updates via cost entity number
abortOnExceptionNobooleanAborts the entire import on any exception
FieldRequiredTypeDescription
projectIdentifierYesstringProject name or custom field value
masterCommitmentNumberNostringMaster commitment number
masterCommitmentChangeNumberNostringChange number
descriptionNostringDescription
reasonCodeNostringReason code
dateofChangeNostring (date-time)Date of the change
statusNostringStatus
stepNostringStep name
actionNostringAction to take
commentNostringComment
processCounterNostringProcess counter (entity-mode updates)
overallDateDueNostring (date-time)Overall due date
customFieldsNoobjectCustom field key-value pairs
processDataFieldsNoobjectProcess data field key-value pairs
FieldTypeDescription
masterCommitmentItemNumberstringMaster commitment item number
descriptionstringItem description
amountnumberChange amount
quantitynumberQuantity
unitCostnumberUnit cost
customFieldsobjectCustom field key-value pairs

Request Body Example — Entity Mode (Create)

Section titled “Request Body Example — Entity Mode (Create)”
{
"options": {
"processPrefix": "MCCP",
"importMode": "Entity",
"projectIdentifier": "ProjectName",
"createAsDraft": false
},
"data": \[
{
"header": {
"projectIdentifier": "My Project A",
"masterCommitmentNumber": "MC-001",
"masterCommitmentChangeNumber": "MCC-002",
"description": "New master commitment change process",
"reasonCode": "Design Change",
"dateofChange": "09/01/2023",
"customFields": {
"mccp cf 1": "cf value"
}
}
}
\]
}

Request Body Example — Entity Mode (Update)

Section titled “Request Body Example — Entity Mode (Update)”

To update an existing master commitment change process, include processCounter to identify the instance:

{
"options": {
"processPrefix": "MCCP",
"importMode": "Entity",
"projectIdentifier": "ProjectName"
},
"data": \[
{
"header": {
"projectIdentifier": "My Project A",
"processCounter": "MCCP-0005",
"step": "Director Review",
"action": "Approve",
"comment": "Approved via API"
}
}
\]
}

Request Body Example — Line Item Mode (Create)

Section titled “Request Body Example — Line Item Mode (Create)”
{
"options": {
"processPrefix": "MCCP",
"importMode": "LineItem",
"projectIdentifier": "ProjectName"
},
"data": \[
{
"header": {
"projectIdentifier": "My Project A",
"masterCommitmentNumber": "MC-001",
"masterCommitmentChangeNumber": "MCC-001",
"description": "Master change import",
"reasonCode": "Design Change",
"dateofChange": "09/01/2023"
},
"items": \[
{
"masterCommitmentItemNumber": "001",
"description": "Change item 1",
"amount": 10000
}
\]
}
\]
}
{
"success": true
}

Description: Creates one or more master commitment changes.

Request URI: https://{base_url}/api/v2/MasterCommitmentChanges/Import

Method: POST

FieldRequiredTypeDescription
projectIdentifierNostringField used for project lookup. Default is ProjectName
abortOnExceptionNobooleanAborts the entire import on any exception
FieldRequiredTypeDescription
projectIdentifierYesstringProject name or custom field value
masterCommitmentNumberYesstringMaster commitment number
masterCommitmentChangeNumberYesstringChange number
descriptionYesstringDescription
reasonCodeYesstringReason code
dateofChangeYesstring (date-time)Date of change
approvalRequestedNobooleanWhether approval is requested
dateApprovedNostring (date-time)Approval date
statusNostringStatus
customFieldsNoobjectCustom field key-value pairs
FieldRequiredTypeDescription
masterCommitmentItemNumberYesstringMaster commitment item number
amountYesnumberChange amount
descriptionNostringItem description
quantityNonumberQuantity
unitCostNonumberUnit cost
customFieldsNoobjectCustom field key-value pairs
{
"options": {
"projectIdentifier": "ProjectName"
},
"data": \[
{
"header": {
"projectIdentifier": "My Project A",
"masterCommitmentNumber": "MC-001",
"masterCommitmentChangeNumber": "MCC-002",
"description": "this change created via API call",
"reasonCode": "Design Change",
"dateofChange": "09/01/2023",
"customFields": {
"mc change cf 1": "cf value"
}
},
"items": \[
{
"masterCommitmentItemNumber": "001",
"amount": 10000,
"description": "Change item 1"
}
\]
}
\]
}
{
"success": "true"
}

Description: Creates one or more master commitment processes. Supports Entity and LineItem import modes.

Request URI: https://{base_url}/api/v2/MasterCommitmentProcesses/Import

Method: POST

FieldRequiredTypeDescription
processPrefixYesstringAssociates the import with a specific process
importModeYesstringEntity or LineItem
projectIdentifierNostringField used for project lookup. Default is ProjectName
createAsDraftNobooleanWhen true, creates process instances as drafts
readOnlyThrowExceptionsNobooleanWhen true, halts on read-only field exceptions
updatesOnlyViaCostNumberNobooleanWhen true, updates via cost entity number
abortOnExceptionNobooleanAborts the entire import on any exception
FieldRequiredTypeDescription
companyNameYesstringCompany name
masterCommitmentTypeNostringType of master commitment
masterCommitmentDateNostring (date-time)Master commitment date
masterCommitmentControlNostringControl type
masterInvoiceControlNostringInvoice control type
statusNostringStatus
companyNumberNostringCompany number
scopeOfWorkNostringScope of work
defaultRetainagePercentNonumberDefault retainage percentage
useUnitCostNobooleanWhether unit cost pricing is used
noticetoProceedDateNostring (date-time)Notice to proceed date
dateApprovedNostring (date-time)Approval date
processCounterNostringProcess counter (entity-mode updates)
overallDateDueNostring (date-time)Overall due date
subjectNostringProcess subject
stepNostringStep name
actionNostringAction
commentNostringComment
customFieldsNoobjectCustom field key-value pairs
processDataFieldsNoobjectProcess data field key-value pairs
FieldRequiredTypeDescription
descriptionYesstringItem description
itemNumberNostringItem number
retainagePercentNonumberRetainage percentage
isAllowanceItemNobooleanWhether item is an allowance
unitOfMeasureNostringUnit of measure
quantityNostringQuantity
unitCostNostringUnit cost
amountNostringAmount
fundingRuleNostringFunding rule
accountCodesNoobjectAccount code key-value pairs
customFieldsNoobjectCustom field key-value pairs

Request Body Example — Entity Mode (Create)

Section titled “Request Body Example — Entity Mode (Create)”
{
"options": {
"processPrefix": "MCP",
"importMode": "Entity",
"projectIdentifier": "ProjectName",
"createAsDraft": false
},
"data": \[
{
"header": {
"companyName": "ACME Corp",
"masterCommitmentType": "Contract",
"masterCommitmentControl": "Uncontrolled",
"scopeOfWork": "General construction services",
"subject": "New Master Commitment",
"overallDateDue": "12/31/2023",
"customFields": {
"mcp cf 1": "cf value"
}
}
}
\]
}

Request Body Example — Entity Mode (Update)

Section titled “Request Body Example — Entity Mode (Update)”

To update an existing master commitment process, include processCounter to identify the instance:

{
"options": {
"processPrefix": "MCP",
"importMode": "Entity",
"projectIdentifier": "ProjectName"
},
"data": \[
{
"header": {
"processCounter": "MCP-0007",
"step": "Legal Review",
"action": "Approve",
"comment": "Approved via API",
"customFields": {
"mcp cf 1": "Updated value"
}
}
}
\]
}

Request Body Example — Line Item Mode (Create)

Section titled “Request Body Example — Line Item Mode (Create)”
{
"options": {
"processPrefix": "MCP",
"importMode": "LineItem",
"projectIdentifier": "ProjectName"
},
"data": \[
{
"header": {
"companyName": "ACME Corp",
"masterCommitmentType": "Contract",
"masterCommitmentControl": "Uncontrolled",
"scopeOfWork": "General construction",
"subject": "New Master Commitment"
},
"items": \[
{
"description": "Master item 1",
"itemNumber": "001",
"amount": "50000"
},
{
"description": "Master item 2",
"itemNumber": "002",
"amount": "25000"
}
\]
}
\]
}
{
"success": true
}

Description: Creates one or more master commitments.

Request URI: https://{base_url}/api/v2/MasterCommitments/Import

Method: POST

FieldRequiredTypeDescription
projectIdentifierNostringField used for project lookup. Default is ProjectName
abortOnExceptionNobooleanAborts the entire import on any exception
FieldRequiredTypeDescription
companyNameYesstringCompany name
masterCommitmentTypeNostringType of master commitment
masterCommitmentControlNostringControl type
masterInvoiceControlNostringInvoice control
statusNostringInitial status
companyNumberNostringCompany number
scopeOfWorkNostringScope of work
defaultRetainagePercentNonumberDefault retainage percentage
useUnitCostNobooleanWhether unit cost pricing is used
noticetoProceedDateNostring (date-time)Notice to proceed date
dateApprovedNostring (date-time)Approval date
customFieldsNoobjectCustom field key-value pairs
FieldRequiredTypeDescription
descriptionYesstringItem description
itemNumberNostringItem number
amountNostringAmount
retainagePercentNonumberRetainage percentage
isAllowanceItemNobooleanWhether item is an allowance
unitOfMeasureNostringUnit of measure
quantityNostringQuantity
unitCostNostringUnit cost
fundingRuleNostringFunding rule
accountCodesNoobjectAccount code key-value pairs
customFieldsNoobjectCustom field key-value pairs
{
"options": {
"projectIdentifier": "ProjectName"
},
"data": \[
{
"header": {
"companyName": "ACME Corp",
"masterCommitmentType": "Contract",
"masterCommitmentControl": "Uncontrolled",
"status": "Active",
"defaultRetainagePercent": 10,
"customFields": {
"mc cf 1": "cf value"
}
},
"items": \[
{
"description": "Master commitment item 1",
"itemNumber": "001",
"amount": "100000"
},
{
"description": "Master commitment item 2",
"itemNumber": "002",
"amount": "50000"
}
\]
}
\]
}
{
"success": "true"
}

Description: Creates one or more non-cost process instances. Supports Entity and LineItem import modes.

Request URI: https://{base_url}/api/v2/NonCostProcesses/Import

Method: POST

Notes:

  • In Entity mode, a row with a processCounter value is treated as an update; without one it creates a new process instance.
  • In LineItem mode, the processIdentifier groups line items into the same process instance.
  • When createAsDraft is false, the process is submitted immediately.
  • For person/user fields, use the format Last Name, First Name.
FieldRequiredTypeDescription
processPrefixYesstringAssociates the import with a specific process
importModeYesstringEntity or LineItem
projectIdentifierNostringField used for project lookup. Default is ProjectName
createAsDraftNobooleanWhen true, creates instances as drafts
readOnlyThrowExceptionsNobooleanWhen true, halts on read-only field exceptions
updatesOnlyViaCostNumberNobooleanWhen true, updates via cost entity number
abortOnExceptionNobooleanAborts the entire import on any exception
FieldRequiredTypeDescription
projectIdentifierYesstringProject name or custom field value
subjectNostringProcess subject
statusNostringStatus
stepNostringStep name
actionNostringAction to take
commentNostringComment
overallDateDueNostring (date-time)Overall due date
stepDateDueNostring (date-time)Step due date
processCounterNostringProcess counter (entity-mode updates)
processIdentifierNostringGroups line items (LineItem mode)
trackingPrefixNostringTracking prefix
customFieldsNoobjectCustom field key-value pairs
processDataFieldsNoobjectProcess data field key-value pairs

Request Body Example — Entity Mode (Create)

Section titled “Request Body Example — Entity Mode (Create)”
{
"options": {
"processPrefix": "RFI",
"importMode": "Entity",
"projectIdentifier": "ProjectName",
"createAsDraft": false
},
"data": \[
{
"header": {
"projectIdentifier": "My Project A",
"subject": "RFI for electrical layout",
"overallDateDue": "09/15/2023",
"customFields": {
"rfi cf 1": "Value A"
},
"processDataFields": {
"Assigned To": "Smith, John"
}
}
}
\]
}

Request Body Example — Entity Mode (Update)

Section titled “Request Body Example — Entity Mode (Update)”

To update an existing instance, include the processCounter:

{
"options": {
"processPrefix": "RFI",
"importMode": "Entity",
"projectIdentifier": "ProjectName"
},
"data": \[
{
"header": {
"projectIdentifier": "My Project A",
"processCounter": "RFI-0023",
"step": "Review",
"action": "Approve",
"comment": "Approved via API"
}
}
\]
}

Request Body Example — Line Item Mode (Create)

Section titled “Request Body Example — Line Item Mode (Create)”
{
"options": {
"processPrefix": "RFI",
"importMode": "LineItem",
"projectIdentifier": "ProjectName",
"createAsDraft": false
},
"data": \[
{
"header": {
"projectIdentifier": "My Project A",
"processIdentifier": "RFI-BATCH-001",
"subject": "RFI for structural review",
"overallDateDue": "09/15/2023",
"customFields": {
"rfi cf 1": "Value A"
},
"processDataFields": {
"Assigned To": "Smith, John"
}
},
"items": \[
{
"processDataFields": {
"Item Description": "Beam specification question",
"Drawing Reference": "S-101"
}
},
{
"processDataFields": {
"Item Description": "Column connection detail",
"Drawing Reference": "S-102"
}
}
\]
}
\]
}
{
"success": true
}

POST /ProcessInstances/{processInstanceId}/Comments/Create

Section titled “POST /ProcessInstances/{processInstanceId}/Comments/Create”

Description: Creates a comment on an existing process instance.

Request URI: https://{base_url}/api/v2/ProcessInstances/{processInstanceId}/Comments/Create

Method: POST

Path Parameter: processInstanceId — The GUID of the process instance to comment on.

Notes:

  • Comments cannot be added to draft process instances; the instance must be submitted.
  • Comments can only be added in the final step when the process is configured to allow it.
  • For document attachments, each document is identified by its file GUID (fileId).
  • If any fileId is invalid, the entire transaction is cancelled.
  • Maximum of 100 documents per comment.
FieldRequiredTypeDescription
commentTextYesstringComment text. Length must be 1–1,000,000 characters
isPrivateNobooleanWhen true, creates a private comment (requires permission). If omitted, defaults to the process configuration
documentsNoarray of stringArray of document GUIDs to attach to the comment
{
"commentText": "Reviewed and approved.",
"isPrivate": false
}

Request Body Example — Comment with Attachments

Section titled “Request Body Example — Comment with Attachments”
{
"commentText": "See attached supporting documents.",
"isPrivate": false,
"documents": \[
"948576e3-4daa-2512-408b-ae444a45af58",
"45c618b9-8dce-4c25-8840-ea304c16fda7"
\]
}
{
"commentId": "cb6c124a-ee1f-4d7b-9e1c-da7838de2b5e",
"success": true,
"supportId": "05L7TRJ"
}
{
"errorDescription": "There are error(s) in the request.",
"messages": \[
"Invalid type. Expected Boolean but got String. Path 'isPrivate', line 3, position 22."
\],
"supportId": "00F7B4L"
}

Description: Imports project-level funding accounts and transactions.

Request URI: https://{base_url}/api/v2/ProjectFundingSources/Import

Method: POST

FieldRequiredTypeDescription
projectIdentifierNostringField used for project lookup. Default is ProjectName
abortOnExceptionNobooleanAborts the entire import on any exception
FieldRequiredTypeDescription
projectIdentifierYesstringProject name or custom field value
FieldRequiredTypeDescription
fundingSourceNameYesstringName of the funding source
fundingSourceNumberNostringFunding source number
amountNonumberFunding amount
fundingCategoryNostringFunding category
descriptionNostringDescription
customFieldsNoobjectCustom field key-value pairs
{
"options": {
"projectIdentifier": "ProjectName"
},
"data": \[
{
"header": {
"projectIdentifier": "My Project A"
},
"items": \[
{
"fundingSourceName": "Federal Grant 2023",
"fundingSourceNumber": "FG-001",
"amount": 500000,
"fundingCategory": "Federal",
"description": "Federal construction grant"
},
{
"fundingSourceName": "State Bond Fund",
"fundingSourceNumber": "SB-002",
"amount": 250000,
"fundingCategory": "State",
"description": "State bond allocation"
}
\]
}
\]
}
{
"success": "true"
}

Description: Creates one or more projects. Supports applying templates for project settings, schedules, budget, cash flow, and funding.

Request URI: https://{base_url}/api/v2/Projects/Import

Method: POST

FieldTypeDescription
abortOnExceptionbooleanAborts the entire import on any exception
roleTemplatestringRole template name to apply to the new project
cashFlowTemplatestringCash flow template name
projectTemplateobjectProject template configuration (see below)
scheduleTemplateobjectSchedule template configuration (see below)
budgetTemplateobjectBudget template configuration (see below)
fundingTemplateobjectFunding template configuration (see below)

projectTemplate object:

FieldTypeDescription
projectNamestringName of the project template to apply
importUsersstringWhether to import users from the template
importProjectGroupsstringWhether to import project groups
importDocumentFolderPermissionsbooleanWhether to import document folder permissions
applyDocumentFolderPermissionsToFilesbooleanWhether to apply folder permissions to files
importDocumentFolderSubscriptionsbooleanWhether to import folder subscriptions
copyDocumentFolderFilesbooleanWhether to copy document folder files
importCalendarSettingsWithExceptionsbooleanWhether to import calendar settings with exceptions
importProjectLevelOptionsForCustomAndProcessDataFieldsbooleanWhether to import project-level options for custom/process data fields

scheduleTemplate object:

FieldTypeDescription
templateNamestringSchedule template name
managerRolestringManager role name
managerUserstringManager user name

budgetTemplate object:

FieldTypeDescription
templateNamestringBudget template name
costCodeSegmentValuestringCost code segment value

fundingTemplate object:

FieldTypeDescription
templateNamestringFunding template name
completeFundingRuleAllocationPerSourcestringFunding rule allocation per source
FieldRequiredTypeDescription
projectNameYesstringProject name
projectAdminUserNameNostringUsername of the project administrator
projectStatusNostringInitial project status
descriptionNostringProject description
addressNostringProject address
cityNostringCity
zipNostringZIP/postal code
countryNostringCountry
startDateNostringProject start date
targetDateNostringTarget completion date
allowUserLoginsNostringWhether to allow user logins (yes/no)
denyTechsupportAccessNostringWhether to deny support access (0/1)
workflowDueDateOffsetNostringWorkflow due date offset
projectWebcamUrlNostringProject webcam URL
customFieldsNoobjectKey-value pairs of project custom fields

Request Body Example — Minimal (No Templates)

Section titled “Request Body Example — Minimal (No Templates)”
{
"options": {
"AbortOnException": false
},
"data": \[
{
"projectName": "Downtown Office Renovation",
"projectAdminUserName": "jsmith",
"projectStatus": "Active",
"description": "Full renovation of downtown office building",
"address": "123 Main Street",
"city": "Miami",
"zip": "33101",
"country": "United States",
"startDate": "2023-09-01",
"targetDate": "2024-06-30",
"allowUserLogins": "yes",
"customFields": {
"projectType": "Renovation",
"projectCode": "DOC-2023"
}
}
\]
}
{
"options": {
"AbortOnException": false,
"roleTemplate": "Standard Construction Roles",
"cashFlowTemplate": "Monthly Cash Flow",
"projectTemplate": {
"ProjectName": "Standard Project Template",
"ImportUsers": "true",
"importProjectGroups": "true",
"importDocumentFolderPermissions": false,
"applyDocumentFolderPermissionsToFiles": false,
"importDocumentFolderSubscriptions": false,
"copyDocumentFolderFiles": false,
"importCalendarSettingsWithExceptions": false,
"ImportProjectLevelOptionsForCustomAndProcessDataFields": false
},
"scheduleTemplate": {
"templateName": "Standard Schedule",
"managerRole": "Project Manager",
"managerUser": "jsmith"
},
"budgetTemplate": {
"templateName": "Construction Budget",
"costCodeSegmentValue": "CC-01"
},
"fundingTemplate": {
"templateName": "Standard Funding",
"completeFundingRuleAllocationPerSource": "true"
}
},
"data": \[
{
"projectName": "Riverside Campus Expansion",
"projectAdminUserName": "jsmith",
"projectStatus": "Active",
"description": "Campus expansion project",
"address": "500 River Road",
"city": "Orlando",
"zip": "32801",
"country": "United States",
"startDate": "2023-10-01",
"targetDate": "2025-03-31",
"allowUserLogins": "yes",
"customFields": {
"projectManager": "Johnson, Mary",
"projectType": "New Construction",
"campus": "North Campus",
"projectNumber": "RC-2023-01"
}
}
\]
}
{
"success": "true"
}
{
"success": false,
"messages": \["Project name already exists."\],
"supportId": "XXXXXXX"
}

Every endpoint supports returning its full JSON schema instead of executing the request. This is useful for discovering all available fields and their types.

To retrieve the request schema:

POST https://{base_url}/api/v2/{endpoint}?schema=true&schemaType=request

To retrieve the response schema:

POST https://{base_url}/api/v2/{endpoint}?schema=true&schemaType=response

No request body is required when schema=true. The response will be the full JSON schema for that endpoint.