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

Body·

required
application/json

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.

  • The deal the proposal is for

  • The template version Generate drew from (dtv-)

  • Required on every save after the first

    Properties: 2
  • First save only; defaults to the template's name

  • First save only: an id the client chose, so a retried save finds the proposal it made

  • Who signs and who gets a copy, in order. ordered sets a signing order, which only means something between two or more signers.

    Properties: 2
  • This save follows a Regenerate: it adds a version

  • What the rep typed, by slot id

    Properties: 1

Responses

  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for put/proposals/{proposal_id}
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"
    }
  ]
}