Skip to main content
Use this endpoint to associate an existing contact with a proposal. Both the proposal and contact must belong to the same account. If the contact has exactly one primary location, the API automatically assigns that location to the proposal at the same time. When a location is set — either automatically here or explicitly via the assign-location endpoint — tax calculations are recalculated based on the contact’s location data.
A proposal must have a contact assigned before you can assign a location. Attempting to assign a location to a proposal with no contact returns 409.

Request

POST /public/proposals/{ProposalId}/contact/{ContactId}

Headers

Accept
string
required
Must be application/json.
Content-Type
string
required
Must be application/x-www-form-urlencoded.
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. Must belong to the current account.
ContactId
integer
required
The unique ID of the contact to assign. Must belong to the same account as the proposal.

Response

204 No Content

The contact was successfully assigned. No response body is returned.

Error Codes

CodeMeaning
401Not authorized. Invalid or missing HMAC authentication headers.
402Active subscription required.
403You do not have permission for this action.
404Proposal or contact not found.

Example

curl -i -X POST \
  'https://api.portal.io/public/proposals/123/contact/456' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -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'
// No content returned on success