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.
Schema Query Parameters
Section titled “Schema Query Parameters”Every endpoint supports these optional query parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
schema | boolean | false | When true, returns a JSON schema instead of executing the request |
schemaType | string | request | When schema=true, specifies which schema to return: request or response |
Common Response Codes
Section titled “Common Response Codes”| Code | Description |
|---|---|
| 200 | The operation was successful |
| 301 | The requested resource should be accessed through the returned URI in the Location header |
| 400 | Request was not processed due to a client error |
| 401 | Credentials could not be verified |
| 403 | This operation is not allowed for your account type |
| 404 | Requested resource could not be found |
| 405 | Unsupported method for URL |
| 415 | Invalid content type |
| 500 | Internal server error |
| 503 | Service is currently unavailable |
Common Response Structure
Section titled “Common Response Structure”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"
}Endpoints
Section titled “Endpoints”Account Code Options
Section titled “Account Code Options”POST /AccountCodeOptions/Import
Section titled “POST /AccountCodeOptions/Import”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
Request Body Options
Section titled “Request Body Options”| Field | Required | Type | Description |
|---|---|---|---|
segmentId | Yes | integer | The sequence number of the account code segment |
option | Yes | integer | The value of the code option (max 5 characters) |
description | No | string | Description of the code option |
Request Body Example
Section titled “Request Body Example”{
"data": \[
{
"header": {
"segmentId": 1
},
"items": \[
{
"option": "578",
"description": "Test desc a1"
},
{
"option": "579",
"description": "test desc a2"
},
{
"option": "577",
"description": "test desc a3"
}
\]
}
\]
}Success Response
Section titled “Success Response”{
"success": true
}Error Response
Section titled “Error Response”{
"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)"
\]
}
\]
\]
}Account Funding Processes
Section titled “Account Funding Processes”POST /AccountFundingProcesses/Import
Section titled “POST /AccountFundingProcesses/Import”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
Request Body Options
Section titled “Request Body Options”| Field | Required | Type | Description |
|---|---|---|---|
processPrefix | Yes | string | Associates the import with a specific process |
importMode | Yes | string | Entity or LineItem |
projectIdentifier | No | string | Field used for project lookup. Default is ProjectName; can be a unique project custom field name |
createAsDraft | No | boolean | When true, creates process instances as saved drafts (not submitted) |
readOnlyThrowExceptions | No | boolean | When true, halts import on read-only field exceptions |
updatesOnlyViaCostNumber | No | boolean | When true, updates use the cost entity number instead of the process counter |
abortOnException | No | boolean | Aborts 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"
}
}
}
\]
}Error Response
Section titled “Error Response”{
"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"\]
}
\]
}
\]
}Budget Change Processes
Section titled “Budget Change Processes”POST /BudgetChangeProcesses/Import
Section titled “POST /BudgetChangeProcesses/Import”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
Request Body Options
Section titled “Request Body Options”| Field | Required | Type | Description |
|---|---|---|---|
processPrefix | Yes | string | Associates the import with a specific process |
importMode | Yes | string | Entity or LineItem |
projectIdentifier | No | string | Field used for project lookup. Default is ProjectName |
createAsDraft | No | boolean | When true, creates process instances as drafts |
readOnlyThrowExceptions | No | boolean | When true, halts on read-only field exceptions |
updatesOnlyViaCostNumber | No | boolean | When true, updates via cost entity number instead of process counter |
abortOnException | No | boolean | Aborts 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 Response
Section titled “Success Response”{
"success": true
}Budget Changes
Section titled “Budget Changes”PUT /BudgetChanges/Status
Section titled “PUT /BudgetChanges/Status”Description: Updates the status of one or more budget changes.
Request URI: https://{base_url}/api/v2/BudgetChanges/Status
Method: PUT
Request Body Options
Section titled “Request Body Options”| Field | Required | Type | Description |
|---|---|---|---|
projectIdentifier | No | string | Field used for project lookup. Default is ProjectName |
abortOnException | No | boolean | Aborts the entire import on any exception |
Request Body Example
Section titled “Request Body Example”{
"options": {
"projectIdentifier": "ProjectName",
"abortOnException": false
},
"data": \[
{
"projectIdentifier": "My Project A",
"status": "Pending",
"budgetChangeNumber": "001"
}
\]
}Success Response
Section titled “Success Response”{
"success": "true"
}POST /BudgetChanges/Import
Section titled “POST /BudgetChanges/Import”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
Request Body Options
Section titled “Request Body Options”| Field | Required | Type | Description |
|---|---|---|---|
projectIdentifier | No | string | Field used for project lookup. Default is ProjectName |
abortOnException | No | boolean | Aborts the entire import on any exception |
Header Fields
Section titled “Header Fields”| Field | Required | Type | Description |
|---|---|---|---|
projectIdentifier | Yes | string | Project name or custom field value |
budgetChangeNumber | Yes | string | Budget change number |
reasonCode | Yes | string | Reason for the change |
description | Yes | string | Description of the change |
dateOfChange | Yes | string (date-time) | Date of the change |
approvalRequested | No | boolean | Whether approval is requested |
dateApproved | No | string (date-time) | Date the change was approved |
status | No | string | Status of the budget change |
customFields | No | object | Key-value pairs of custom field names and values |
Item Fields
Section titled “Item Fields”| Field | Required | Type | Description |
|---|---|---|---|
budgetLineItem | Yes | string | Budget line item code |
changeItemAmount | Yes | number | Amount of the change for this item |
itemNumber | No | string | Item number |
description | No | string | Item description |
Request Body Example
Section titled “Request Body Example”{
"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 Response
Section titled “Success Response”{
"success": "true"
}Budget Line Items
Section titled “Budget Line Items”POST /BudgetLineItems/Import
Section titled “POST /BudgetLineItems/Import”Description: Performs one or more budget line item imports.
Request URI: https://{base_url}/api/v2/BudgetLineItems/Import
Method: POST
Request Body Options
Section titled “Request Body Options”| Field | Required | Type | Description |
|---|---|---|---|
projectIdentifier | No | string | Field used for project lookup. Default is ProjectName |
budgetControl | Yes | string | Valid values: Uncontrolled, Controlled Total, Controlled by Line Item |
setBudgetStatusApproved | No | boolean | When true, sets the budget status to Approved |
abortOnException | No | boolean | Aborts the entire import on any exception |
Header Fields
Section titled “Header Fields”| Field | Required | Type | Description |
|---|---|---|---|
projectIdentifier | Yes | string | Project name or custom field value |
customFields | No | object | Key-value pairs of project-level custom fields |
Item Fields
Section titled “Item Fields”| Field | Required | Type | Description |
|---|---|---|---|
description | Yes | string | Budget line item description |
allowCharges | No | boolean | Whether charges are allowed |
amount | No | number | Budget amount |
assumption | No | string | Assumption notes |
fundingRule | No | string | Funding rule name |
approvalRequiredForChange | No | boolean | Whether approval is required for changes |
accountCodes | No | object | Account code segment key-value pairs (e.g., {"Category": "C12", "Line Item": "L2"}) |
fundingSources | No | object | Funding source key-value pairs (e.g., {"fund 1": "5000", "fund 2": "1000"}) |
customFields | No | object | Key-value pairs of custom fields |
Request Body Example
Section titled “Request Body Example”{
"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 Response
Section titled “Success Response”{
"success": "true"
}Commitment Changes
Section titled “Commitment Changes”PUT /CommitmentChanges/Status
Section titled “PUT /CommitmentChanges/Status”Description: Updates the status of one or more commitment changes.
Request URI: https://{base_url}/api/v2/CommitmentChanges/Status
Method: PUT
Request Body Options
Section titled “Request Body Options”| Field | Required | Type | Description |
|---|---|---|---|
projectIdentifier | No | string | Field used for project lookup. Default is ProjectName |
abortOnException | No | boolean | Aborts the entire import on any exception |
Data Item Fields
Section titled “Data Item Fields”| Field | Required | Type | Description |
|---|---|---|---|
projectIdentifier | Yes | string | Project identifier value |
commitmentNumber | Yes | string | Commitment number |
commitmentChangeNumber | Yes | string | Commitment change number |
status | Yes | string | New status value |
Request Body Example
Section titled “Request Body Example”{
"options": {
"projectIdentifier": "ProjectName"
},
"data": \[
{
"projectIdentifier": "My Project A",
"Status": "Pending",
"CommitmentNumber": "001",
"CommitmentChangeNumber": "001"
}
\]
}Success Response
Section titled “Success Response”{
"success": "true"
}PUT /CommitmentChanges
Section titled “PUT /CommitmentChanges”Description: Updates the header fields of an existing commitment change.
Request URI: https://{base_url}/api/v2/CommitmentChanges
Method: PUT
Lookup Logic
Section titled “Lookup Logic”The lookup object identifies the commitment change to update. Provide a unique combination of the following fields:
| Lookup Field | Type | Description |
|---|---|---|
projectID | string | Project GUID |
projectName | string | Project name |
projectCustomFieldName + projectCustomFieldValue | string | Project custom field lookup |
commitmentID | string | Commitment GUID |
commitmentNumber | string | Commitment number |
commitmentCustomFieldName + commitmentCustomFieldValue | string | Commitment custom field lookup |
commitmentChangeCustomFieldName + commitmentChangeCustomFieldValue | string | Commitment change custom field lookup |
companyName | string | Company name |
companyNumber | string | Company number |
Standard lookup (preferred):
projectIdentifier+commitmentNumber+commitmentChangeNumberprojectIdentifier+ unique commitment change custom field name + value
Header Fields
Section titled “Header Fields”| Field | Type | Description |
|---|---|---|
commitmentChangeID | string | Commitment change GUID |
commitmentChangeNumber | string | Commitment change number |
dateOfChange | string (date-time) | Date of the change |
description | string | Description |
reasonCode | string | Reason code |
customFields | object | Custom field key-value pairs |
Request Body Example
Section titled “Request Body Example”{
"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 Response
Section titled “Success Response”{
"success": "true"
}POST /CommitmentChanges/Import
Section titled “POST /CommitmentChanges/Import”Description: Creates one or more commitment changes.
Request URI: https://{base_url}/api/v2/CommitmentChanges/Import
Method: POST
Request Body Options
Section titled “Request Body Options”| Field | Required | Type | Description |
|---|---|---|---|
projectIdentifier | No | string | Field used for project lookup. Default is ProjectName |
abortOnException | No | boolean | Aborts the entire import on any exception |
Header Fields
Section titled “Header Fields”| Field | Required | Type | Description |
|---|---|---|---|
projectIdentifier | Yes | string | Project name or custom field value |
commitmentNumber | Yes | string | Associated commitment number |
commitmentChangeNumber | Yes | string | Change number |
dateofChange | Yes | string (date-time) | Date of the change |
reasonCode | Yes | string | Reason code |
description | Yes | string | Description |
approvalRequested | No | boolean | Whether approval is requested |
dateApproved | No | string (date-time) | Approval date |
status | No | string | Status |
companyName | No | string | Company name |
customFields | No | object | Custom field key-value pairs |
Item Fields
Section titled “Item Fields”| Field | Required | Type | Description |
|---|---|---|---|
commitmentChangeItemNumber | Yes | string | Change item number |
commitmentItemNumber | Yes | string | Associated commitment item number |
amount | Yes | number | Item amount |
budgetLineItem | No | string | Associated budget line item |
masterCommitmentItemNumber | No | string | Master commitment item number |
description | No | string | Item description |
retainagePercent | No | number | Retainage percentage |
unitOfMeasure | No | string | Unit of measure |
unitCost | No | number | Unit cost |
quantity | No | number | Quantity |
fundingRule | No | string | Funding rule |
fundingSources | No | object | Funding source key-value pairs |
customFields | No | object | Custom field key-value pairs |
Request Body Example
Section titled “Request Body Example”{
"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 Response
Section titled “Success Response”{
"success": "true"
}Commitment Processes
Section titled “Commitment Processes”POST /CommitmentProcesses/Import
Section titled “POST /CommitmentProcesses/Import”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
Entitymode, a row with aprocessCountervalue is treated as an update; a row without one is treated as a new process creation. - In
LineItemmode, theprocessIdentifierfield groups items into the same process instance. - When
createAsDraftisfalse, 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.
Request Body Options
Section titled “Request Body Options”| Field | Required | Type | Description |
|---|---|---|---|
processPrefix | Yes | string | Associates the import with a specific process |
importMode | Yes | string | Entity or LineItem |
projectIdentifier | No | string | Field used for project lookup. Default is ProjectName |
createAsDraft | No | boolean | When true, creates process instances as drafts |
readOnlyThrowExceptions | No | boolean | When true, halts on read-only field exceptions |
updatesOnlyViaCostNumber | No | boolean | When true, updates use the cost entity number |
abortOnException | No | boolean | Aborts the entire import on any exception |
Header Fields
Section titled “Header Fields”| Field | Required | Type | Description |
|---|---|---|---|
projectIdentifier | Yes | string | Project name or custom field value |
commitmentType | No | string | Type of commitment (e.g., Contract) |
commitmentNumber | No | string | Commitment number |
commitmentControl | No | string | Commitment control type (e.g., Uncontrolled) |
description | No | string | Description |
companyName | No | string | Company name |
companyNumber | No | string | Company number |
defaultRetainagePercent | No | number | Default retainage percentage |
scopeOfWork | No | string | Scope of work |
commitmentDate | No | string (date-time) | Commitment date |
noticeToProceedDate | No | string (date-time) | Notice to proceed date |
dateApproved | No | string (date-time) | Approval date |
approvalRequested | No | string | Whether approval is requested |
useUnitCost | No | boolean | Whether unit cost pricing is used |
masterCommitmentNumber | No | string | Master commitment number |
processCounter | No | string | Process counter (for entity-mode updates) |
processIdentifier | No | string | Groups line items into the same process (LineItem mode) |
trackingPrefix | No | string | Tracking prefix |
overallDateDue | No | string (date-time) | Overall due date |
stepDateDue | No | string (date-time) | Step due date |
subject | No | string | Process subject |
status | No | string | Status |
step | No | string | Step name |
action | No | string | Action to take |
comment | No | string | Comment |
paidDate | No | string (date-time) | Paid date |
customFields | No | object | Custom field key-value pairs |
processDataFields | No | object | Process data field key-value pairs |
Item Fields
Section titled “Item Fields”| Field | Required | Type | Description |
|---|---|---|---|
budgetLineItem | Yes | string | Associated budget line item |
commitmentItemNumber | No | string | Commitment item number |
masterCommitmentItemNumber | No | string | Master commitment item number |
description | No | string | Item description |
retainagePercent | No | number | Retainage percentage |
unitOfMeasure | No | string | Unit of measure |
unitCost | No | string | Unit cost |
quantity | No | string | Quantity |
amount | No | string | Amount |
isAllowance | No | boolean | Whether item is an allowance |
fundingRule | No | string | Funding rule |
fundingSources | No | object | Funding source key-value pairs |
customFields | No | object | Custom 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"
}
}
\]
}Error Response
Section titled “Error Response”{
"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"
\]
}
\]
}
\]
}Commitment Change Processes
Section titled “Commitment Change Processes”POST /CommitmentChangeProcesses/Import
Section titled “POST /CommitmentChangeProcesses/Import”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
Request Body Options
Section titled “Request Body Options”| Field | Required | Type | Description |
|---|---|---|---|
processPrefix | Yes | string | Associates the import with a specific process |
importMode | Yes | string | Entity or LineItem |
projectIdentifier | Yes | string | Field used for project lookup |
createAsDraft | No | boolean | When true, creates process instances as drafts |
readOnlyThrowExceptions | No | boolean | When true, halts on read-only field exceptions |
abortOnException | No | boolean | Aborts the entire import on any exception |
Header Fields
Section titled “Header Fields”| Field | Required | Type | Description |
|---|---|---|---|
projectIdentifier | Yes | string | Project name or custom field value |
processIdentifier | Yes | string | Process identifier for grouping items |
commitmentNumber | Yes | string | Commitment number |
commitmentChangeNumber | No | string | Commitment change number |
dateofChange | No | string (date-time) | Date of the change |
dateApproved | No | string (date-time) | Approval date |
reasonCode | No | string | Reason code |
customFields | No | object | Custom field key-value pairs |
processDataFields | No | object | Process data field key-value pairs |
Item Fields
Section titled “Item Fields”| Field | Required | Type | Description |
|---|---|---|---|
commitmentItemNumber | Yes | string | Associated commitment item number |
itemNumber | No | string | Change item number |
itemAmount | No | number | Item amount |
itemQuantity | No | number | Quantity |
itemDescription | No | string | Item 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 Response
Section titled “Success Response”{
"success": true
}Commitments
Section titled “Commitments”PUT /Commitments/StatusUpdate
Section titled “PUT /Commitments/StatusUpdate”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
Request Body Options
Section titled “Request Body Options”| Field | Required | Type | Description |
|---|---|---|---|
projectIdentifier | Yes | string | Field used for project lookup. Valid values: ProjectName or a unique project custom field name |
abortOnException | No | boolean | Aborts the entire import on any exception |
Data Item Fields
Section titled “Data Item Fields”| Field | Required | Type | Description |
|---|---|---|---|
projectIdentifier | Yes | string | Project identifier value |
commitmentNumber | Yes | string | Commitment number |
status | Yes | string | New status (e.g., Void) |
Request Body Example
Section titled “Request Body Example”{
"options": {
"projectIdentifier": "ProjectName"
},
"data": \[
{
"projectIdentifier": "Project A",
"Status": "Void",
"CommitmentNumber": "1002"
}
\]
}Error Response
Section titled “Error Response”{
"success": false,
"records": \[
{
"projectIdentifier": "Project A",
"commitmentNumber": "1002",
"status": "Void",
"errorMessages": \[
"Commitment must be in approved status",
"current status is Void"
\]
}
\]
}POST /Commitments/Import
Section titled “POST /Commitments/Import”Description: Creates one or more commitments.
Request URI: https://{base_url}/api/v2/Commitments/Import
Method: POST
Request Body Options
Section titled “Request Body Options”| Field | Required | Type | Description |
|---|---|---|---|
projectIdentifier | No | string | Field used for project lookup. Default is ProjectName |
abortOnException | No | boolean | Aborts the entire import on any exception |
Header Fields
Section titled “Header Fields”| Field | Required | Type | Description |
|---|---|---|---|
projectIdentifier | Yes | string | Project name or custom field value |
commitmentType | Yes | string | Type of commitment (e.g., Contract) |
commitmentNumber | Yes | string | Commitment number |
description | Yes | string | Description |
companyName | Yes | string | Company name |
commitmentControl | No | string | Control type |
defaultRetainagePercent | No | number | Default retainage percentage |
scopeOfWork | No | string | Scope of work |
status | No | string | Initial status |
commitmentDate | No | string (date-time) | Commitment date |
noticeToProceedDate | No | string (date-time) | Notice to proceed date |
dateApproved | No | string (date-time) | Approval date |
companyNumber | No | string | Company number |
approvalRequested | No | boolean | Whether approval is requested |
useUnitCost | No | boolean | Whether unit cost pricing is used |
masterCommitmentNumber | No | string | Master commitment number |
customFields | No | object | Custom field key-value pairs |
Item Fields
Section titled “Item Fields”| Field | Type | Description |
|---|---|---|
commitmentItemNumber | string | Item number |
budgetLineItem | string | Associated budget line item |
description | string | Item description |
retainagePercent | number | Retainage percentage |
unitOfMeasure | string | Unit of measure |
unitCost | number | Unit cost |
quantity | number | Quantity |
amount | number | Item amount |
isAllowanceItem | boolean | Whether item is an allowance |
fundingRule | string | Funding rule |
masterCommitmentItemNumber | string | Master commitment item number |
fundingSources | object | Funding source key-value pairs |
customFields | object | Custom field key-value pairs |
Request Body Example
Section titled “Request Body Example”{
"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 Response
Section titled “Success Response”{
"success": "true"
}Companies
Section titled “Companies”POST /Companies/Import
Section titled “POST /Companies/Import”Description: Creates one or more companies.
Request URI: https://{base_url}/api/v2/Companies/Import
Method: POST
Request Body Options
Section titled “Request Body Options”| Field | Required | Type | Description |
|---|---|---|---|
updateDuplicates | No | boolean | When true, updates existing records that match by company name or company number |
abortOnException | No | boolean | Aborts the entire import on any exception |
Data Item Fields
Section titled “Data Item Fields”| Field | Type | Description |
|---|---|---|
companyName | string | Required. Company name |
isActive | boolean | Whether the company is active |
address | string | Street address |
suite | string | Suite/unit |
city | string | City |
state | string | State |
zip | string | ZIP/postal code |
country | string | Country |
county | string | County |
phone | string | Phone number |
fax | string | Fax number |
webSiteUrl | string | Website URL |
externalID | string | External system identifier |
companyNumber | string | Company number (must be unique) |
isPrequalified | boolean | Whether the company is prequalified |
doNotUse | boolean | Whether the company is marked as do-not-use |
classificationWbe | boolean | Women Business Enterprise |
classificationMbe | boolean | Minority Business Enterprise |
classificationDbe | boolean | Disadvantaged Business Enterprise |
classificationVbe | boolean | Veteran Business Enterprise |
classificationSbe | boolean | Small Business Enterprise |
classificationOther | boolean | Other classification |
customFields | object | Custom field key-value pairs |
Request Body Example
Section titled “Request Body Example”{
"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 Response
Section titled “Success Response”{
"success": "true"
}Error Response
Section titled “Error Response”{
"success": false,
"records": \[
{
"companyName": "ACME Existing Company",
"companyNumber": "ACM003",
"errorMessages": \[
"Company Number already exists"
\]
}
\]
}Contacts
Section titled “Contacts”POST /Contacts/Import
Section titled “POST /Contacts/Import”Description: Creates one or more contacts. Contacts are nested within a company header.
Request URI: https://{base_url}/api/v2/Contacts/Import
Method: POST
Request Body Options
Section titled “Request Body Options”| Field | Required | Type | Description |
|---|---|---|---|
updateDuplicates | No | boolean | When true, updates existing records |
abortOnException | No | boolean | Aborts the entire import on any exception |
Header Fields (Company)
Section titled “Header Fields (Company)”| Field | Type | Description |
|---|---|---|
companyName | string | Required. Company the contacts belong to |
isActive | boolean | Company active status |
address | string | Company address |
city | string | City |
state | string | State |
zip | string | ZIP |
country | string | Country |
phone | string | Phone |
companyNumber | string | Company number |
customFields | object | Company-level custom fields |
Item Fields (Contact)
Section titled “Item Fields (Contact)”| Field | Required | Type | Description |
|---|---|---|---|
firstName | Yes | string | Contact first name |
lastName | Yes | string | Contact last name |
salutation | No | string | Salutation |
email | No | string | Email address |
primary | No | boolean | Whether this is the primary contact |
title | No | string | Job title |
department | No | string | Department |
contactPhone | No | string | Direct phone number |
mobilePhone | No | string | Mobile phone number |
otherPhone | No | string | Other phone number |
pager | No | string | Pager number |
contactFax | No | string | Fax number |
address | No | string | Contact address |
suite | No | string | Suite |
contactCity | No | string | City |
contactState | No | string | State |
contactZip | No | string | ZIP |
contactCountry | No | string | Country |
contactExternalID | No | string | External system identifier |
doNotUseContact | No | boolean | Whether this contact is marked as do-not-use |
customFields | No | object | Custom field key-value pairs |
Request Body Example
Section titled “Request Body Example”{
"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 Response
Section titled “Success Response”{
"success": "true"
}Documents
Section titled “Documents”POST /Documents/Create
Section titled “POST /Documents/Create”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:
- Call this endpoint to create the document record and receive the upload URI and headers.
- 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.
Request Body Options
Section titled “Request Body Options”| Field | Required | Type | Description |
|---|---|---|---|
projectIdentifier | No | boolean | Selects the project identifier behavior for identifying a project by name or custom field value |
Request Body Example
Section titled “Request Body Example”{
"projectName": "My Project A",
"folderPath": "/Documents/Contracts",
"fileName": "contract\_2023.pdf",
"fileSize": 204800,
"customFields": {
"Document Type": "Contract",
"Review Status": "Pending"
}
}Success Response
Section titled “Success Response”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"
}
}Error Response
Section titled “Error Response”{
"success": false,
"messages": \["Project not found."\],
"supportId": "XXXXXXX"
}Document Create — File Upload to S3
Section titled “Document Create — File Upload to S3”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.
Example Request
Section titled “Example Request”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.
POST /Documents/Import
Section titled “POST /Documents/Import”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
Request Body Options
Section titled “Request Body Options”| Field | Required | Type | Description |
|---|---|---|---|
projectIdentifier | No | string | Field used for project lookup. Default is ProjectName |
abortOnException | No | boolean | Aborts 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 Response
Section titled “Success Response”{
"success": "true"
}POST /Documents/Upload
Section titled “POST /Documents/Upload”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
Request Body Fields
Section titled “Request Body Fields”| Field | Required | Type | Description |
|---|---|---|---|
base64EncodedFile | Yes | string | Base64-encoded file content |
fileName | Yes | string | File name including extension |
folderPath | Yes | string | Destination folder path in the project |
projectName | Yes | string | Target project name |
Request Body Example
Section titled “Request Body Example”{
"base64EncodedFile": "JVBERi0xLjQKJcOkw7zDtsO...",
"fileName": "report\_Q3.pdf",
"folderPath": "/Documents/Reports",
"projectName": "My Project A"
}Success Response
Section titled “Success Response”{
"success": true
}Error Response
Section titled “Error Response”{
"success": false,
"messages": \["File size exceeds the 3 MB limit."\],
"supportId": "XXXXXXX"
}Dynamic Grid
Section titled “Dynamic Grid”POST /NonCostProcesses/DynamicGrid/Import
Section titled “POST /NonCostProcesses/DynamicGrid/Import”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
Request Body Options (Header)
Section titled “Request Body Options (Header)”| Field | Required | Type | Description |
|---|---|---|---|
processIdentifier | Yes | string | Defines the process type |
projectIdentifier | Yes | string | Defines the field containing the project identifier value |
instanceIdentifier | Yes | string | Defines the field containing the process instance identifier value |
Item Fields
Section titled “Item Fields”| Field | Required | Type | Description |
|---|---|---|---|
instanceIdentifierValue | Yes | string | Value of the instance identifier used to locate the process instance |
projectIdentifierValue | Yes | string | Value of the project identifier |
dynamicGrids | Yes | array | Array of dynamic grid objects to update |
Dynamic Grid Object Fields
Section titled “Dynamic Grid Object Fields”| Field | Required | Type | Description |
|---|---|---|---|
dynamicGridVariableName | Yes | string | Variable name uniquely identifying the dynamic grid |
dynamicGridRowIdentifier | Yes | string | Row identifier type: customcolumn or rownumber |
dynamicGridRowIdentifierValue | Yes | string | Value of the row identifier |
dynamicGridData | Yes | array | Array of rows to create or update |
Row Object Fields
Section titled “Row Object Fields”| Field | Required | Type | Description |
|---|---|---|---|
rowNumber | Yes | string | Sequence number of the row |
rowData | Yes | array | Array of column name/value pairs |
columnVariableName | No | string | Variable name of the dynamic grid column |
columnData | No | string | Value to set for the column |
Request Body Example
Section titled “Request Body Example”{
"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 Response
Section titled “Success Response”{
"success": true
}Invoice Processes
Section titled “Invoice Processes”POST /InvoiceProcesses/Import
Section titled “POST /InvoiceProcesses/Import”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
Entitymode, a row with aprocessCounteris treated as an update; without one it creates a new process. - In
LineItemmode, theprocessIdentifiergroups line items into the same process instance. - For person/user fields, use the format
Last Name, First Name.
Request Body Options
Section titled “Request Body Options”| Field | Required | Type | Description |
|---|---|---|---|
processPrefix | Yes | string | Associates the import with a specific process |
importMode | Yes | string | Entity or LineItem |
projectIdentifier | No | string | Field used for project lookup. Default is ProjectName |
createAsDraft | No | boolean | When true, creates process instances as drafts |
readOnlyThrowExceptions | No | boolean | When true, halts on read-only field exceptions |
updatesOnlyViaCostNumber | No | boolean | When true, updates via cost entity number |
abortOnException | No | boolean | Aborts the entire import on any exception |
Header Fields
Section titled “Header Fields”| Field | Required | Type | Description |
|---|---|---|---|
projectIdentifier | Yes | string | Project name or custom field value |
invoiceNumber | No | string | Invoice number |
commitmentNumber | No | string | Associated commitment number |
companyName | No | string | Company name |
invoiceDate | No | string (date-time) | Invoice date |
periodFrom | No | string (date-time) | Billing period start date |
periodTo | No | string (date-time) | Billing period end date |
description | No | string | Description |
status | No | string | Status |
step | No | string | Step name |
action | No | string | Action to take |
comment | No | string | Comment |
overallDateDue | No | string (date-time) | Overall due date |
processCounter | No | string | Process counter (for entity-mode updates) |
processIdentifier | No | string | Groups line items (LineItem mode) |
customFields | No | object | Custom field key-value pairs |
processDataFields | No | object | Process data field key-value pairs |
Item Fields
Section titled “Item Fields”| Field | Type | Description |
|---|---|---|
commitmentItemNumber | string | Associated commitment item number |
description | string | Item description |
scheduledValue | number | Scheduled value |
workCompletedPrevious | number | Work completed in previous periods |
workCompletedThisPeriod | number | Work completed this period |
storedMaterials | number | Stored materials value |
retainagePercent | number | Retainage percentage |
customFields | object | Custom 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 Response
Section titled “Success Response”{
"success": true
}Invoices
Section titled “Invoices”POST /Invoices/StatusUpdate
Section titled “POST /Invoices/StatusUpdate”Description: Updates the status of one or more invoices.
Request URI: https://{base_url}/api/v2/Invoices/StatusUpdate
Method: POST
Request Body Options
Section titled “Request Body Options”| Field | Required | Type | Description |
|---|---|---|---|
projectIdentifier | No | string | Field used for project lookup. Default is ProjectName |
abortOnException | No | boolean | Aborts the entire import on any exception |
Data Item Fields
Section titled “Data Item Fields”| Field | Required | Type | Description |
|---|---|---|---|
projectIdentifier | Yes | string | Project identifier value |
invoiceNumber | Yes | string | Invoice number |
status | Yes | string | New status value |
Request Body Example
Section titled “Request Body Example”{
"options": {
"projectIdentifier": "ProjectName"
},
"data": \[
{
"projectIdentifier": "My Project A",
"invoiceNumber": "INV-2023-001",
"status": "Void"
}
\]
}Success Response
Section titled “Success Response”{
"success": "true"
}POST /Invoices/Import
Section titled “POST /Invoices/Import”Description: Creates one or more invoices.
Request URI: https://{base_url}/api/v2/Invoices/Import
Method: POST
Request Body Options
Section titled “Request Body Options”| Field | Required | Type | Description |
|---|---|---|---|
projectIdentifier | No | string | Field used for project lookup. Default is ProjectName |
abortOnException | No | boolean | Aborts the entire import on any exception |
Header Fields
Section titled “Header Fields”| Field | Required | Type | Description |
|---|---|---|---|
projectIdentifier | Yes | string | Project name or custom field value |
invoiceNumber | Yes | string | Invoice number |
commitmentNumber | Yes | string | Associated commitment number |
companyName | No | string | Company name |
invoiceDate | No | string (date-time) | Invoice date |
periodFrom | No | string (date-time) | Billing period start |
periodTo | No | string (date-time) | Billing period end |
description | No | string | Description |
status | No | string | Initial status |
customFields | No | object | Custom field key-value pairs |
Item Fields
Section titled “Item Fields”| Field | Type | Description |
|---|---|---|
commitmentItemNumber | string | Associated commitment item number |
description | string | Item description |
scheduledValue | number | Scheduled value |
workCompletedThisPeriod | number | Work completed this period |
workCompletedPrevious | number | Work completed in prior periods |
storedMaterials | number | Stored materials value |
retainagePercent | number | Retainage percentage |
customFields | object | Custom field key-value pairs |
Request Body Example
Section titled “Request Body Example”{
"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 Response
Section titled “Success Response”{
"success": "true"
}Master Commitment Change Processes
Section titled “Master Commitment Change Processes”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
Request Body Options
Section titled “Request Body Options”| Field | Required | Type | Description |
|---|---|---|---|
processPrefix | Yes | string | Associates the import with a specific process |
importMode | Yes | string | Entity or LineItem |
projectIdentifier | No | string | Field used for project lookup. Default is ProjectName |
createAsDraft | No | boolean | When true, creates process instances as drafts |
readOnlyThrowExceptions | No | boolean | When true, halts on read-only field exceptions |
updatesOnlyViaCostNumber | No | boolean | When true, updates via cost entity number |
abortOnException | No | boolean | Aborts the entire import on any exception |
Header Fields
Section titled “Header Fields”| Field | Required | Type | Description |
|---|---|---|---|
projectIdentifier | Yes | string | Project name or custom field value |
masterCommitmentNumber | No | string | Master commitment number |
masterCommitmentChangeNumber | No | string | Change number |
description | No | string | Description |
reasonCode | No | string | Reason code |
dateofChange | No | string (date-time) | Date of the change |
status | No | string | Status |
step | No | string | Step name |
action | No | string | Action to take |
comment | No | string | Comment |
processCounter | No | string | Process counter (entity-mode updates) |
overallDateDue | No | string (date-time) | Overall due date |
customFields | No | object | Custom field key-value pairs |
processDataFields | No | object | Process data field key-value pairs |
Item Fields
Section titled “Item Fields”| Field | Type | Description |
|---|---|---|
masterCommitmentItemNumber | string | Master commitment item number |
description | string | Item description |
amount | number | Change amount |
quantity | number | Quantity |
unitCost | number | Unit cost |
customFields | object | Custom 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 Response
Section titled “Success Response”{
"success": true
}Master Commitment Changes
Section titled “Master Commitment Changes”POST /MasterCommitmentChanges/Import
Section titled “POST /MasterCommitmentChanges/Import”Description: Creates one or more master commitment changes.
Request URI: https://{base_url}/api/v2/MasterCommitmentChanges/Import
Method: POST
Request Body Options
Section titled “Request Body Options”| Field | Required | Type | Description |
|---|---|---|---|
projectIdentifier | No | string | Field used for project lookup. Default is ProjectName |
abortOnException | No | boolean | Aborts the entire import on any exception |
Header Fields
Section titled “Header Fields”| Field | Required | Type | Description |
|---|---|---|---|
projectIdentifier | Yes | string | Project name or custom field value |
masterCommitmentNumber | Yes | string | Master commitment number |
masterCommitmentChangeNumber | Yes | string | Change number |
description | Yes | string | Description |
reasonCode | Yes | string | Reason code |
dateofChange | Yes | string (date-time) | Date of change |
approvalRequested | No | boolean | Whether approval is requested |
dateApproved | No | string (date-time) | Approval date |
status | No | string | Status |
customFields | No | object | Custom field key-value pairs |
Item Fields
Section titled “Item Fields”| Field | Required | Type | Description |
|---|---|---|---|
masterCommitmentItemNumber | Yes | string | Master commitment item number |
amount | Yes | number | Change amount |
description | No | string | Item description |
quantity | No | number | Quantity |
unitCost | No | number | Unit cost |
customFields | No | object | Custom field key-value pairs |
Request Body Example
Section titled “Request Body Example”{
"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 Response
Section titled “Success Response”{
"success": "true"
}Master Commitment Processes
Section titled “Master Commitment Processes”POST /MasterCommitmentProcesses/Import
Section titled “POST /MasterCommitmentProcesses/Import”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
Request Body Options
Section titled “Request Body Options”| Field | Required | Type | Description |
|---|---|---|---|
processPrefix | Yes | string | Associates the import with a specific process |
importMode | Yes | string | Entity or LineItem |
projectIdentifier | No | string | Field used for project lookup. Default is ProjectName |
createAsDraft | No | boolean | When true, creates process instances as drafts |
readOnlyThrowExceptions | No | boolean | When true, halts on read-only field exceptions |
updatesOnlyViaCostNumber | No | boolean | When true, updates via cost entity number |
abortOnException | No | boolean | Aborts the entire import on any exception |
Header Fields
Section titled “Header Fields”| Field | Required | Type | Description |
|---|---|---|---|
companyName | Yes | string | Company name |
masterCommitmentType | No | string | Type of master commitment |
masterCommitmentDate | No | string (date-time) | Master commitment date |
masterCommitmentControl | No | string | Control type |
masterInvoiceControl | No | string | Invoice control type |
status | No | string | Status |
companyNumber | No | string | Company number |
scopeOfWork | No | string | Scope of work |
defaultRetainagePercent | No | number | Default retainage percentage |
useUnitCost | No | boolean | Whether unit cost pricing is used |
noticetoProceedDate | No | string (date-time) | Notice to proceed date |
dateApproved | No | string (date-time) | Approval date |
processCounter | No | string | Process counter (entity-mode updates) |
overallDateDue | No | string (date-time) | Overall due date |
subject | No | string | Process subject |
step | No | string | Step name |
action | No | string | Action |
comment | No | string | Comment |
customFields | No | object | Custom field key-value pairs |
processDataFields | No | object | Process data field key-value pairs |
Item Fields
Section titled “Item Fields”| Field | Required | Type | Description |
|---|---|---|---|
description | Yes | string | Item description |
itemNumber | No | string | Item number |
retainagePercent | No | number | Retainage percentage |
isAllowanceItem | No | boolean | Whether item is an allowance |
unitOfMeasure | No | string | Unit of measure |
quantity | No | string | Quantity |
unitCost | No | string | Unit cost |
amount | No | string | Amount |
fundingRule | No | string | Funding rule |
accountCodes | No | object | Account code key-value pairs |
customFields | No | object | Custom 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 Response
Section titled “Success Response”{
"success": true
}Master Commitments
Section titled “Master Commitments”POST /MasterCommitments/Import
Section titled “POST /MasterCommitments/Import”Description: Creates one or more master commitments.
Request URI: https://{base_url}/api/v2/MasterCommitments/Import
Method: POST
Request Body Options
Section titled “Request Body Options”| Field | Required | Type | Description |
|---|---|---|---|
projectIdentifier | No | string | Field used for project lookup. Default is ProjectName |
abortOnException | No | boolean | Aborts the entire import on any exception |
Header Fields
Section titled “Header Fields”| Field | Required | Type | Description |
|---|---|---|---|
companyName | Yes | string | Company name |
masterCommitmentType | No | string | Type of master commitment |
masterCommitmentControl | No | string | Control type |
masterInvoiceControl | No | string | Invoice control |
status | No | string | Initial status |
companyNumber | No | string | Company number |
scopeOfWork | No | string | Scope of work |
defaultRetainagePercent | No | number | Default retainage percentage |
useUnitCost | No | boolean | Whether unit cost pricing is used |
noticetoProceedDate | No | string (date-time) | Notice to proceed date |
dateApproved | No | string (date-time) | Approval date |
customFields | No | object | Custom field key-value pairs |
Item Fields
Section titled “Item Fields”| Field | Required | Type | Description |
|---|---|---|---|
description | Yes | string | Item description |
itemNumber | No | string | Item number |
amount | No | string | Amount |
retainagePercent | No | number | Retainage percentage |
isAllowanceItem | No | boolean | Whether item is an allowance |
unitOfMeasure | No | string | Unit of measure |
quantity | No | string | Quantity |
unitCost | No | string | Unit cost |
fundingRule | No | string | Funding rule |
accountCodes | No | object | Account code key-value pairs |
customFields | No | object | Custom field key-value pairs |
Request Body Example
Section titled “Request Body Example”{
"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 Response
Section titled “Success Response”{
"success": "true"
}Non-Cost Processes
Section titled “Non-Cost Processes”POST /NonCostProcesses/Import
Section titled “POST /NonCostProcesses/Import”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
Entitymode, a row with aprocessCountervalue is treated as an update; without one it creates a new process instance. - In
LineItemmode, theprocessIdentifiergroups line items into the same process instance. - When
createAsDraftisfalse, the process is submitted immediately. - For person/user fields, use the format
Last Name, First Name.
Request Body Options
Section titled “Request Body Options”| Field | Required | Type | Description |
|---|---|---|---|
processPrefix | Yes | string | Associates the import with a specific process |
importMode | Yes | string | Entity or LineItem |
projectIdentifier | No | string | Field used for project lookup. Default is ProjectName |
createAsDraft | No | boolean | When true, creates instances as drafts |
readOnlyThrowExceptions | No | boolean | When true, halts on read-only field exceptions |
updatesOnlyViaCostNumber | No | boolean | When true, updates via cost entity number |
abortOnException | No | boolean | Aborts the entire import on any exception |
Header Fields
Section titled “Header Fields”| Field | Required | Type | Description |
|---|---|---|---|
projectIdentifier | Yes | string | Project name or custom field value |
subject | No | string | Process subject |
status | No | string | Status |
step | No | string | Step name |
action | No | string | Action to take |
comment | No | string | Comment |
overallDateDue | No | string (date-time) | Overall due date |
stepDateDue | No | string (date-time) | Step due date |
processCounter | No | string | Process counter (entity-mode updates) |
processIdentifier | No | string | Groups line items (LineItem mode) |
trackingPrefix | No | string | Tracking prefix |
customFields | No | object | Custom field key-value pairs |
processDataFields | No | object | Process 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 Response
Section titled “Success Response”{
"success": true
}Process Instances
Section titled “Process Instances”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
fileIdis invalid, the entire transaction is cancelled. - Maximum of 100 documents per comment.
Request Body Fields
Section titled “Request Body Fields”| Field | Required | Type | Description |
|---|---|---|---|
commentText | Yes | string | Comment text. Length must be 1–1,000,000 characters |
isPrivate | No | boolean | When true, creates a private comment (requires permission). If omitted, defaults to the process configuration |
documents | No | array of string | Array of document GUIDs to attach to the comment |
Request Body Example — Comment Only
Section titled “Request Body Example — Comment Only”{
"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"
\]
}Success Response
Section titled “Success Response”{
"commentId": "cb6c124a-ee1f-4d7b-9e1c-da7838de2b5e",
"success": true,
"supportId": "05L7TRJ"
}Error Response
Section titled “Error Response”{
"errorDescription": "There are error(s) in the request.",
"messages": \[
"Invalid type. Expected Boolean but got String. Path 'isPrivate', line 3, position 22."
\],
"supportId": "00F7B4L"
}Project Funding Sources
Section titled “Project Funding Sources”POST /ProjectFundingSources/Import
Section titled “POST /ProjectFundingSources/Import”Description: Imports project-level funding accounts and transactions.
Request URI: https://{base_url}/api/v2/ProjectFundingSources/Import
Method: POST
Request Body Options
Section titled “Request Body Options”| Field | Required | Type | Description |
|---|---|---|---|
projectIdentifier | No | string | Field used for project lookup. Default is ProjectName |
abortOnException | No | boolean | Aborts the entire import on any exception |
Header Fields
Section titled “Header Fields”| Field | Required | Type | Description |
|---|---|---|---|
projectIdentifier | Yes | string | Project name or custom field value |
Item Fields
Section titled “Item Fields”| Field | Required | Type | Description |
|---|---|---|---|
fundingSourceName | Yes | string | Name of the funding source |
fundingSourceNumber | No | string | Funding source number |
amount | No | number | Funding amount |
fundingCategory | No | string | Funding category |
description | No | string | Description |
customFields | No | object | Custom field key-value pairs |
Request Body Example
Section titled “Request Body Example”{
"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 Response
Section titled “Success Response”{
"success": "true"
}Projects
Section titled “Projects”POST /Projects/Import
Section titled “POST /Projects/Import”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
Request Body Options
Section titled “Request Body Options”| Field | Type | Description |
|---|---|---|
abortOnException | boolean | Aborts the entire import on any exception |
roleTemplate | string | Role template name to apply to the new project |
cashFlowTemplate | string | Cash flow template name |
projectTemplate | object | Project template configuration (see below) |
scheduleTemplate | object | Schedule template configuration (see below) |
budgetTemplate | object | Budget template configuration (see below) |
fundingTemplate | object | Funding template configuration (see below) |
projectTemplate object:
| Field | Type | Description |
|---|---|---|
projectName | string | Name of the project template to apply |
importUsers | string | Whether to import users from the template |
importProjectGroups | string | Whether to import project groups |
importDocumentFolderPermissions | boolean | Whether to import document folder permissions |
applyDocumentFolderPermissionsToFiles | boolean | Whether to apply folder permissions to files |
importDocumentFolderSubscriptions | boolean | Whether to import folder subscriptions |
copyDocumentFolderFiles | boolean | Whether to copy document folder files |
importCalendarSettingsWithExceptions | boolean | Whether to import calendar settings with exceptions |
importProjectLevelOptionsForCustomAndProcessDataFields | boolean | Whether to import project-level options for custom/process data fields |
scheduleTemplate object:
| Field | Type | Description |
|---|---|---|
templateName | string | Schedule template name |
managerRole | string | Manager role name |
managerUser | string | Manager user name |
budgetTemplate object:
| Field | Type | Description |
|---|---|---|
templateName | string | Budget template name |
costCodeSegmentValue | string | Cost code segment value |
fundingTemplate object:
| Field | Type | Description |
|---|---|---|
templateName | string | Funding template name |
completeFundingRuleAllocationPerSource | string | Funding rule allocation per source |
Data Item Fields
Section titled “Data Item Fields”| Field | Required | Type | Description |
|---|---|---|---|
projectName | Yes | string | Project name |
projectAdminUserName | No | string | Username of the project administrator |
projectStatus | No | string | Initial project status |
description | No | string | Project description |
address | No | string | Project address |
city | No | string | City |
zip | No | string | ZIP/postal code |
country | No | string | Country |
startDate | No | string | Project start date |
targetDate | No | string | Target completion date |
allowUserLogins | No | string | Whether to allow user logins (yes/no) |
denyTechsupportAccess | No | string | Whether to deny support access (0/1) |
workflowDueDateOffset | No | string | Workflow due date offset |
projectWebcamUrl | No | string | Project webcam URL |
customFields | No | object | Key-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"
}
}
\]
}Request Body Example — With Templates
Section titled “Request Body Example — With Templates”{
"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 Response
Section titled “Success Response”{
"success": "true"
}Error Response
Section titled “Error Response”{
"success": false,
"messages": \["Project name already exists."\],
"supportId": "XXXXXXX"
}Request Schema Discovery
Section titled “Request Schema Discovery”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=requestTo retrieve the response schema:
POST https://{base_url}/api/v2/{endpoint}?schema=true&schemaType=responseNo request body is required when schema=true. The response will be the full JSON schema for that endpoint.