Portal API Docs (2026.04.08)

Download OpenAPI specification:Download

Run In Postman

Getting Started

The Portal API is a RESTful service. It uses resource-oriented URLs, accepts JSON-encoded request bodies, returns JSON-encoded responses, and uses standard HTTP response codes, authentication, and verbs.


PRODUCTION ACCESS

You will use our sandbox until your integration is reviewed and approved. Once approved we'll provide keys to use our production API at https://api.portal.io


SANDBOX ACCESS

STEP 1
Sign up for a free Sandbox Account at https://sandbox.portal.io. This is a dealer test account you will use to exchange test data.

STEP 2
After you have a sandbox account, let your Portal rep know, and they will provide you an API Application Key, as well as a Secret Key (used to hach the signature in your requests)

STEP 3
You're now ready to get your User Key. Please refer to the User Authentication section, which is next in these docs. The User Key is the last thing you'll need to start making requests to the sandbox API at https://sandbox.api.portal.io

Authentication

To call the authenticated public API you first need a User Key.

Use the authentication exchange endpoint documented here:

GET /authenticate/apikeyexchange

For the initial exchange:

  • send Portal username and password as query parameters
  • send X-MSS-API-APPID, X-MSS-CUSTOM-DATE, and X-MSS-SIGNATURE headers

Signing requests

Portal signs requests with HMAC-SHA256 and Base64-encodes the result.

Build the canonical message by concatenating these parts with no separator:

[HTTP method][absolute URL][content type][timestamp][user API key]

Rules:

  • Use the full absolute URL, including the query string when present.
  • Query parameters must be encoded exactly as sent.
  • For GET requests, omit the content-type segment.
  • For non-GET requests, include the exact content type sent in the request.
  • The timestamp must exactly match X-MSS-CUSTOM-DATE.
  • The user API key must exactly match X-MSS-API-USERKEY.
  • For the initial exchange, the user API key is empty in both places.
  • Use the Secret Key as raw ASCII bytes. Do not base64-decode it before computing the HMAC.

Example canonical message for the initial exchange:

GEThttps://api.portal.io/authenticate/apikeyexchange?UserName=user%40example.com&Password=MyP%40ss123Mon, 06 Apr 2026 00:22:19 GMT

If the exchange succeeds, use meta.apiKey from the response on all later authenticated requests. For the HMAC-based public API, this is the value that matters, not bearerToken.

Authenticate User & Get User Token

Exchange your Portal username and password for a User API Key. Send the HMAC authentication headers with this request to obtain the key.

Request
query Parameters
UserName
required
string <= 256 characters

user email address

Password
required
string <password>

user password

header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Responses
200

Success

Response Schema: application/json
userId
string
sessionId
string
userName
string
displayName
string
referrerUrl
string
bearerToken
string
refreshToken
string
refreshTokenExpiry
string <date-time>
profileUrl
string
roles
Array of strings
permissions
Array of strings
authProvider
string
object (ResponseStatus)

ResponseStatus

object (Dictionary_String_String_)

Dictionary<String,String>

401

Invalid credentials or User Email is not verified

get/authenticate/apikeyexchange
Request samples
Response samples
application/json
{
  • "userId": "string",
  • "sessionId": "string",
  • "userName": "string",
  • "displayName": "string",
  • "referrerUrl": "string",
  • "bearerToken": "string",
  • "refreshToken": "string",
  • "refreshTokenExpiry": "2019-08-24T14:15:22Z",
  • "profileUrl": "string",
  • "roles": [
    ],
  • "permissions": [
    ],
  • "authProvider": "string",
  • "responseStatus": {
    },
  • "meta": {
    }
}

Proposals

Most proposal workflows start with GET /public/proposals to Search & Get Proposal List, then GET /public/proposals/{ProposalId} to Get Proposal Details.

Search & Get Proposal List

Returns the proposals for the current account. Supports filtering by status, contact, modified date, search text, and archive state, along with sorting and pagination.

Request
query Parameters
SearchText
string

Search proposal by this text

Statuses
Array of strings
Items Enum: "Draft" "Submitted" "ViewedByClient" "Accepted" "Declined" "Delayed" "Completed" "EmailFailed" "Expired"
ContactId
integer <int32>
ModifiedAfter
string <date-time>

Modified after timestamp in UTC

SortBy
string
Enum: "CreatedDate" "ModifiedDate" "Number" "Name" "ClientName" "Status" "LastModifiedByMe"
IsArchive
boolean

If true return only archived proposals otherwise return non archive proposals

SortDirection
string
PageNumber
integer <int32>

Page number. Starting from 1

PageSize
integer <int32>

Page Size

SalespersonId
integer <int32>

Filter proposals by salesperson user ID

header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Responses
200

Success

Response Schema: application/json
required
Array of objects (PublicProposalModel)

Proposals returned within the current page boundaries

proposalCount
required
integer <int32>

Total number of proposals matching the query across all pages

401

Not Authorized to access this endpoint or your HMAC hash was incorrect.

402

This action requires an active subscription.

403

You do not have permission for this API call.

get/public/proposals
Request samples
Response samples
application/json
{
  • "proposals": [
    ],
  • "proposalCount": 0
}

Create Proposal

Creates a new proposal for the authenticated account. Supply a salesperson ID from the same account and, optionally, a proposal name. If no name is given, the system assigns a default name using the same logic as the Portal UI. The response includes the full proposal detail, including the new proposal ID, number, status, and financial summary.

Request
header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Request Body schema: application/x-www-form-urlencoded
required
SalesPersonId
required
integer <int32>

ID of the salesperson (user) who will own the proposal. Must belong to the current account.

Name
string

Optional name of the proposal. If omitted, the system will assign a default name.

Responses
200

Success

Response Schema: application/json
id
required
integer <int32>

Unique identifier for the proposal. Use this id for subsequent API calls that reference the proposal.

createdDate
required
string <date-time>

UTC timestamp when the proposal was initially created. Returned in ISO 8601 format.

clientLastDecisionDate
string <date-time>

UTC timestamp when the client last accepted or declined the proposal. Null if no client decision has been recorded.

lastCompletedDate
string <date-time>

UTC timestamp when the proposal last reached a completed state, if applicable.

lastModifiedDate
required
string <date-time>

UTC timestamp when the proposal was last modified by any user or system process.

lastModifiedByUserDate
required
string <date-time>

UTC timestamp when the proposal was last modified by a human user (not an automated system update).

required
object (PublicFinancialSummaryModel)

Financial totals, discounts, tax, and currency values for the proposal

Array of objects (PublicChangeOrderModel)

List of change orders associated with this proposal. Each item contains details of scope changes, price adjustments, and approval state.

number
required
integer <int32>

Proposal number unique within the dealer account.

name
required
string

Display name of the proposal.

status
required
string

The current status of the resource.

Enum: "Undefined" "Draft" "Submitted" "ViewedByClient" "Accepted" "Declined" "Delayed" "Completed" "EmailFailed" "Expired"
lastSubmittedDate
string <date-time>

UTC timestamp when the proposal was last submitted to the customer.

clientLastOpenedDate
string <date-time>

UTC timestamp when the customer last opened the proposal viewer link.

object (PublicCustomerModel)

Customer contact

required
object (PublicDealerModel)

Dealer information

coverpageImageUrl
string

Absolute URL of the proposal cover image, when one is available.

aboutUs
string

The about us text for the company profile.

projectDescription
string

A description of the project.

Array of objects (PublicAreaModel)

The list of areas.

object (PublicProfitModel)

Profit summary for the proposal

object (PublicRecurringServicesModel)

Recurring service summary associated with the proposal.

object (PublicPaymentScheduleModel)

Payment schedule configuration for the proposal, including the customer-facing description and individual payment milestones.

Array of objects (PublicPaymentRequestModel)

Payment requests already issued for this proposal.

projectTerms
string

The terms and conditions for the project.

required
object (PublicUserModel)

User summary returned within proposal detail responses

401

Not Authorized. Ensure a valid session cookie or HMAC authentication headers are provided.

402

The dealer's subscription is inactive or expired. An active subscription is required to use this endpoint.

403

You do not have permission for this action.

404

No resource exists with the given ID.

post/public/proposals
Request samples
Response samples
application/json
{
  • "id": 0,
  • "createdDate": "2019-08-24T14:15:22Z",
  • "clientLastDecisionDate": "2019-08-24T14:15:22Z",
  • "lastCompletedDate": "2019-08-24T14:15:22Z",
  • "lastModifiedDate": "2019-08-24T14:15:22Z",
  • "lastModifiedByUserDate": "2019-08-24T14:15:22Z",
  • "financialSummary": {
    },
  • "changeOrders": [
    ],
  • "number": 0,
  • "name": "string",
  • "status": "Undefined",
  • "lastSubmittedDate": "2019-08-24T14:15:22Z",
  • "clientLastOpenedDate": "2019-08-24T14:15:22Z",
  • "customer": {
    },
  • "dealer": {
    },
  • "coverpageImageUrl": "string",
  • "aboutUs": "string",
  • "projectDescription": "string",
  • "areas": [
    ],
  • "profit": {
    },
  • "recurringServices": {
    },
  • "paymentSchedule": {
    },
  • "paymentRequests": [
    ],
  • "projectTerms": "string",
  • "lastModifiedUser": {
    }
}

Get Proposal Details

Returns detailed information for the specified proposal. The HTTP response also sets the Last-Modified header from the response LastModifiedDate.

Request
path Parameters
ProposalId
required
integer <int32>

Proposal Id.

header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Responses
200

Success

Response Schema: application/json
id
required
integer <int32>

Unique identifier for the proposal. Use this id for subsequent API calls that reference the proposal.

createdDate
required
string <date-time>

UTC timestamp when the proposal was initially created. Returned in ISO 8601 format.

clientLastDecisionDate
string <date-time>

UTC timestamp when the client last accepted or declined the proposal. Null if no client decision has been recorded.

lastCompletedDate
string <date-time>

UTC timestamp when the proposal last reached a completed state, if applicable.

lastModifiedDate
required
string <date-time>

UTC timestamp when the proposal was last modified by any user or system process.

lastModifiedByUserDate
required
string <date-time>

UTC timestamp when the proposal was last modified by a human user (not an automated system update).

required
object (PublicFinancialSummaryModel)

Financial totals, discounts, tax, and currency values for the proposal

Array of objects (PublicChangeOrderModel)

List of change orders associated with this proposal. Each item contains details of scope changes, price adjustments, and approval state.

number
required
integer <int32>

Proposal number unique within the dealer account.

name
required
string

Display name of the proposal.

status
required
string

The current status of the resource.

Enum: "Undefined" "Draft" "Submitted" "ViewedByClient" "Accepted" "Declined" "Delayed" "Completed" "EmailFailed" "Expired"
lastSubmittedDate
string <date-time>

UTC timestamp when the proposal was last submitted to the customer.

clientLastOpenedDate
string <date-time>

UTC timestamp when the customer last opened the proposal viewer link.

object (PublicCustomerModel)

Customer contact

required
object (PublicDealerModel)

Dealer information

coverpageImageUrl
string

Absolute URL of the proposal cover image, when one is available.

aboutUs
string

The about us text for the company profile.

projectDescription
string

A description of the project.

Array of objects (PublicAreaModel)

The list of areas.

object (PublicProfitModel)

Profit summary for the proposal

object (PublicRecurringServicesModel)

Recurring service summary associated with the proposal.

object (PublicPaymentScheduleModel)

Payment schedule configuration for the proposal, including the customer-facing description and individual payment milestones.

Array of objects (PublicPaymentRequestModel)

Payment requests already issued for this proposal.

projectTerms
string

The terms and conditions for the project.

required
object (PublicUserModel)

User summary returned within proposal detail responses

401

Not Authorized to access this endpoint or your HMAC hash was incorrect.

403

You do not have permission for this API call.

