Patch proposal (draft)
Proposals
Patch proposal (draft)
Partially update an existing draft or template proposal in place (same UUID).
PATCH
Patch proposal (draft)
Use this endpoint when you want to change blocks, title, recipient, attachments, or other draft fields without creating a new version. For a new version (duplicate + apply body), useDocumentation Index
Fetch the complete documentation index at: https://docs.proposales.com/llms.txt
Use this file to discover all available pages before exploring further.
Create new version of proposal — POST /v3/proposals/{uuid}. To update only the JSON data metadata blob with a shallow merge, use Patch proposal data.
Eligibility
- The proposal must exist (
404if the UUID is unknown). - The authenticated user must be allowed to edit the proposal (
401if not). company_idin the body must match the proposal’s company (400if not).- Status must be
draftortemplate. Other statuses return409(e.g.active,accepted). withdrawnproposals return400.
Request body
The body is strict: only documented fields are accepted; extra keys return400 with error.issues describing each problem (field path and message).
company_id(number, required on every request) — must match the proposal’s company.- At least one other field is required besides
company_id(empty patches are rejected).
creator_email— use Create proposal only.status— not used for publishing; see warning above.
language
- Optional on the patch if the proposal already has a language and you are not changing blocks that depend on the content library.
- If you send
blockswithcontent_id, you must supplylanguagein the body or the proposal must already have a language stored.
Path
The UUID of the draft or template to update (same UUID after a successful patch).
Common body fields
The following mirror Create proposal; all are optional exceptcompany_id, subject to the rules above.
Must equal the proposal’s
company_id.ISO-style language code (e.g.
en, sv). Required when adding/updating blocks with content_id if the proposal has no stored language.Proposal title as Markdown.
Proposal description as Markdown.
Same shape as Create proposal.
Proposal metadata when you need to change it together with other draft fields. For a merge-only update of
data without touching other fields, prefer PATCH /v3/proposals/{uuid}/data.Same block shape as Create proposal. If you include
blocks, the array replaces the proposal’s entire block list for this update (same as create semantics). Omit blocks to leave the current layout unchanged. To change one block, send the full ordered list with that block updated. For blocks tied to the content library (content_id), the server merges your fields into the stored snapshot for each block you send; it does not accept a sparse “only these block UUIDs” delta.Per-block title, description, and image_uuids are not honored on PATCH — they are owned by the content library and the editor. If sent on a block, they are silently ignored. Update them in the Proposales editor instead.Block identity for editor-edits preservation: matching is strictly by uuid. The editor’s manual edits to a block’s title, description, or images are preserved only when the PATCH block carries the same uuid as the existing block. PATCH blocks without uuid are always treated as brand-new blocks (catalog title/description, server-generated uuid); the order in the resulting proposal mirrors the order in your request body. To update existing blocks, fetch current uuids via GET /v3/proposals/{uuid} and echo them on PATCH. Position in the array is never used to match.Same attachment shapes as Create proposal.
Response
Status codes
| Code | Meaning |
|---|---|
200 | Draft updated |
400 | Validation failed (strict body, withdrawn, or company_id mismatch). Response may include error.issues with per-field details. |
401 | Missing/invalid token, or user cannot edit this proposal |
404 | Unknown uuid |
409 | Proposal is not draft or template |