Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.portal.io/llms.txt

Use this file to discover all available pages before exploring further.

Use this endpoint to assign a specific location to a proposal that already has a contact assigned. The location must belong to the proposal’s currently assigned contact and to the same account. Once a location is set, the API recalculates all applicable taxes for the proposal and returns the complete updated proposal object.
You cannot assign a location before assigning a contact. If the proposal has no contact, the API returns 409. Call Assign a Contact to a Proposal first.

Request

POST /public/proposals/{ProposalId}/location/{LocationId}

Headers

Accept
string
required
Must be application/json.
Content-Type
string
required
Must be application/json.
X-MSS-API-APPID
string
required
Your API Application Key.
X-MSS-API-USERKEY
string
required
Your User API Key.
X-MSS-CUSTOM-DATE
string
required
Current UTC timestamp in RFC 7231 format.
X-MSS-SIGNATURE
string
required
HMAC-SHA256 signature, Base64-encoded.

Path Parameters

ProposalId
integer
required
The unique ID of the proposal to update. Must belong to the current account.
LocationId
integer
required
The unique ID of the location to assign. Must belong to the proposal’s assigned contact.

Body Parameters

proposalId
integer
required
Must match the ProposalId path parameter. ID of the proposal to update.
locationId
integer
required
Must match the LocationId path parameter. ID of the location to assign to the proposal’s existing contact.

Response

200 Success

Returns the full updated proposal detail after the location has been assigned and taxes have been recalculated. See Get Proposal for the complete field reference. Key fields:
id
integer
required
Unique identifier of the proposal.
number
integer
required
Proposal number unique within the dealer account.
name
string
required
Display name of the proposal.
status
string
required
Current proposal status.
createdDate
string
required
ISO 8601 timestamp of when the proposal was created.
lastModifiedDate
string
required
ISO 8601 timestamp of the most recent modification.
lastModifiedByUserDate
string
required
ISO 8601 timestamp when the proposal was last modified by a human user.
financialSummary
object
required
Updated financial totals including recalculated sales tax. See Get Proposal for field details.
dealer
object
required
Dealer account details.
lastModifiedUser
object
required
Details of the user who last modified the proposal.

Error Codes

CodeMeaning
401Not authorized. Invalid or missing HMAC authentication headers.
402Active subscription required.
403You do not have permission for this action.
404Proposal or location not found.
409The proposal has no contact assigned; a location cannot be set.

Example

curl -i -X POST \
  'https://api.portal.io/public/proposals/123/location/789' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -H 'X-MSS-API-APPID: YOUR_APP_ID' \
  -H 'X-MSS-API-USERKEY: YOUR_USER_KEY' \
  -H 'X-MSS-CUSTOM-DATE: Mon, 06 Apr 2026 00:22:19 GMT' \
  -H 'X-MSS-SIGNATURE: BASE64_SIGNATURE' \
  -d '{"proposalId": 123, "locationId": 789}'
{
  "id": 123,
  "createdDate": "2026-03-01T09:00:00Z",
  "lastModifiedDate": "2026-04-06T00:22:19Z",
  "financialSummary": {
    "partsSubtotal": 2500.00,
    "laborTotal": 500.00,
    "feeTotal": 0,
    "proposalSubtotal": 3000.00,
    "salesTax": {
      "taxStatus": "Ok",
      "total": 247.50
    },
    "proposalTotal": 3247.50
  }
}