get/public/proposals/{ProposalId}
Request samples
Response samples
application/json
{
  • "id": 0,
  • "createdDate": "2019-08-24T14:15:22Z",
  • "clientLastDecisionDate": "2019-08-24T14:15:22Z",
  • "lastCompletedDate": "2019-08-24T14:15:22Z",
  • "lastModifiedDate": "2019-08-24T14:15:22Z",
  • "lastModifiedByUserDate": "2019-08-24T14:15:22Z",
  • "financialSummary": {
    },
  • "changeOrders": [
    ],
  • "number": 0,
  • "name": "string",
  • "status": "Undefined",
  • "lastSubmittedDate": "2019-08-24T14:15:22Z",
  • "clientLastOpenedDate": "2019-08-24T14:15:22Z",
  • "customer": {
    },
  • "dealer": {
    },
  • "coverpageImageUrl": "string",
  • "aboutUs": "string",
  • "projectDescription": "string",
  • "areas": [
    ],
  • "profit": {
    },
  • "recurringServices": {
    },
  • "paymentSchedule": {
    },
  • "paymentRequests": [
    ],
  • "projectTerms": "string",
  • "lastModifiedUser": {
    }
}

Update Proposal

Performs a partial update on an existing proposal. You can update the proposal name, reassign the salesperson, or do both in one request. Both fields are optional, and omitted fields keep their current values. SalesPersonId must reference a user in the same account. The response includes the full updated proposal detail.

Request
path Parameters
ProposalId
required
integer <int32>

ID of the proposal to update. Must belong to the current account.

header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Request Body schema: application/x-www-form-urlencoded
Name
string

Optional new name for the proposal. If omitted, the current name is retained.

SalesPersonId
integer <int32>

Optional ID of the new salesperson (user) to assign. Must belong to the current account. If omitted, the current salesperson is retained.

Responses
200

Success

Response Schema: application/json
id
required
integer <int32>

Unique identifier for the proposal. Use this id for subsequent API calls that reference the proposal.

createdDate
required
string <date-time>

UTC timestamp when the proposal was initially created. Returned in ISO 8601 format.

clientLastDecisionDate
string <date-time>

UTC timestamp when the client last accepted or declined the proposal. Null if no client decision has been recorded.

lastCompletedDate
string <date-time>

UTC timestamp when the proposal last reached a completed state, if applicable.

lastModifiedDate
required
string <date-time>

UTC timestamp when the proposal was last modified by any user or system process.

lastModifiedByUserDate
required
string <date-time>

UTC timestamp when the proposal was last modified by a human user (not an automated system update).

required
object (PublicFinancialSummaryModel)

Financial totals, discounts, tax, and currency values for the proposal

Array of objects (PublicChangeOrderModel)

List of change orders associated with this proposal. Each item contains details of scope changes, price adjustments, and approval state.

number
required
integer <int32>

Proposal number unique within the dealer account.

name
required
string

Display name of the proposal.

status
required
string

The current status of the resource.

Enum: "Undefined" "Draft" "Submitted" "ViewedByClient" "Accepted" "Declined" "Delayed" "Completed" "EmailFailed" "Expired"
lastSubmittedDate
string <date-time>

UTC timestamp when the proposal was last submitted to the customer.

clientLastOpenedDate
string <date-time>

UTC timestamp when the customer last opened the proposal viewer link.

object (PublicCustomerModel)

Customer contact

required
object (PublicDealerModel)

Dealer information

coverpageImageUrl
string

Absolute URL of the proposal cover image, when one is available.

aboutUs
string

The about us text for the company profile.

projectDescription
string

A description of the project.

Array of objects (PublicAreaModel)

The list of areas.

object (PublicProfitModel)

Profit summary for the proposal

object (PublicRecurringServicesModel)

Recurring service summary associated with the proposal.

object (PublicPaymentScheduleModel)

Payment schedule configuration for the proposal, including the customer-facing description and individual payment milestones.

Array of objects (PublicPaymentRequestModel)

Payment requests already issued for this proposal.

projectTerms
string

The terms and conditions for the project.

required
object (PublicUserModel)

User summary returned within proposal detail responses

401

Not Authorized. Ensure a valid session cookie or HMAC authentication headers are provided.

402

The dealer's subscription is inactive or expired. An active subscription is required to use this endpoint.

403

You do not have permission for this action.

404

Proposal not found.

409

Proposal state prevents editing

post/public/proposals/{ProposalId}
Request samples
Response samples
application/json
{
  • "id": 0,
  • "createdDate": "2019-08-24T14:15:22Z",
  • "clientLastDecisionDate": "2019-08-24T14:15:22Z",
  • "lastCompletedDate": "2019-08-24T14:15:22Z",
  • "lastModifiedDate": "2019-08-24T14:15:22Z",
  • "lastModifiedByUserDate": "2019-08-24T14:15:22Z",
  • "financialSummary": {
    },
  • "changeOrders": [
    ],
  • "number": 0,
  • "name": "string",
  • "status": "Undefined",
  • "lastSubmittedDate": "2019-08-24T14:15:22Z",
  • "clientLastOpenedDate": "2019-08-24T14:15:22Z",
  • "customer": {
    },
  • "dealer": {
    },
  • "coverpageImageUrl": "string",
  • "aboutUs": "string",
  • "projectDescription": "string",
  • "areas": [
    ],
  • "profit": {
    },
  • "recurringServices": {
    },
  • "paymentSchedule": {
    },
  • "paymentRequests": [
    ],
  • "projectTerms": "string",
  • "lastModifiedUser": {
    }
}

Update Proposal Description

Updates the client-facing project description of a proposal. This is the description shown on customer-facing proposal documents. The request body accepts a single description string. The response includes the full updated proposal detail.

Request
path Parameters
ProposalId
required
integer <int32>

Proposal Id.

header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Request Body schema: application/x-www-form-urlencoded
Description
string

Description.

Responses
200

Success

Response Schema: application/json
id
required
integer <int32>

Unique identifier for the proposal. Use this id for subsequent API calls that reference the proposal.

createdDate
required
string <date-time>

UTC timestamp when the proposal was initially created. Returned in ISO 8601 format.

clientLastDecisionDate
string <date-time>

UTC timestamp when the client last accepted or declined the proposal. Null if no client decision has been recorded.

lastCompletedDate
string <date-time>

UTC timestamp when the proposal last reached a completed state, if applicable.

lastModifiedDate
required
string <date-time>

UTC timestamp when the proposal was last modified by any user or system process.

lastModifiedByUserDate
required
string <date-time>

UTC timestamp when the proposal was last modified by a human user (not an automated system update).

required
object (PublicFinancialSummaryModel)

Financial totals, discounts, tax, and currency values for the proposal

Array of objects (PublicChangeOrderModel)

List of change orders associated with this proposal. Each item contains details of scope changes, price adjustments, and approval state.

number
required
integer <int32>

Proposal number unique within the dealer account.

name
required
string

Display name of the proposal.

status
required
string

The current status of the resource.

Enum: "Undefined" "Draft" "Submitted" "ViewedByClient" "Accepted" "Declined" "Delayed" "Completed" "EmailFailed" "Expired"
lastSubmittedDate
string <date-time>

UTC timestamp when the proposal was last submitted to the customer.

clientLastOpenedDate
string <date-time>

UTC timestamp when the customer last opened the proposal viewer link.

object (PublicCustomerModel)

Customer contact

required
object (PublicDealerModel)

Dealer information

coverpageImageUrl
string

Absolute URL of the proposal cover image, when one is available.

aboutUs
string

The about us text for the company profile.

projectDescription
string

A description of the project.

Array of objects (PublicAreaModel)

The list of areas.

object (PublicProfitModel)

Profit summary for the proposal

object (PublicRecurringServicesModel)

Recurring service summary associated with the proposal.

object (PublicPaymentScheduleModel)

Payment schedule configuration for the proposal, including the customer-facing description and individual payment milestones.

Array of objects (PublicPaymentRequestModel)

Payment requests already issued for this proposal.

projectTerms
string

The terms and conditions for the project.

required
object (PublicUserModel)

User summary returned within proposal detail responses

401

Not Authorized. Ensure a valid session cookie or HMAC authentication headers are provided.

402

The dealer's subscription is inactive or expired. An active subscription is required to use this endpoint.

403

You do not have permission for this action.

404

Proposal not found.

409

Proposal state prevents editing

post/public/proposals/{ProposalId}/description
Request samples
Response samples
application/json
{
  • "id": 0,
  • "createdDate": "2019-08-24T14:15:22Z",
  • "clientLastDecisionDate": "2019-08-24T14:15:22Z",
  • "lastCompletedDate": "2019-08-24T14:15:22Z",
  • "lastModifiedDate": "2019-08-24T14:15:22Z",
  • "lastModifiedByUserDate": "2019-08-24T14:15:22Z",
  • "financialSummary": {
    },
  • "changeOrders": [
    ],
  • "number": 0,
  • "name": "string",
  • "status": "Undefined",
  • "lastSubmittedDate": "2019-08-24T14:15:22Z",
  • "clientLastOpenedDate": "2019-08-24T14:15:22Z",
  • "customer": {
    },
  • "dealer": {
    },
  • "coverpageImageUrl": "string",
  • "aboutUs": "string",
  • "projectDescription": "string",
  • "areas": [
    ],
  • "profit": {
    },
  • "recurringServices": {
    },
  • "paymentSchedule": {
    },
  • "paymentRequests": [
    ],
  • "projectTerms": "string",
  • "lastModifiedUser": {
    }
}

Update Proposal Internal Notes

Updates the internal installer notes (installer project description) of a proposal. These notes are visible only to the dealer's team and do not appear on client-facing documents. The request body accepts a single internal notes string. The response includes the full updated proposal detail.

Request
path Parameters
ProposalId
required
integer <int32>
header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Request Body schema: application/x-www-form-urlencoded
InternalNotes
string

New internal notes (installer project description) to save on the proposal.

Responses
200

Success

Response Schema: application/json
id
required
integer <int32>

Unique identifier for the proposal. Use this id for subsequent API calls that reference the proposal.

createdDate
required
string <date-time>

UTC timestamp when the proposal was initially created. Returned in ISO 8601 format.

clientLastDecisionDate
string <date-time>

UTC timestamp when the client last accepted or declined the proposal. Null if no client decision has been recorded.

lastCompletedDate
string <date-time>

UTC timestamp when the proposal last reached a completed state, if applicable.

lastModifiedDate
required
string <date-time>

UTC timestamp when the proposal was last modified by any user or system process.

lastModifiedByUserDate
required
string <date-time>

UTC timestamp when the proposal was last modified by a human user (not an automated system update).

required
object (PublicFinancialSummaryModel)

Financial totals, discounts, tax, and currency values for the proposal

Array of objects (PublicChangeOrderModel)

List of change orders associated with this proposal. Each item contains details of scope changes, price adjustments, and approval state.

number
required
integer <int32>

Proposal number unique within the dealer account.

name
required
string

Display name of the proposal.

status
required
string

The current status of the resource.

Enum: "Undefined" "Draft" "Submitted" "ViewedByClient" "Accepted" "Declined" "Delayed" "Completed" "EmailFailed" "Expired"
lastSubmittedDate
string <date-time>

UTC timestamp when the proposal was last submitted to the customer.

clientLastOpenedDate
string <date-time>

UTC timestamp when the customer last opened the proposal viewer link.

object (PublicCustomerModel)

Customer contact

required
object (PublicDealerModel)

Dealer information

coverpageImageUrl
string

Absolute URL of the proposal cover image, when one is available.

aboutUs
string

The about us text for the company profile.

projectDescription
string

A description of the project.

Array of objects (PublicAreaModel)

The list of areas.

object (PublicProfitModel)

Profit summary for the proposal

object (PublicRecurringServicesModel)

Recurring service summary associated with the proposal.

object (PublicPaymentScheduleModel)

Payment schedule configuration for the proposal, including the customer-facing description and individual payment milestones.

