Handle Save Proposal
CRM-10248 — a later save ("Save changes"). Overwrites the latest
draft version, or after a Regenerate adds the next one. Refused 409
STALE_DRAFT (with currentVersion) when basedOn is no longer the
latest version, and 409 NOT_A_DRAFT once the proposal was sent.
Path Parameters
- Type: stringproposal
_id required
Body·
A Save: what the rep has on screen. Data slots are resolved again on the
server; values holds only what the rep typed, by slot id. Line items are
never taken from the client.
- Type: stringdeal
Id min length:1max length:50requiredThe deal the proposal is for
- Type: stringtemplate
Version Id min length:1max length:50requiredThe template version Generate drew from (dtv-)
- Type: nullablebased
On Properties: 2Required on every save after the first
- Type: stringnamemin length:1max length:256nullable
First save only; defaults to the template's name
- Type: stringnullableproposal
Id First save only: an id the client chose, so a retried save finds the proposal it made
- Type:recipientsProperties: 2
Who signs and who gets a copy, in order.
orderedsets a signing order, which only means something between two or more signers. - Type: booleanregenerated
This save follows a Regenerate: it adds a version
- Type: ValuesvaluesProperties: 1
What the rep typed, by slot id
Responses
- application/json
- application/json
- application/json
- application/json
- application/json
curl 'https://crm.dreamhub.ai/api/v1/contracts/proposals/{proposal_id}' \
--request PUT \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
--data '{
"dealId": "",
"templateVersionId": "",
"proposalId": "",
"name": "",
"values": {
"additionalProperty": ""
},
"recipients": {
"ordered": false,
"list": [
{
"key": "",
"personId": "",
"name": "",
"email": "",
"company": "",
"jobTitle": "",
"role": "signer"
}
]
},
"basedOn": {
"versionId": "",
"lastModifiedAt": ""
},
"regenerated": false
}'
{
"proposal": {
"id": "string",
"name": "string",
"status": "string",
"createdAt": "2026-10-07T22:43:40.394Z",
"updatedAt": "2026-10-07T22:43:40.394Z",
"createdBy": {
"displayName": "string",
"avatarUrl": "string"
},
"outOfDate": true,
"signing": {
"signed": 1,
"total": 1,
"recipients": [
{
"email": "string",
"signed": false,
"viewedAt": "2026-10-07T22:43:40.394Z",
"signedAt": "2026-10-07T22:43:40.394Z",
"declinedAt": "2026-10-07T22:43:40.394Z",
"declineReason": "string"
}
]
},
"actions": [
{
"name": "string",
"uri": "string",
"method": "string"
}
]
},
"version": {
"id": "string",
"versionIndex": 1,
"status": "string",
"templateVersionId": "string",
"lastModifiedAt": "2026-10-07T22:43:40.394Z"
},
"contractId": "string",
"dealId": "string",
"sections": [
{
"id": "string",
"title": "string"
}
],
"signaturePlaces": 1,
"slots": [
{
"id": "string",
"section": "string",
"label": "string",
"kind": "string",
"source": "string",
"record": "string",
"display": "string",
"readOnly": true,
"multiline": true,
"maxLength": 1,
"boxes": [
{
"page": 1,
"x": 1,
"y": 1,
"width": 1,
"height": 1,
"fontSize": 1,
"padding": 1,
"font": "string",
"color": "string"
}
],
"value": "string",
"typedValue": "string",
"missing": {
"record": "string",
"recordId": "string",
"field": "string"
},
"needsInput": false
}
],
"lines": [
{
"additionalProperty": "string"
}
],
"recipients": {
"ordered": false,
"list": [
{
"key": "string",
"personId": "string",
"name": "string",
"email": "string",
"company": "string",
"jobTitle": "string",
"role": "string"
}
]
},
"actions": [
{
"name": "string",
"uri": "string",
"method": "string"
}
]
}
