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), use
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
uuid
required
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.
number
required
Must equal the proposal’s
company_id.string
ISO-style language code (e.g.
en, sv). Required when adding/updating blocks with content_id if the proposal has no stored language.string
Proposal title as Markdown.
string
Proposal description as Markdown.
object
Same shape as Create proposal.
object
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.array
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.array
Same attachment shapes as Create proposal.
object
object
string
boolean
object
object
Response
object