Array of objects (PublicPaymentRequestModel)

Payment requests already issued for this proposal.

projectTerms
string

The terms and conditions for the project.

required
object (PublicUserModel)

User summary returned within proposal detail responses

401

Not Authorized. Ensure a valid session cookie or HMAC authentication headers are provided.

402

The dealer's subscription is inactive or expired. An active subscription is required to use this endpoint.

403

You do not have permission for this action.

404

No resource exists with the given ID.

post/public/proposals/{ProposalId}/internalnotes
Request samples
Response samples
application/json
{
  • "id": 0,
  • "createdDate": "2019-08-24T14:15:22Z",
  • "clientLastDecisionDate": "2019-08-24T14:15:22Z",
  • "lastCompletedDate": "2019-08-24T14:15:22Z",
  • "lastModifiedDate": "2019-08-24T14:15:22Z",
  • "lastModifiedByUserDate": "2019-08-24T14:15:22Z",
  • "financialSummary": {
    },
  • "changeOrders": [
    ],
  • "number": 0,
  • "name": "string",
  • "status": "Undefined",
  • "lastSubmittedDate": "2019-08-24T14:15:22Z",
  • "clientLastOpenedDate": "2019-08-24T14:15:22Z",
  • "customer": {
    },
  • "dealer": {
    },
  • "coverpageImageUrl": "string",
  • "aboutUs": "string",
  • "projectDescription": "string",
  • "areas": [
    ],
  • "profit": {
    },
  • "recurringServices": {
    },
  • "paymentSchedule": {
    },
  • "paymentRequests": [
    ],
  • "projectTerms": "string",
  • "lastModifiedUser": {
    }
}

Get Change Order Details

Returns detailed information for the specified change order. The HTTP response also sets the Last-Modified header from the response LastModifiedDate.

Request
path Parameters
ProposalId
required
integer <int32>

Proposal Id.

ChangeOrderId
required
integer <int32>

Change Order Id.

header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Responses
200

Success

Response Schema: application/json
id
required
integer <int32>

Unique numeric identifier of the change order.

createdDate
required
string <date-time>

UTC timestamp when the change order was created.

clientLastDecisionDate
string <date-time>

UTC timestamp when the customer last accepted or declined the change order.

lastCompletedDate
string <date-time>

UTC timestamp when the change order was completed, if it has reached a completed state.

lastModifiedDate
required
string <date-time>

UTC timestamp when the change order was last modified by either the system or a user.

lastModifiedByUserDate
required
string <date-time>

UTC timestamp when the change order was last modified by a user action.

required
object (PublicChangeOrderFinancialSummaryModel)

Financial summary for a change order

number
required
integer <int32>

Proposal number unique within the dealer account.

name
required
string

Display name of the proposal.

status
required
string

The current status of the resource.

Enum: "Undefined" "Draft" "Submitted" "ViewedByClient" "Accepted" "Declined" "Delayed" "Completed" "EmailFailed" "Expired"
lastSubmittedDate
string <date-time>

UTC timestamp when the proposal was last submitted to the customer.

clientLastOpenedDate
string <date-time>

UTC timestamp when the customer last opened the proposal viewer link.

object (PublicCustomerModel)

Customer contact

required
object (PublicDealerModel)

Dealer information

coverpageImageUrl
string

Absolute URL of the proposal cover image, when one is available.

aboutUs
string

The about us text for the company profile.

projectDescription
string

A description of the project.

Array of objects (PublicAreaModel)

The list of areas.

object (PublicProfitModel)

Profit summary for the proposal

object (PublicRecurringServicesModel)

Recurring service summary associated with the proposal.

object (PublicPaymentScheduleModel)

Payment schedule configuration for the proposal, including the customer-facing description and individual payment milestones.

Array of objects (PublicPaymentRequestModel)

Payment requests already issued for this proposal.

projectTerms
string

The terms and conditions for the project.

required
object (PublicUserModel)

User summary returned within proposal detail responses

401

Not Authorized to access this endpoint or your HMAC hash was incorrect.

403

You do not have permission for this API call.

get/public/proposals/{ProposalId}/changeorders/{ChangeOrderId}
Request samples
Response samples
application/json
{
  • "id": 0,
  • "createdDate": "2019-08-24T14:15:22Z",
  • "clientLastDecisionDate": "2019-08-24T14:15:22Z",
  • "lastCompletedDate": "2019-08-24T14:15:22Z",
  • "lastModifiedDate": "2019-08-24T14:15:22Z",
  • "lastModifiedByUserDate": "2019-08-24T14:15:22Z",
  • "financialSummary": {
    },
  • "number": 0,
  • "name": "string",
  • "status": "Undefined",
  • "lastSubmittedDate": "2019-08-24T14:15:22Z",
  • "clientLastOpenedDate": "2019-08-24T14:15:22Z",
  • "customer": {
    },
  • "dealer": {
    },
  • "coverpageImageUrl": "string",
  • "aboutUs": "string",
  • "projectDescription": "string",
  • "areas": [
    ],
  • "profit": {
    },
  • "recurringServices": {
    },
  • "paymentSchedule": {
    },
  • "paymentRequests": [
    ],
  • "projectTerms": "string",
  • "lastModifiedUser": {
    }
}

Get Change Order List for the Given Proposal

Returns the change orders for the specified proposal, including customer details, total, status, and created and modified dates.

Request
path Parameters
ProposalId
required
integer <int32>

Proposal Id.

header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Responses
200

Success

Response Schema: application/json
Array
id
required
integer <int32>

Unique numeric identifier of the change order

number
required
integer <int32>

Change-order number shown to the dealer in the UI

name
required
string

Display name of the change order

status
required
string

Current change-order status

Enum: "Undefined" "Draft" "Submitted" "ViewedByClient" "Accepted" "Declined" "Delayed" "Completed" "EmailFailed" "Expired"
object (PublicChangeOrderTotalModel)

Change-order total amount and currency

object (PublicContactModel)

Contact summary model

createdDate
required
string <date-time>

UTC timestamp when the change order was created

lastModifiedDate
required
string <date-time>

UTC timestamp when the change order was last modified by the system or a user

lastModifiedByUserDate
string <date-time>

UTC timestamp when the change order was last modified by a user action

401

Not Authorized to access this endpoint or your HMAC hash was incorrect.

402

This action requires an active subscription.

403

You do not have permission for this API call.

get/public/proposals/{ProposalId}/changeorders
Request samples
Response samples
application/json
[
  • {
    }
]

Add Proposal Area

Creates a new area (room) within a proposal. The area name must be unique within the proposal. The system automatically creates one default option in "Draft" status under the new area. The response includes the full updated proposal detail, including the new area and its default option.

Request
path Parameters
ProposalId
required
integer <int32>

Unique ID of the proposal (not the proposal number).

header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Request Body schema: application/x-www-form-urlencoded
required
Name
required
string

Name of the area to create.

Responses
200

Success

Response Schema: application/json
id
required
integer <int32>

Unique identifier for the proposal. Use this id for subsequent API calls that reference the proposal.

createdDate
required
string <date-time>

UTC timestamp when the proposal was initially created. Returned in ISO 8601 format.

clientLastDecisionDate
string <date-time>

UTC timestamp when the client last accepted or declined the proposal. Null if no client decision has been recorded.

lastCompletedDate
string <date-time>

UTC timestamp when the proposal last reached a completed state, if applicable.

lastModifiedDate
required
string <date-time>

UTC timestamp when the proposal was last modified by any user or system process.

lastModifiedByUserDate
required
string <date-time>

UTC timestamp when the proposal was last modified by a human user (not an automated system update).

required
object (PublicFinancialSummaryModel)

Financial totals, discounts, tax, and currency values for the proposal

Array of objects (PublicChangeOrderModel)

List of change orders associated with this proposal. Each item contains details of scope changes, price adjustments, and approval state.

number
required
integer <int32>

Proposal number unique within the dealer account.

name
required
string

Display name of the proposal.

status
required
string

The current status of the resource.

Enum: "Undefined" "Draft" "Submitted" "ViewedByClient" "Accepted" "Declined" "Delayed" "Completed" "EmailFailed" "Expired"
lastSubmittedDate
string <date-time>

UTC timestamp when the proposal was last submitted to the customer.

clientLastOpenedDate
string <date-time>

UTC timestamp when the customer last opened the proposal viewer link.

object (PublicCustomerModel)

Customer contact

required
object (PublicDealerModel)

Dealer information

coverpageImageUrl
string

Absolute URL of the proposal cover image, when one is available.

aboutUs
string

The about us text for the company profile.

projectDescription
string

A description of the project.

Array of objects (PublicAreaModel)

The list of areas.

object (PublicProfitModel)

Profit summary for the proposal

object (PublicRecurringServicesModel)

Recurring service summary associated with the proposal.

object (PublicPaymentScheduleModel)

Payment schedule configuration for the proposal, including the customer-facing description and individual payment milestones.

Array of objects (PublicPaymentRequestModel)

Payment requests already issued for this proposal.

projectTerms
string

The terms and conditions for the project.

required
object (PublicUserModel)

User summary returned within proposal detail responses

400

If an area with the same name already exists.

401

Not Authorized. Ensure a valid session cookie or HMAC authentication headers are provided.

402

The dealer's subscription is inactive or expired. An active subscription is required to use this endpoint.

403

You do not have permission for this action.

404

Proposal not found.

409

Proposal state prevents editing

post/public/proposals/{ProposalId}/area
Request samples
Response samples
application/json
{
  • "id": 0,
  • "createdDate": "2019-08-24T14:15:22Z",
  • "clientLastDecisionDate": "2019-08-24T14:15:22Z",
  • "lastCompletedDate": "2019-08-24T14:15:22Z",
  • "lastModifiedDate": "2019-08-24T14:15:22Z",
  • "lastModifiedByUserDate": "2019-08-24T14:15:22Z",
  • "financialSummary": {
    },
  • "changeOrders": [
    ],
  • "number": 0,
  • "name": "string",
  • "status": "Undefined",
  • "lastSubmittedDate": "2019-08-24T14:15:22Z",
  • "clientLastOpenedDate": "2019-08-24T14:15:22Z",
  • "customer": {
    },
  • "dealer": {
    },
  • "coverpageImageUrl": "string",
  • "aboutUs": "string",
  • "projectDescription": "string",
  • "areas": [
    ],
  • "profit": {
    },
  • "recurringServices": {
    },
  • "paymentSchedule": {
    },
  • "paymentRequests": [
    ],
  • "projectTerms": "string",
  • "lastModifiedUser": {
    }
}

Add Proposal Area Option

Creates a new option within an existing area. Each area supports a maximum of three options. Client description and internal installer notes are optional at creation time. The new option is created with "Draft" status. The response includes the full updated proposal detail.

Request
path Parameters
ProposalId
required
integer <int32>

Unique ID of the proposal (not the proposal number).

AreaId
required
integer <int32>

Unique ID of the area within the proposal where the option will be created. The area must exist for the given proposal.

header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Request Body schema: application/x-www-form-urlencoded
ClientDescription
string

(Optional) Client‑facing description to show to customers. Keep concise and user-focused, e.g. 'Premium Installation Package'.

InternalNotes
string

(Optional) Internal notes for installers or administrators (installer description). Not shown to clients; use for technical details, special instructions, or compatibility notes.

Responses
200

Success

Response Schema: application/json
id
required
integer <int32>

Unique identifier for the proposal. Use this id for subsequent API calls that reference the proposal.

createdDate
required
string <date-time>

UTC timestamp when the proposal was initially created. Returned in ISO 8601 format.

clientLastDecisionDate
string <date-time>

UTC timestamp when the client last accepted or declined the proposal. Null if no client decision has been recorded.

lastCompletedDate
string <date-time>

UTC timestamp when the proposal last reached a completed state, if applicable.

lastModifiedDate
required
string <date-time>

UTC timestamp when the proposal was last modified by any user or system process.

lastModifiedByUserDate
required
string <date-time>

UTC timestamp when the proposal was last modified by a human user (not an automated system update).

required
object (PublicFinancialSummaryModel)

Financial totals, discounts, tax, and currency values for the proposal

Array of objects (PublicChangeOrderModel)

List of change orders associated with this proposal. Each item contains details of scope changes, price adjustments, and approval state.

number
required
integer <int32>

Proposal number unique within the dealer account.

name
required
string

Display name of the proposal.

status
required
string

The current status of the resource.

Enum: "Undefined" "Draft" "Submitted" "ViewedByClient" "Accepted" "Declined" "Delayed" "Completed" "EmailFailed" "Expired"
lastSubmittedDate
string <date-time>

UTC timestamp when the proposal was last submitted to the customer.

clientLastOpenedDate
string <date-time>

UTC timestamp when the customer last opened the proposal viewer link.

object (PublicCustomerModel)

Customer contact

required
object (PublicDealerModel)

Dealer information

coverpageImageUrl
string

Absolute URL of the proposal cover image, when one is available.

aboutUs
string

The about us text for the company profile.

projectDescription
string

A description of the project.

Array of objects (PublicAreaModel)

The list of areas.

object (PublicProfitModel)

Profit summary for the proposal

object (PublicRecurringServicesModel)

Recurring service summary associated with the proposal.

object (PublicPaymentScheduleModel)

Payment schedule configuration for the proposal, including the customer-facing description and individual payment milestones.

Array of objects (PublicPaymentRequestModel)

Payment requests already issued for this proposal.

projectTerms
string

The terms and conditions for the project.

required
object (PublicUserModel)

User summary returned within proposal detail responses

400

Each area supports a maximum of three options.

401

Not Authorized. Ensure a valid session cookie or HMAC authentication headers are provided.

402

The dealer's subscription is inactive or expired. An active subscription is required to use this endpoint.

403

You do not have permission for this action.

404

Proposal or area not found.

409

Proposal state prevents editing

post/public/proposals/{ProposalId}/area/{AreaId}/option
Request samples
Response samples
application/json
{
  • "id": 0,
  • "createdDate": "2019-08-24T14:15:22Z",
  • "clientLastDecisionDate": "2019-08-24T14:15:22Z",
  • "lastCompletedDate": "2019-08-24T14:15:22Z",
  • "lastModifiedDate": "2019-08-24T14:15:22Z",
  • "lastModifiedByUserDate": "2019-08-24T14:15:22Z",
  • "financialSummary": {
    },
  • "changeOrders": [
    ],
  • "number": 0,
  • "name": "string",
  • "status": "Undefined",
  • "lastSubmittedDate": "2019-08-24T14:15:22Z",
  • "clientLastOpenedDate": "2019-08-24T14:15:22Z",
  • "customer": {
    },
  • "dealer": {
    },
  • "coverpageImageUrl": "string",
  • "aboutUs": "string",
  • "projectDescription": "string",
  • "areas": [
    ],
  • "profit": {
    },
  • "recurringServices": {
    },
  • "paymentSchedule": {
    },
  • "paymentRequests": [
    ],
  • "projectTerms": "string",
  • "lastModifiedUser": {
    }
}

Update Proposal Area Client Description

Updates the client-facing description of a specific option. The route includes both the proposal ID and option ID to verify that the option belongs to the specified proposal. The response includes the full updated proposal detail.

Request
path Parameters
ProposalId
required
integer <int32>

Proposal Id.

AreaOptionId
required
integer <int32>

Area Option Id.

header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Request Body schema: application/x-www-form-urlencoded
ClientDescription
string

Client-facing description for the option.

Responses
200

Success

Response Schema: application/json
id
required
integer <int32>

Unique identifier for the proposal. Use this id for subsequent API calls that reference the proposal.

createdDate
required
string <date-time>

UTC timestamp when the proposal was initially created. Returned in ISO 8601 format.

clientLastDecisionDate
string <date-time>

UTC timestamp when the client last accepted or declined the proposal. Null if no client decision has been recorded.

lastCompletedDate
string <date-time>

UTC timestamp when the proposal last reached a completed state, if applicable.

lastModifiedDate
required
string <date-time>

UTC timestamp when the proposal was last modified by any user or system process.

lastModifiedByUserDate
required
string <date-time>

UTC timestamp when the proposal was last modified by a human user (not an automated system update).

required
object (PublicFinancialSummaryModel)

Financial totals, discounts, tax, and currency values for the proposal

Array of objects (PublicChangeOrderModel)

List of change orders associated with this proposal. Each item contains details of scope changes, price adjustments, and approval state.

number
required
integer <int32>

Proposal number unique within the dealer account.

name
required
string

Display name of the proposal.

status
required
string

The current status of the resource.

Enum: "Undefined" "Draft" "Submitted" "ViewedByClient" "Accepted" "Declined" "Delayed" "Completed" "EmailFailed" "Expired"
lastSubmittedDate
string <date-time>

UTC timestamp when the proposal was last submitted to the customer.

clientLastOpenedDate
string <date-time>

UTC timestamp when the customer last opened the proposal viewer link.

object (PublicCustomerModel)

Customer contact

required
object (PublicDealerModel)

Dealer information

coverpageImageUrl
string

Absolute URL of the proposal cover image, when one is available.

aboutUs
string

The about us text for the company profile.

projectDescription
string

A description of the project.

Array of objects (PublicAreaModel)

The list of areas.

object (PublicProfitModel)

Profit summary for the proposal

object (PublicRecurringServicesModel)

Recurring service summary associated with the proposal.

object (PublicPaymentScheduleModel)

Payment schedule configuration for the proposal, including the customer-facing description and individual payment milestones.

Array of objects (PublicPaymentRequestModel)

Payment requests already issued for this proposal.

projectTerms
string

The terms and conditions for the project.

required
object (PublicUserModel)

User summary returned within proposal detail responses

401

Not Authorized. Ensure a valid session cookie or HMAC authentication headers are provided.

402

The dealer's subscription is inactive or expired. An active subscription is required to use this endpoint.

403

You do not have permission for this action.

404

Proposal or area option not found.

409

Proposal is in a state that does not allow editing.

post/public/proposals/{ProposalId}/area-options/{AreaOptionId}/clientdescription
Request samples
Response samples
application/json
{
  • "id": 0,
  • "createdDate": "2019-08-24T14:15:22Z",
  • "clientLastDecisionDate": "2019-08-24T14:15:22Z",
  • "lastCompletedDate": "2019-08-24T14:15:22Z",
  • "lastModifiedDate": "2019-08-24T14:15:22Z",
  • "lastModifiedByUserDate": "2019-08-24T14:15:22Z",
  • "financialSummary": {
    },
  • "changeOrders": [
    ],
  • "number": 0,
  • "name": "string",
  • "status": "Undefined",
  • "lastSubmittedDate": "2019-08-24T14:15:22Z",
  • "clientLastOpenedDate": "2019-08-24T14:15:22Z",
  • "customer": {
    },
  • "dealer": {
    },
  • "coverpageImageUrl": "string",
  • "aboutUs": "string",
  • "projectDescription": "string",
  • "areas": [
    ],
  • "profit": {
    },
  • "recurringServices": {
    },
  • "paymentSchedule": {
    },
  • "paymentRequests": [
    ],
  • "projectTerms": "string",
  • "lastModifiedUser": {
    }
}

Update Proposal Area Installer Notes

Updates the internal installer notes of a specific option. Like the client description endpoint, the route includes both proposal and option IDs for ownership validation. The response includes the full updated proposal detail.

Request
path Parameters
ProposalId
required
integer <int32>

Proposal Id.

AreaOptionId
required
integer <int32>

Area Option Id.

header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Request Body schema: application/x-www-form-urlencoded
InstallerNotes
string

Internal installer notes for the option.

Responses
200

Success

Response Schema: application/json
id
required
integer <int32>

Unique identifier for the proposal. Use this id for subsequent API calls that reference the proposal.

createdDate
required
string <date-time>

UTC timestamp when the proposal was initially created. Returned in ISO 8601 format.

clientLastDecisionDate
string <date-time>

UTC timestamp when the client last accepted or declined the proposal. Null if no client decision has been recorded.

lastCompletedDate
string <date-time>

UTC timestamp when the proposal last reached a completed state, if applicable.

lastModifiedDate
required
string <date-time>

UTC timestamp when the proposal was last modified by any user or system process.

lastModifiedByUserDate
required
string <date-time>

UTC timestamp when the proposal was last modified by a human user (not an automated system update).

required
object (PublicFinancialSummaryModel)

Financial totals, discounts, tax, and currency values for the proposal

Array of objects (PublicChangeOrderModel)

List of change orders associated with this proposal. Each item contains details of scope changes, price adjustments, and approval state.

number
required
integer <int32>

Proposal number unique within the dealer account.

name
required
string

Display name of the proposal.

status
required
string

The current status of the resource.

Enum: "Undefined" "Draft" "Submitted" "ViewedByClient" "Accepted" "Declined" "Delayed" "Completed" "EmailFailed" "Expired"
lastSubmittedDate
string <date-time>

UTC timestamp when the proposal was last submitted to the customer.

clientLastOpenedDate
string <date-time>

UTC timestamp when the customer last opened the proposal viewer link.

object (PublicCustomerModel)

Customer contact

required
object (PublicDealerModel)

Dealer information

coverpageImageUrl
string

Absolute URL of the proposal cover image, when one is available.

aboutUs
string

The about us text for the company profile.

projectDescription
string

A description of the project.

Array of objects (PublicAreaModel)

The list of areas.

object (PublicProfitModel)

Profit summary for the proposal

object (PublicRecurringServicesModel)

Recurring service summary associated with the proposal.

object (PublicPaymentScheduleModel)

Payment schedule configuration for the proposal, including the customer-facing description and individual payment milestones.

Array of objects (PublicPaymentRequestModel)

Payment requests already issued for this proposal.

projectTerms
string

The terms and conditions for the project.

required
object (PublicUserModel)

User summary returned within proposal detail responses

401

Not Authorized. Ensure a valid session cookie or HMAC authentication headers are provided.

402

The dealer's subscription is inactive or expired. An active subscription is required to use this endpoint.

403

You do not have permission for this action.

404

Proposal or area option not found.

409

Proposal is in a state that does not allow editing.

post/public/proposals/{ProposalId}/area-options/{AreaOptionId}/installernotes
Request samples
Response samples
application/json
{
  • "id": 0,
  • "createdDate": "2019-08-24T14:15:22Z",
  • "clientLastDecisionDate": "2019-08-24T14:15:22Z",
  • "lastCompletedDate": "2019-08-24T14:15:22Z",
  • "lastModifiedDate": "2019-08-24T14:15:22Z",
  • "lastModifiedByUserDate": "2019-08-24T14:15:22Z",
  • "financialSummary": {
    },
  • "changeOrders": [
    ],
  • "number": 0,
  • "name": "string",
  • "status": "Undefined",
  • "lastSubmittedDate": "2019-08-24T14:15:22Z",
  • "clientLastOpenedDate": "2019-08-24T14:15:22Z",
  • "customer": {
    },
  • "dealer": {
    },
  • "coverpageImageUrl": "string",
  • "aboutUs": "string",
  • "projectDescription": "string",
  • "areas": [
    ],
  • "profit": {
    },
  • "recurringServices": {
    },
  • "paymentSchedule": {
    },
  • "paymentRequests": [
    ],
  • "projectTerms": "string",
  • "lastModifiedUser": {
    }
}

Assign Contact to Proposal

Assigns an existing contact (person/client) to a proposal. The proposal and contact must belong to the same account. If the contact has a single primary location, that location is automatically assigned to the proposal as well. Assigning a contact may trigger tax recalculations based on the contact's location.

Request
path Parameters
ProposalId
required
integer <int32>

Proposal Id.

ContactId
required
integer <int32>

Contact Id.

header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Request Body schema: application/json
proposalId
required
integer <int32>

Proposal Id.

contactId
required
integer <int32>

Contact Id.

Responses
204

No Content

401

Not Authorized. Ensure a valid session cookie or HMAC authentication headers are provided.

402

The dealer's subscription is inactive or expired. An active subscription is required to use this endpoint.

403

You do not have permission for this action.

404

Proposal or contact not found.

post/public/proposals/{ProposalId}/contact/{ContactId}
Request samples
Response samples
application/json
{
  • "errorCode": "string",
  • "stackTrace": "string",
  • "contentType": "string",
  • "headers": {
    },
  • "cookies": [
    ],
  • "status": 0,
  • "statusCode": "string",
  • "statusDescription": "string",
  • "response": { },
  • "responseFilter": { },
  • "requestContext": { },
  • "paddingLength": 0,
  • "resultScope": { },
  • "options": {
    },
  • "responseStatus": {
    },
  • "targetSite": { },
  • "message": "string",
  • "data": { },
  • "innerException": { },
  • "helpLink": "string",
  • "source": "string",
  • "hResult": 0
}

Assign Proposal Location

Assigns a location to a proposal that already has a contact assigned. The location must belong to the proposal's assigned contact and to the same account. Assigning a location triggers tax recalculations for the proposal. The response includes the full updated proposal detail.

Request
path Parameters
ProposalId
required
integer <int32>

ID of the proposal to update. Must belong to the current account.

LocationId
required
integer <int32>

ID of the location to assign to the proposal’s existing person. Must belong to the current account.

header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Request Body schema: application/json
proposalId
required
integer <int32>

ID of the proposal to update. Must belong to the current account.

locationId
required
integer <int32>

ID of the location to assign to the proposal’s existing person. Must belong to the current account.

Responses
200

Success

Response Schema: application/json
id
required
integer <int32>

Unique identifier for the proposal. Use this id for subsequent API calls that reference the proposal.

createdDate
required
string <date-time>

UTC timestamp when the proposal was initially created. Returned in ISO 8601 format.

clientLastDecisionDate
string <date-time>

UTC timestamp when the client last accepted or declined the proposal. Null if no client decision has been recorded.

lastCompletedDate
string <date-time>

UTC timestamp when the proposal last reached a completed state, if applicable.

lastModifiedDate
required
string <date-time>

UTC timestamp when the proposal was last modified by any user or system process.

lastModifiedByUserDate
required
string <date-time>

UTC timestamp when the proposal was last modified by a human user (not an automated system update).

required
object (PublicFinancialSummaryModel)

Financial totals, discounts, tax, and currency values for the proposal

Array of objects (PublicChangeOrderModel)

List of change orders associated with this proposal. Each item contains details of scope changes, price adjustments, and approval state.

number
required
integer <int32>

Proposal number unique within the dealer account.

name
required
string

Display name of the proposal.

status
required
string

The current status of the resource.

Enum: "Undefined" "Draft" "Submitted" "ViewedByClient" "Accepted" "Declined" "Delayed" "Completed" "EmailFailed" "Expired"
lastSubmittedDate
string <date-time>

UTC timestamp when the proposal was last submitted to the customer.

clientLastOpenedDate
string <date-time>

UTC timestamp when the customer last opened the proposal viewer link.

object (PublicCustomerModel)

Customer contact

required
object (PublicDealerModel)

Dealer information

coverpageImageUrl
string

Absolute URL of the proposal cover image, when one is available.

aboutUs
string

The about us text for the company profile.

projectDescription
string

A description of the project.

Array of objects (PublicAreaModel)

The list of areas.

object (PublicProfitModel)

Profit summary for the proposal

object (PublicRecurringServicesModel)

Recurring service summary associated with the proposal.

object (PublicPaymentScheduleModel)

Payment schedule configuration for the proposal, including the customer-facing description and individual payment milestones.

Array of objects (PublicPaymentRequestModel)

Payment requests already issued for this proposal.

projectTerms
string

The terms and conditions for the project.

required
object (PublicUserModel)

User summary returned within proposal detail responses

401

Not Authorized. Ensure a valid session cookie or HMAC authentication headers are provided.

402

The dealer's subscription is inactive or expired. An active subscription is required to use this endpoint.

403

You do not have permission for this action.

404

Proposal or location not found.

409

The proposal has no person assigned, so a location cannot be set.

post/public/proposals/{ProposalId}/location/{LocationId}
Request samples
Response samples
application/json
{
  • "id": 0,
  • "createdDate": "2019-08-24T14:15:22Z",
  • "clientLastDecisionDate": "2019-08-24T14:15:22Z",
  • "lastCompletedDate": "2019-08-24T14:15:22Z",
  • "lastModifiedDate": "2019-08-24T14:15:22Z",
  • "lastModifiedByUserDate": "2019-08-24T14:15:22Z",
  • "financialSummary": {
    },
  • "changeOrders": [
    ],
  • "number": 0,
  • "name": "string",
  • "status": "Undefined",
  • "lastSubmittedDate": "2019-08-24T14:15:22Z",
  • "clientLastOpenedDate": "2019-08-24T14:15:22Z",
  • "customer": {
    },
  • "dealer": {
    },
  • "coverpageImageUrl": "string",
  • "aboutUs": "string",
  • "projectDescription": "string",
  • "areas": [
    ],
  • "profit": {
    },
  • "recurringServices": {
    },
  • "paymentSchedule": {
    },
  • "paymentRequests": [
    ],
  • "projectTerms": "string",
  • "lastModifiedUser": {
    }
}

Proposal AI Builder

Get AI Builder Content List

Returns all AI Builder content items (text, audio, video uploads) attached to a proposal, including their processing status and metadata. Use this to check which content has been uploaded and whether transcription is complete before generating an outline.

Request
path Parameters
ProposalId
required
integer <int32>

Unique identifier of the proposal whose AI Builder content items should be retrieved. Must be a proposal owned by the authenticated account.

header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Responses
200

Success

Response Schema: application/json
required
Array of objects (PublicAiProposalContentItemModel)

List of AI Builder content items attached to the proposal, ordered by CreatedDate ascending. Empty if no content has been uploaded.

401

Not Authorized to access this endpoint or your HMAC hash was incorrect.

403

You do not have permission for this API call.

get/public/api/proposals/{ProposalId}/ai/content
Request samples
Response samples
application/json
{
  • "items": [
    ]
}

Upload AI Builder Content

Uploads one or more files as AI source content for the specified proposal. At least one file must be included. When IsMultiChunkUpload is true, the upload is processed as a multi-chunk upload; otherwise uploaded files are processed as regular file uploads.

Request
path Parameters
ProposalId
required
integer <int32>

Numeric identifier of the proposal to which the AI-generated content will be attached. Must be a positive integer. The proposal typically must be in Draft status to accept new content.

header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Request Body schema: application/x-www-form-urlencoded
required
Name
required
string

Human-readable name or title for the content being uploaded. This value is used for display and search. Provide a concise descriptive name.

IsMultiChunkUpload
boolean

Optional flag indicating whether the client will upload the content in multiple chunks (true) or as a single request (false or omitted). When true the server will expect chunked upload semantics and assemble the final file.

Responses
200

Success

Response Schema: application/json
id
required
integer <int32>

Unique identifier assigned to the created AI content item. Use this id for subsequent operations (update, delete, fetch).

name
required
string

Human-readable name/title of the created content item. Matches the 'Name' value provided in the request.

summary
string

Optional short summary or snippet of the content generated by the AI. Useful for preview and search.

status
required
string

Lifecycle status of the content item (e.g. Draft, Published, Archived). Use allowable values from SpecContentStatuses.

Enum: "Uploaded" "Processing" "Transcribed" "Invalid"
sourceType
required
string

Type of the source file for the content (e.g. Text, Audio, Video). Use allowable values from SourceFileTypes.

Enum: "Text" "Audio" "Video"
createdDate
required
string <date-time>

Timestamp (UTC) when the content item was created. ISO 8601 format.

required
object (SimpleUserModel)

SimpleUserModel

400

Validation failure (missing content name, invalid content type, file too large).

401

Not Authorized to access this endpoint or your HMAC hash was incorrect.

403

You do not have permission for this API call.

404

Proposal not found.

409

Proposal is in a state that does not allow editing.

post/public/api/proposals/{ProposalId}/ai/content
Request samples
Response samples
application/json
{
  • "id": 0,
  • "name": "string",
  • "summary": "string",
  • "status": "Uploaded",
  • "sourceType": "Text",
  • "createdDate": "2019-08-24T14:15:22Z",
  • "userCreated": {
    }
}

Delete AI Builder Content

Delete an AI-generated content item from a proposal

Request
path Parameters
ProposalId
required
integer <int32>

Unique identifier of the proposal that owns the AI-generated content. Must be a positive integer. The proposal will typically need to be in Draft status to allow content deletions.

ContentId
required
integer <int32>

Unique identifier of the AI-generated content item to delete. Must belong to the specified ProposalId. Attempting to delete a content item that does not exist or belongs to another proposal will return NotFound.

header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Responses
200

Success

Response Schema: application/json
id
required
integer <int32>

Unique identifier of the AI-generated content item that was requested to be deleted. Matches the ContentId provided in the request when deletion succeeds.

deleted
required
boolean

Flag indicating whether the specified content item was deleted (true) or if no deletion occurred (false). Expected to be set to the true value when the call returns 200 OK.

401

Not Authorized to access this endpoint or your HMAC hash was incorrect.

403

You do not have permission for this API call.

409

Proposal must be in draft status to edit.

delete/public/api/proposals/{ProposalId}/ai/content/{ContentId}
Request samples
Response samples
application/json
{
  • "id": 0,
  • "deleted": true
}

Get Proposal Outline

Returns the latest requested AI outline for the specified proposal. The status is Completed when outline content is available and Generating while the outline is still being prepared. The Outline field is returned only when the status is Completed.

Request
path Parameters
ProposalId
required
integer <int32>

Unique identifier of the proposal to retrieve the AI-generated outline for.

header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Responses
200

Success

Response Schema: application/json
proposalId
required
integer <int32>

Unique identifier of the proposal for which the outline is returned.

status
required
string

Current AI generation status for the proposal outline.

  • Generating: The outline generation is in progress and the 'Outline' field will be null.
  • Completed: The outline has been generated successfully and is available in the 'Outline' field.
  • Failed: Generation failed and the 'Outline' field will be null. Check logs or retries for details.
Enum: "Generating" "Completed" "Failed"
outline
string

The AI-generated proposal outline text. This field is populated only when 'Status' is 'Completed'. When 'Status' is 'Generating' or 'Failed', this value will be null. The outline contains a structured summary of the proposal suitable for display or further processing by downstream agents.

401

Not Authorized to access this endpoint or your HMAC hash was incorrect.

403

You do not have permission for this API call.

404

Proposal or outline not found.

get/public/api/proposals/{ProposalId}/ai/outline
Request samples
Response samples
application/json
{
  • "proposalId": 0,
  • "status": "Generating",
  • "outline": "string"
}

Build Proposal

Trigger asynchronous AI proposal build from an approved outline.

Request
path Parameters
ProposalId
required
integer <int32>

Unique identifier corresponding to an existing proposal that has a completed AI outline; otherwise the request will be rejected with a 400 Bad Request.

header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Request Body schema: application/json
proposalId
required
integer <int32>

Unique identifier corresponding to an existing proposal that has a completed AI outline; otherwise the request will be rejected with a 400 Bad Request.

Responses
200

Success

Response Schema: application/json
proposalId
required
integer <int32>

Unique identifier corresponding to the proposal for which the build was triggered.

status
required
string

Current status of the proposal build job. Consumers should listen to webhooks to be notified when the status becomes Completed.

400

Bad Request: no completed AI outline exists for this proposal.

401

Not Authorized to access this endpoint or your HMAC hash was incorrect.

403

You do not have permission for this API call.

404

Proposal not found.

post/public/proposals/{ProposalId}/ai/build
Request samples
Response samples
application/json
{
  • "proposalId": 0,
  • "status": "string"
}

Generate Proposal Outline

Start asynchronous AI outline generation for a proposal.

Request
path Parameters
ProposalId
required
integer <int32>

Proposal identifier. Must be a positive integer corresponding to an existing proposal. The proposal should contain transcribed project spec content or media transcripts; otherwise the request will be rejected with a 400 Bad Request.

header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Request Body schema: application/json
proposalId
required
integer <int32>

Proposal identifier. Must be a positive integer corresponding to an existing proposal. The proposal should contain transcribed project spec content or media transcripts; otherwise the request will be rejected with a 400 Bad Request.

Responses
200

Success

Response Schema: application/json
proposalId
required
integer <int32>

ID of the proposal for which outline generation was triggered. Use this value to correlate asynchronous job progress and final outline results.

status
required
string

Current status of the outline generation job. Consumers should poll or listen to webhooks to get final completed output when status becomes Completed.

400

Bad Request: the specified proposal does not contain the transcribed media or project specification content required for AI outline generation.

401

Not Authorized to access this endpoint or your HMAC hash was incorrect.

403

You do not have permission for this API call.

404

Proposal not found.

post/public/proposals/{ProposalId}/ai/outline
Request samples
Response samples
application/json
{
  • "proposalId": 0,
  • "status": "string"
}

People

The People service allows you to manage a dealer's contacts, which are used in proposals.

Search & Get Contact List

Returns a paged list of contacts for the current account. Supports search, contact type filtering, sorting, and pagination. Pagination defaults to PageNumber 1 and PageSize 10 when values are missing or less than or equal to 0.

Request
query Parameters
SearchText
string

Search text

ContactTypes
Array of strings

Contact Types.

Items Enum: "Person" "Company"
SortBy
string
Enum: "ModifiedDate" "CreatedDate" "FirstName" "LastName" "LastActive" "LastActiveByMe"
SortDirection
string
PageNumber
integer <int32>

Page number. Starting from 1

PageSize
integer <int32>

Page Size

header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Responses
200

Success

Response Schema: application/json
required
Array of objects (PublicContactModel)

Contacts returned for the current page

peopleCount
required
integer <int32>

Total number of contacts matching the current filter set

401

Not Authorized to access this endpoint or your HMAC hash was incorrect.

402

This action requires an active subscription.

403

You do not have permission for this API call.

get/public/people
Request samples
Response samples
application/json
{
  • "people": [
    ],
  • "peopleCount": 0
}

Create a New Contact

Creates a contact in the current account. PartyType, ContactType, and FirstName are required. CompanyName is also required when PartyType is Company.

Request
header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Request Body schema: application/x-www-form-urlencoded
required
PartyType
required
string
ContactType
required
string
FirstName
required
string

First Name (Maximum character length is 100)

LastName
string

Last Name (Maximum character length is 50)

CompanyName
string

Company Name (Maximum character length is 100)

ContactEmail
string

Email (Maximum character length is 256)

ContactEmailCC
string

Additioanl email(s) copied when a proposal is submitted

ContactPhone
string

Contact Phone (Maximum character length is 30)

Notes
string
Responses
200

Success

Response Schema: application/json
notes
string

Free-text notes stored on the contact

lastModifiedDate
required
string <date-time>

UTC timestamp when the contact was last modified

object (PublicContactLocationModel)

Contact-location detail model

object (PublicContactLocationModel)

Contact-location detail model

proposalCount
integer <int32>

Number of proposals linked to the contact when counts are requested

paymentCount
integer <int32>

Number of payments linked to the contact when counts are requested

id
required
integer <int32>

Unique numeric identifier of the contact

partyType
required
string

Contact party type such as Person or Company

Enum: "Undefined" "Person" "Company"
contactType
required
string

Contact category type

Enum: "Undefined" "Client" "Employee" "Contractor" "Other"
firstName
string

Contact first name

lastName
string

Contact last name

companyName
string

Company name when the contact represents a company

contactEmail
string

Primary contact email address

contactEmailCC
string

Additional email addresses copied when a proposal is submitted

contactPhone
string

Primary contact phone number

401

Not Authorized to access this endpoint or your HMAC hash was incorrect.

402

This action requires an active subscription.

403

You do not have permission for this API call.

post/public/people
Request samples
Response samples
application/json
{
  • "notes": "string",
  • "lastModifiedDate": "2019-08-24T14:15:22Z",
  • "primaryLocation": {
    },
  • "billingLocation": {
    },
  • "proposalCount": 0,
  • "paymentCount": 0,
  • "id": 0,
  • "partyType": "Undefined",
  • "contactType": "Undefined",
  • "firstName": "string",
  • "lastName": "string",
  • "companyName": "string",
  • "contactEmail": "string",
  • "contactEmailCC": "string",
  • "contactPhone": "string"
}

Get Contact Details

Returns the contact details for the specified person. PrimaryLocation and BillingLocation are included when available. When IncludeCounts is true, the response also includes proposal and payment counts for the contact.

Request
path Parameters
PersonId
required
integer <int32>

Person Id.

query Parameters
IncludeCounts
boolean
header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Responses
200

Success

Response Schema: application/json
notes
string

Free-text notes stored on the contact

lastModifiedDate
required
string <date-time>

UTC timestamp when the contact was last modified

object (PublicContactLocationModel)

Contact-location detail model

object (PublicContactLocationModel)

Contact-location detail model

proposalCount
integer <int32>

Number of proposals linked to the contact when counts are requested

paymentCount
integer <int32>

Number of payments linked to the contact when counts are requested

id
required
integer <int32>

Unique numeric identifier of the contact

partyType
required
string

Contact party type such as Person or Company

Enum: "Undefined" "Person" "Company"
contactType
required
string

Contact category type

Enum: "Undefined" "Client" "Employee" "Contractor" "Other"
firstName
string

Contact first name

lastName
string

Contact last name

companyName
string

Company name when the contact represents a company

contactEmail
string

Primary contact email address

contactEmailCC
string

Additional email addresses copied when a proposal is submitted

contactPhone
string

Primary contact phone number

400

Person not found.

401

Not Authorized to access this endpoint or your HMAC hash was incorrect.

403

You do not have permission for this API call.

get/public/people/{PersonId}
Request samples
Response samples
application/json
{
  • "notes": "string",
  • "lastModifiedDate": "2019-08-24T14:15:22Z",
  • "primaryLocation": {
    },
  • "billingLocation": {
    },
  • "proposalCount": 0,
  • "paymentCount": 0,
  • "id": 0,
  • "partyType": "Undefined",
  • "contactType": "Undefined",
  • "firstName": "string",
  • "lastName": "string",
  • "companyName": "string",
  • "contactEmail": "string",
  • "contactEmailCC": "string",
  • "contactPhone": "string"
}

Get Contact Location List

Returns the contact's locations. Results are ordered with the primary location first, then the billing location, then the most recently modified locations. Pagination defaults to PageNumber 1 and PageSize 10. When PageNumber is less than or equal to 0, all matching locations are returned.

Request
path Parameters
ContactId
required
integer <int32>
query Parameters
PageNumber
integer <int32>
PageSize
integer <int32>
header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Responses
200

Success

Response Schema: application/json
Array of objects (PublicContactLocationModel)

Locations returned for the requested contact

locationCount
required
integer <int32>

Total number of locations matching the current request

401

Not Authorized to access this endpoint or your HMAC hash was incorrect.

403

You do not have permission for this API call.

get/public/people/{ContactId}/location
Request samples
Response samples
application/json
{
  • "contactLocations": [
    ],
  • "locationCount": 0
}

Create New Contact Location

Adds a location to the specified contact. Street is required. When Country is provided, State is also required. Use IsPrimary to make the new location the primary location and IsBilling to make it the billing location.

Request
path Parameters
ContactId
required
integer <int32>
header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Request Body schema: application/x-www-form-urlencoded
ContactFirstName
string

Contact First Name (Maximum character length is 50)

ContactLastName
string

Contact Last Name (Maximum character length is 50)

ContactPhoneNumber
string

Contact Phone Number (Maximum character length is 50)

ContactEmail
string

Contact Email (Maximum character length is 100)

Street
required
string

Street (Maximum character length is 100)

Suite
string

Suite (Maximum character length is 100)

City
string

City (Maximum character length is 50)

PostalCode
string

Postal Code (Maximum character length is 20)

State
string

State (Maximum character length is 256)

Country
string

Country (Maximum character length is 256)

IsPrimary
boolean
IsBilling
boolean
Responses
200

Success

Response Schema: application/json
contactFirstName
string

Location contact first name

contactLastName
string

Location contact last name

contactPhoneNumber
string

Location contact phone number

contactEmail
string

Location contact email address

isPrimary
required
boolean

Whether this location is the primary location for the contact

isBilling
required
boolean

Whether this location is the billing location for the contact

id
integer <int32>

Unique numeric identifier of the location, when available.

street
string

Primary street address line.

suite
string

Secondary address line, apartment, or suite.

city
string

City or locality.

postalCode
string

Postal or ZIP code.

state
string

State, province, or region name.

stateAbbrev
string

State or province abbreviation when available.

country
string

Country name.

phone
string

Location phone number when one is associated with this address.

401

Not Authorized to access this endpoint or your HMAC hash was incorrect.

402

This action requires an active subscription.

403

You do not have permission for this API call.

404

This person does not exists.

post/public/people/{ContactId}/location
Request samples
Response samples
application/json
{
  • "contactFirstName": "string",
  • "contactLastName": "string",
  • "contactPhoneNumber": "string",
  • "contactEmail": "string",
  • "isPrimary": true,
  • "isBilling": true,
  • "id": 0,
  • "street": "string",
  • "suite": "string",
  • "city": "string",
  • "postalCode": "string",
  • "state": "string",
  • "stateAbbrev": "string",
  • "country": "string",
  • "phone": "string"
}

Catalog

**These endpoints require separate authorization**

The Catalog service provides access to all items in the Portal catalog, including information about their MSRP, cost, sell prices and suppliers.

Search & Get Catalog Items

Searches the catalog using the provided category, brand, supplier, industry, stock, favorite, price, and item type filters. CategoryId and CategoryIds are mutually exclusive, and ParentCategoryId and ParentCategoryIds are mutually exclusive. If SearchText is omitted it is treated as an empty string. ItemType defaults to Part.

Request
query Parameters
SearchText
string
ParentCategoryId
integer <int32>
ParentCategoryIds
Array of integers <int32>
CategoryId
integer <int32>
CategoryIds
Array of integers <int32>
Brands
Array of strings
Suppliers
Array of strings
Industries
Array of integers <int32>
IsInStock
boolean
IsFavorite
boolean
IsAuthorized
boolean
IsDiscontinued
boolean
IsIndustrialFavorite
boolean
MinMsrp
number <double>

Filter for products with an MSRP (of the users current country currency. If it doesn't exist then USD MSRP is used.) greater than this amount.

MaxMsrp
number <double>

Filter for products with an MSRP (of the users current country currency. If it doesn't exist then USD MSRP is used.) less than this amount.

PageNumber
integer <int32>
PageSize
integer <int32>

Limit the number of results

IncludeImageUrl
boolean
ItemType
string
header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Responses
200

Success

Response Schema: application/json
Array of objects (PublicBrowsePartModel)

Catalog part items matching the search criteria

Array of objects (PublicBrowsePartModel)

Favorite catalog part items matching the search criteria

Array of objects (PublicFacetModel)

Category facet values with result counts

Array of objects (PublicFacetModel)

Brand facet values with result counts

Array of objects (PublicFacetModel)

Supplier facet values with result counts

totalItemCount
required
integer <int32>

Total number of matching results across all pages

processingTimeMS
required
integer <int32>

Search processing time in milliseconds

favoriteItemCount
required
integer <int32>

Total number of favorite items matching the search criteria

Array of objects (LibraryModel)

Labor library items matching the search criteria

Array of objects (PublicLibraryModel)

Custom library items matching the search criteria

401

Not Authorized to access this endpoint or your HMAC hash was incorrect.

402

This action requires an active subscription.

403

You do not have permission for this API call.

500

Internal error.

get/public/catalog
Request samples
Response samples
application/json
{
  • "items": [
    ],
  • "favoriteItems": [
    ],
  • "categoryFacets": [
    ],
  • "brandFacets": [
    ],
  • "supplierFacets": [
    ],
  • "totalItemCount": 0,
  • "processingTimeMS": 0,
  • "favoriteItemCount": 0,
  • "labors": [
    ],
  • "customItems": [
    ]
}

Category List

Returns the catalog category hierarchy grouped by industry, including category image URLs when available.

Request
header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Responses
200

A catalog response

Response Schema: application/json
Array
id
required
integer <int32>

Unique numeric identifier of the industry

name
required
string

Industry display name

Array of objects (PublicCategoryItemResponse)

Categories returned for the industry

401

Not Authorized to access this endpoint or your HMAC hash was incorrect.

402

This action requires an active subscription.

403

You do not have permission for this API call.

500

Internal error.

get/public/catalog/categories
Request samples
Response samples
application/json
[
  • {
    }
]

Get Catalog Item Details

Returns details for the requested catalog item. When ItemType is Labor or CustomItem, the item is returned from the current account's library; otherwise a standard catalog item is returned. ExtendedDetails adds extra information to standard catalog item responses.

Request
path Parameters
ItemId
required
integer <int32>

Item Id

query Parameters
ExtendedDetails
boolean

Provides additional details like full description, specs, linked resources

ItemType
string
header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Responses
200

Success

Response Schema: application/json
description
string

Long description of the catalog item

productUrl
string

Portal product page URL when available

manufacturerProductUrl
string

Manufacturer product page URL when available

additionalImageUrls
Array of strings

Additional image URLs for the catalog item

Array of objects (LinkResource)

Linked PDF resources for the catalog item

Array of objects (LinkResource)

Linked video resources for the catalog item

Array of objects (PublicSpecDetailsModel)

Specification name/value pairs for the catalog item

Array of objects (PublicSupplierInfoModel)

Supplier-specific entries available for this catalog item

id
required
integer <int32>

Unique part identifier.

brand
string

Brand or manufacturer name.

model
string

Model number.

shortDescription
string

Short description shown in search results.

primaryImageUrl
string

Primary image URL for the catalog item.

parentCategoryId
required
integer <int32>

Parent category identifier.

categoryId
required
integer <int32>

Leaf category identifier.

categories
required
Array of strings

Category breadcrumb or category labels associated with the item.

isFavorite
required
boolean

Whether the item is marked as a favorite for the authenticated account.

isDiscontinued
required
boolean

Whether the item is discontinued.

object (PublicMsrpModel)

MSRP information returned for a catalog item.

object (PublicSupplierPriceModel)

Supplier-specific cost information for a catalog item.

object (PublicSellPriceModel)

Sell-price information returned for a catalog item.

rank
integer <int32>

Item rank within the search result ordering.

204

The requested item doesn't exist

401

Not Authorized to access this endpoint or your HMAC hash was incorrect.

402

This action requires an active subscription.

403

You do not have permission for this API call.

get/public/catalog/{ItemId}
Request samples
Response samples
application/json
{
  • "description": "string",
  • "productUrl": "string",
  • "manufacturerProductUrl": "string",
  • "additionalImageUrls": [
    ],
  • "pdfResourceLinks": [
    ],
  • "videoResourceLinks": [
    ],
  • "specs": [
    ],
  • "suppliers": [
    ],
  • "id": 0,
  • "brand": "string",
  • "model": "string",
  • "shortDescription": "string",
  • "primaryImageUrl": "string",
  • "parentCategoryId": 0,
  • "categoryId": 0,
  • "categories": [
    ],
  • "isFavorite": true,
  • "isDiscontinued": true,
  • "msrp": {
    },
  • "defaultCost": {
    },
  • "sellPrice": {
    },
  • "rank": 0
}

Users

The Users service returns the users that belong to the authenticated dealer account.

Use these endpoints to discover the users who can be referenced by other public workflows.

Get User List

Returns a list of all active users within the authenticated caller's account. The response includes basic, non-sensitive user details: user ID, first name, last name, email address, and the user's permission group. This is a read-only endpoint intended for integrations that need to look up user IDs before assigning them as salespersons on proposals or for syncing user data with external systems.

Request
header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Responses
200

Success

Response Schema: application/json
required
Array of objects (PublicUserModel)

Users returned for the authenticated account

usersCount
required
integer <int32>

Total number of users returned in the list

401

Not Authorized. Ensure a valid session cookie or HMAC authentication headers are provided.

403

You do not have permission for this action.

404

No resource exists with the given ID.

get/public/users
Request samples
Response samples
application/json
{
  • "users": [
    ],
  • "usersCount": 0
}

Zapier Triggers

Zapier triggers on the following events in Portal

  1. Proposal Status Change
  2. Person modification
  3. Order Status Change
  4. Payment Status Change

Zapier Trigger on Person Modification

Provides the sample response shape for the Zapier contact trigger. Use this trigger when you want Zapier to receive contact updates, including contact changes and related contact details.

Request
header Parameters
Accept
required
string

Accept Header

Value: "application/json"
Responses
200

Person Item.

Response Schema: application/json
object (PublicLocationModel)

Location and address details.

id
required
integer <int32>

Unique numeric identifier of the contact

partyType
required
string

Contact party type such as Person or Company

Enum: "Undefined" "Person" "Company"
contactType
required
string

Contact category type

Enum: "Undefined" "Client" "Employee" "Contractor" "Other"
firstName
string

Contact first name

lastName
string

Contact last name

companyName
string

Company name when the contact represents a company

contactEmail
string

Primary contact email address

contactEmailCC
string

Additional email addresses copied when a proposal is submitted

contactPhone
string

Primary contact phone number

401

Authentication failed. Verify the HMAC headers and credentials used for the request.

get/zapier/trigger/person
Request samples
Response samples
application/json
{
  • "location": {
    },
  • "id": 0,
  • "partyType": "Undefined",
  • "contactType": "Undefined",
  • "firstName": "string",
  • "lastName": "string",
  • "companyName": "string",
  • "contactEmail": "string",
  • "contactEmailCC": "string",
  • "contactPhone": "string"
}

Zapier Trigger for Payment Status Change

Provides the sample response shape for the Zapier payment trigger. Use this trigger when you want Zapier to receive payment updates, including payment status changes and related payment details.

Request
header Parameters
Accept
required
string

Accept Header

Value: "application/json"
Responses
200

Payment Item.

Response Schema: application/json
id
integer <int32>
description
string
status
string
amount
number <double>
createdDate
string <date-time>
modifiedDate
string <date-time>
dueDate
string <date-time>
initiatedPaymentDate
string <date-time>
paidDate
string <date-time>
clientFirstName
string
clientLastName
string
clientName
string
personId
integer <int32>
proposalId
integer <int32>
proposalNumber
integer <int32>
number
integer <int32>
paidVia
string
isEstExpired
boolean
paymentProcessorType
string
proposalPaymentScheduleItemId
integer <int32>
401

Authentication failed. Verify the HMAC headers and credentials used for the request.

get/zapier/trigger/payment
Request samples
Response samples
application/json
{
  • "id": 0,
  • "description": "string",
  • "status": "string",
  • "amount": 0,
  • "createdDate": "2019-08-24T14:15:22Z",
  • "modifiedDate": "2019-08-24T14:15:22Z",
  • "dueDate": "2019-08-24T14:15:22Z",
  • "initiatedPaymentDate": "2019-08-24T14:15:22Z",
  • "paidDate": "2019-08-24T14:15:22Z",
  • "clientFirstName": "string",
  • "clientLastName": "string",
  • "clientName": "string",
  • "personId": 0,
  • "proposalId": 0,
  • "proposalNumber": 0,
  • "number": 0,
  • "paidVia": "string",
  • "isEstExpired": true,
  • "paymentProcessorType": "string",
  • "proposalPaymentScheduleItemId": 0
}

Zapier Trigger for Proposal Status Change

Provides the sample response shape for the Zapier proposal trigger. Use this trigger when you want Zapier to receive proposal updates, including proposal status changes and related proposal details.

Request
header Parameters
Accept
required
string

Accept Header

Value: "application/json"
Responses
200

Proposal List.

Response Schema: application/json
number
integer <int32>
status
string
total
number <double>
object (PublicCustomerModel)

Customer contact

proposalPdf
string
proposalCsv
string
installerPdf
string
salesPerson
string
salesPersonEmail
string
Array of objects (PublicAreaModel)
required
object (PublicFinancialSummaryModel)

Financial totals, discounts, tax, and currency values for the proposal

object (PublicProfitModel)

Profit summary for the proposal

object (PublicRecurringServicesModel)

Recurring service summary associated with the proposal.

Array of objects (PublicChangeOrderModel)
id
required
integer <int32>
name
string
401

Authentication failed. Verify the HMAC headers and credentials used for the request.

get/zapier/trigger/proposal
Request samples
Response samples
application/json
{
  • "number": 0,
  • "status": "string",
  • "total": 0,
  • "customer": {
    },
  • "proposalPdf": "string",
  • "proposalCsv": "string",
  • "installerPdf": "string",
  • "salesPerson": "string",
  • "salesPersonEmail": "string",
  • "areas": [
    ],
  • "financialSummary": {
    },
  • "profit": {
    },
  • "recurringServices": {
    },
  • "changeOrders": [
    ],
  • "id": 0,
  • "name": "string"
}

Zapier Trigger for Order Status Change

Provides the sample response shape for the Zapier order trigger. Use this trigger when you want Zapier to receive order updates, including order status changes and related order details.

Request
header Parameters
Accept
required
string

Accept Header

Value: "application/json"
Responses
200

Order Item

Response Schema: application/json
number
integer <int32>
createdDate
string <date-time>
modifiedDate
string <date-time>
status
string
total
number <double>
partCount
number <double>
Array of objects (ZapierOrderSupplierItem)
id
required
integer <int32>
name
string
401

Authentication failed. Verify the HMAC headers and credentials used for the request.

get/zapier/trigger/order
Request samples
Response samples
application/json
{
  • "number": 0,
  • "createdDate": "2019-08-24T14:15:22Z",
  • "modifiedDate": "2019-08-24T14:15:22Z",
  • "status": "string",
  • "total": 0,
  • "partCount": 0,
  • "orderSuppliers": [
    ],
  • "id": 0,
  • "name": "string"
}

Webhooks

Webhook subscriptions and delivery rules for Portal's public API.

Webhooks allow external systems to receive real-time notifications when specific events occur in Portal.

Developers can register webhook subscriptions by providing an HTTPS endpoint URL and selecting which events they want to receive. When a subscribed event occurs, Portal sends an HTTP POST request to the configured endpoint.

Each request contains a structured JSON payload describing the event.

Webhook deliveries are signed using a secret key to allow consumers to verify that the request was sent by Portal.

If a webhook delivery fails, Portal automatically retries the delivery several times. Current implementation schedule: 1 minute, 5 minutes, 30 minutes, 2 hours, 12 hours.


Security

Webhook requests are signed so consumers can verify that the request was sent by Portal.

Each subscription has a secretKey, which is used to generate a signature for every webhook request.

Signature header

Each webhook request includes the following header:

X-Webhook-Signature

Example:

X-Webhook-Signature: t=1710000000,v1=5f2b3e7a9d1c4f8e6b2a3c9d7f4e1a6b5c3d2f7e9a1b4c6d8e0f2a3b5c7d9e1

Where:

  • t - timestamp when the webhook was generated (Unix time)
  • v1 - HMAC-SHA256 signature

Signature generation

The signature is calculated using HMAC-SHA256 with the subscription secretKey.

The message being signed is:

timestamp + "." + requestBody

Example:

1710000000.{"id":10025,"number":4123,...}

Signature calculation:

signature = HMAC_SHA256(secretKey, timestamp + "." + requestBody)

Verifying the signature

Consumers should verify webhook requests using the following steps:

  1. Read the raw request body exactly as received.
  2. Read the X-Webhook-Signature header.
  3. Extract t and v1.
  4. Rebuild the signed message as t + "." + requestBody.
  5. Compute HMAC_SHA256(secretKey, signedMessage).
  6. Compare the computed value with v1.
  7. Reject the request if the values do not match.
  8. Reject the request if the timestamp is too old (recommended tolerance: 5 minutes).

Create Webhook Subscription

Creates a new webhook subscription for the authenticated dealer. The response includes the signing secret key used to verify delivered webhook requests.

Request
header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Request Body schema: application/x-www-form-urlencoded
required
Url
required
string

Absolute HTTPS URL that will receive webhook POST payloads. Must use the https:// scheme and resolve to a publicly routable host — private, loopback, and link-local addresses are rejected. The value is trimmed before storage.

Description
string

Optional human-readable label for this subscription. Trimmed before storage; whitespace-only values are stored as null.

Events
required
Array of strings

One or more event-type names to subscribe to. Duplicate names are ignored case-insensitively. Returns 400 listing any unrecognised event names. Currently supported webhook event names are implementation-defined; see the published webhook documentation for the current set.

Responses
200

Success

Response Schema: application/json
subscriptionId
required
integer <int64>

Unique numeric identifier of the webhook subscription

url
required
string

HTTPS URL that receives webhook POST deliveries

description
string

Optional human-readable label for the subscription

enabled
required
boolean

Whether the subscription is enabled

secretKey
string

Signing secret used to verify webhook deliveries. Only returned when a new secret is issued, such as during create or update operations

events
required
Array of strings

Event names that trigger this subscription

400

Validation failed. Common causes: subscription not found or does not belong to this account, URL is not HTTPS or resolves to a private address, unrecognised event names, or no changes were provided.

401

HMAC signature validation failed or credentials are invalid. Verify X-MSS-SIGNATURE, X-MSS-CUSTOM-DATE, and X-MSS-API-USERKEY headers.

402

The dealer's subscription is inactive or expired. An active subscription is required to use this endpoint.

403

You do not have permission for this action.

post/public/webhook/subscribe
Request samples
Response samples
application/json
{
  • "subscriptionId": 0,
  • "url": "string",
  • "description": "string",
  • "enabled": true,
  • "secretKey": "string",
  • "events": [
    ]
}

List Webhook Subscriptions

Returns all active webhook subscriptions for the authenticated dealer account.

Request
header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Responses
200

Success

Response Schema: application/json
Array
subscriptionId
required
integer <int64>

Unique numeric identifier of the webhook subscription

url
required
string

HTTPS URL that receives webhook POST deliveries

description
string

Optional human-readable label for the subscription

enabled
required
boolean

Whether the subscription is enabled

secretKey
string

Signing secret used to verify webhook deliveries. Only returned when a new secret is issued, such as during create or update operations

events
required
Array of strings

Event names that trigger this subscription

401

HMAC signature validation failed or credentials are invalid. Verify X-MSS-SIGNATURE, X-MSS-CUSTOM-DATE, and X-MSS-API-USERKEY headers.

402

The dealer's subscription is inactive or expired. An active subscription is required to use this endpoint.

403

You do not have permission for this action.

get/public/webhook/subscriptions
Request samples
Response samples
application/json
[
  • {
    }
]

Update Webhook Subscription

Partially updates an existing webhook subscription. Only supplied fields are changed; omitted (null) fields retain their current values. At least one field must be provided.

Request
path Parameters
SubscriptionId
required
integer <int64>

Numeric ID of the webhook subscription to update. Must belong to the authenticated account; returns 400 if not found.

header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Request Body schema: application/x-www-form-urlencoded
Url
string

New HTTPS URL for the webhook endpoint. Must use the https:// scheme and resolve to a publicly routable host — private, loopback, and link-local addresses are rejected. Omit (null) to keep the current URL.

Description
string

New human-readable label for this subscription. Send an empty string to clear the current description. Omit (null) to keep the current value. Trimmed before storage.

Enabled
boolean

When false, the subscription is paused and no events will be delivered until re-enabled. Omit to leave the current state unchanged.

Events
Array of strings

Replacement list of event-type names. When provided, completely replaces the existing event list. Omit to leave the current list unchanged.

Responses
200

Success

Response Schema: application/json
subscriptionId
required
integer <int64>

Unique numeric identifier of the webhook subscription

url
required
string

HTTPS URL that receives webhook POST deliveries

description
string

Optional human-readable label for the subscription

enabled
required
boolean

Whether the subscription is enabled

secretKey
string

Signing secret used to verify webhook deliveries. Only returned when a new secret is issued, such as during create or update operations

events
required
Array of strings

Event names that trigger this subscription

400

Validation failed. Common causes: subscription not found or does not belong to this account, URL is not HTTPS or resolves to a private address, unrecognised event names, or no changes were provided.

401

HMAC signature validation failed or credentials are invalid. Verify X-MSS-SIGNATURE, X-MSS-CUSTOM-DATE, and X-MSS-API-USERKEY headers.

402

The dealer's subscription is inactive or expired. An active subscription is required to use this endpoint.

403

You do not have permission for this action.

post/public/webhook/subscription/{SubscriptionId}
Request samples
Response samples
application/json
{
  • "subscriptionId": 0,
  • "url": "string",
  • "description": "string",
  • "enabled": true,
  • "secretKey": "string",
  • "events": [
    ]
}

Delete Webhook Subscription

Permanently deletes a webhook subscription and all of its event bindings. No further events will be delivered to the endpoint.

Request
path Parameters
SubscriptionId
required
integer <int64>

Numeric ID of the webhook subscription to permanently delete. Must belong to the authenticated account; returns 400 if not found.

header Parameters
Accept
required
string

Accept Header

Value: "application/json"
X-MSS-API-APPID
required
string

Application Id

X-MSS-CUSTOM-DATE
required
string

A date timestamp of the request

X-MSS-SIGNATURE
required
string

A signature for the request

X-MSS-API-USERKEY
required
string

User API Key

Responses
200

Success

Response Schema: application/json
success
required
boolean

Always true for a successful delete response

subscriptionId
required
integer <int64>

Identifier of the deleted webhook subscription

400

No active webhook subscription with the given SubscriptionId exists for the authenticated account.

401

HMAC signature validation failed or credentials are invalid. Verify X-MSS-SIGNATURE, X-MSS-CUSTOM-DATE, and X-MSS-API-USERKEY headers.

402

The dealer's subscription is inactive or expired. An active subscription is required to use this endpoint.

403

You do not have permission for this action.

delete/public/webhook/unsubscribe/{SubscriptionId}
Request samples
Response samples
application/json
{
  • "success": true,
  • "subscriptionId": 0
}

Webhook Events

Proposal Build Status Changed

Triggered when AI proposal build generation finishes successfully or fails.

Responses
200

Delivered payload

Response Schema: application/json
id
required
string

Unique webhook delivery identifier.

type
required
string

Webhook event type name.

created
string <date-time>

UTC timestamp when the webhook delivery was created.

required
object (AiProposalBuildWebhookData)

AiProposalBuildWebhookData

post/public/webhook/events/proposal-build-status-update
Request samples
Response samples
application/json
{
  • "id": "string",
  • "type": "string",
  • "created": "2019-08-24T14:15:22Z",
  • "data": {
    }
}

Proposal Outline Status Changed

Triggered when AI proposal outline generation finishes successfully or fails.

Responses
200

Delivered payload

Response Schema: application/json
id
required
string

Unique webhook delivery identifier.

type
required
string

Webhook event type name.

created
string <date-time>

UTC timestamp when the webhook delivery was created.

required
object (PublicAiProposalOutlineGetResponse)

PublicAiProposalOutlineGetResponse

post/public/webhook/events/proposal-outline-status-update
Request samples
Response samples
application/json
{
  • "id": "string",
  • "type": "string",
  • "created": "2019-08-24T14:15:22Z",
  • "data": {
    }
}

Proposal Status Changed

Triggered when the status of a proposal changes.

Responses
200

Delivered payload

Response Schema: application/json
id
required
integer <int32>

Unique identifier for the proposal. Use this id for subsequent API calls that reference the proposal.

createdDate
required
string <date-time>

UTC timestamp when the proposal was initially created. Returned in ISO 8601 format.

clientLastDecisionDate
string <date-time>

UTC timestamp when the client last accepted or declined the proposal. Null if no client decision has been recorded.

lastCompletedDate
string <date-time>

UTC timestamp when the proposal last reached a completed state, if applicable.

lastModifiedDate
required
string <date-time>

UTC timestamp when the proposal was last modified by any user or system process.

lastModifiedByUserDate
required
string <date-time>

UTC timestamp when the proposal was last modified by a human user (not an automated system update).

required
object (PublicFinancialSummaryModel)

Financial totals, discounts, tax, and currency values for the proposal

Array of objects (PublicChangeOrderModel)

List of change orders associated with this proposal. Each item contains details of scope changes, price adjustments, and approval state.

number
required
integer <int32>

Proposal number unique within the dealer account.

name
required
string

Display name of the proposal.

status
required
string

The current status of the resource.

Enum: "Undefined" "Draft" "Submitted" "ViewedByClient" "Accepted" "Declined" "Delayed" "Completed" "EmailFailed" "Expired"
lastSubmittedDate
string <date-time>

UTC timestamp when the proposal was last submitted to the customer.

clientLastOpenedDate
string <date-time>

UTC timestamp when the customer last opened the proposal viewer link.

object (PublicCustomerModel)

Customer contact

required
object (PublicDealerModel)

Dealer information

coverpageImageUrl
string

Absolute URL of the proposal cover image, when one is available.

aboutUs
string

The about us text for the company profile.

projectDescription
string

A description of the project.

Array of objects (PublicAreaModel)

The list of areas.

object (PublicProfitModel)

Profit summary for the proposal

object (PublicRecurringServicesModel)

Recurring service summary associated with the proposal.

object (PublicPaymentScheduleModel)

Payment schedule configuration for the proposal, including the customer-facing description and individual payment milestones.

Array of objects (PublicPaymentRequestModel)

Payment requests already issued for this proposal.

projectTerms
string

The terms and conditions for the project.

required
object (PublicUserModel)

User summary returned within proposal detail responses

post/public/webhook/events/proposal-status-changed
Request samples
Response samples
application/json
{
  • "id": 0,
  • "createdDate": "2019-08-24T14:15:22Z",
  • "clientLastDecisionDate": "2019-08-24T14:15:22Z",
  • "lastCompletedDate": "2019-08-24T14:15:22Z",
  • "lastModifiedDate": "2019-08-24T14:15:22Z",
  • "lastModifiedByUserDate": "2019-08-24T14:15:22Z",
  • "financialSummary": {
    },
  • "changeOrders": [
    ],
  • "number": 0,
  • "name": "string",
  • "status": "Undefined",
  • "lastSubmittedDate": "2019-08-24T14:15:22Z",
  • "clientLastOpenedDate": "2019-08-24T14:15:22Z",
  • "customer": {
    },
  • "dealer": {
    },
  • "coverpageImageUrl": "string",
  • "aboutUs": "string",
  • "projectDescription": "string",
  • "areas": [
    ],
  • "profit": {
    },
  • "recurringServices": {
    },
  • "paymentSchedule": {
    },
  • "paymentRequests": [
    ],
  • "projectTerms": "string",
  • "lastModifiedUser": {
    }
}