Skip to main content
POST
/
v3
/
proposals
/
{uuid}
Create new version of proposal
curl --request POST \
  --url https://api.proposales.com/v3/proposals/{uuid} \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "company_id": 123,
  "language": "<string>",
  "title_md": "<string>",
  "description_md": "<string>",
  "recipient": {},
  "contact_email": "<string>",
  "data": {},
  "blocks": [
    {}
  ],
  "attachments": [
    {}
  ],
  "background_image": {},
  "background_video": {},
  "invoicing_enabled": true,
  "invoicing": {},
  "tax_options": {}
}
'
{
  "proposal": {
    "uuid": "<string>",
    "url": "<string>"
  }
}

Documentation Index

Fetch the complete documentation index at: https://docs.proposales.com/llms.txt

Use this file to discover all available pages before exploring further.

Use this endpoint to create a new draft version of a proposal that has already been sent. The new draft is a fresh copy of the source proposal in the same proposal series, with a new UUID, and the request body lets you override fields on the new draft. For partial in-place updates of a draft you have not sent yet, use Patch proposal (draft). For an entirely new proposal series, use Create proposal.

When to use this endpoint

Pick the right v3 endpoint based on the current state of the proposal on Proposales’ side:
  • Proposal does not exist yetPOST /v3/proposals.
  • Proposal exists and is still draft or templatePATCH /v3/proposals/{uuid} (in-place update, same UUID).
  • Proposal exists and has already been sent (active, accepted, replaced, expired, or rejected) → this endpoint (POST /v3/proposals/{uuid}) — it creates a new draft version in the same proposal series.
Calling this endpoint while the source proposal is still a draft is allowed, but it creates a separate draft alongside the existing one rather than a true new version. For changes to a proposal you have not yet sent, prefer PATCH /v3/proposals/{uuid}.

Eligibility

  • The source proposal must exist.
  • The caller must have access to the source proposal’s company.
  • body.company_id must match the source proposal’s company.
  • The source proposal must not be withdrawn. Any other status is accepted (draft, template, active, accepted, replaced, expired, rejected).

Idempotency

Calling this endpoint repeatedly for the same source UUID returns the same draft UUID until that draft is sent or archived. Each call applies your latest body to that draft, so callers should treat this endpoint as “create-or-replace the next-version draft” rather than “always create a new draft”. Once the draft is sent (or archived), a subsequent call mints a fresh new-version draft.

What carries over from the source

The new draft inherits the following from the source proposal, unless overridden in the request body:
  • Blocks, including any title, description, and image customisations made in the editor
  • Attachments
  • Recipient
  • Language
  • Title and description
  • Tax options
  • Background image and background video
  • Payment configuration
  • Proposal metadata (data)
  • Creator and contact person
The new draft belongs to the same proposal series as the source. When the series contains a previously accepted proposal, the new draft is automatically linked to it so version history is preserved in the editor.

Path

uuid
uuid
required
The UUID of the source proposal to create a new version from.

Request body

The body shape mirrors Create proposal; most fields are optional and override the value carried over from the source, but company_id is required (see Eligibility). The body is strict — extra keys return 400 with error.issues describing each problem.
  • creator_email is ignored on this route. The creator is preserved from the previous version.
company_id
number
required
Must equal the source proposal’s company_id.
language
string
ISO-style language code (e.g. en, sv). Required when adding blocks with content_id if the proposal has no stored language.
title_md
string
Proposal title as Markdown. Overrides the carried-over title.
description_md
string
Proposal description as Markdown. Overrides the carried-over description.
recipient
object
Same shape as Create proposal.
contact_email
string
Email of the internal contact person. Same rules as Create proposal.
data
object
Proposal metadata. Replaces the carried-over data.
blocks
array
Same block shape as Create proposal. When provided, the array replaces the carried-over block list on the new draft.
attachments
array
Same attachment shapes as Create proposal. When provided, replaces the carried-over attachments.
background_image
object
background_video
object
invoicing_enabled
boolean
invoicing
object
tax_options
object
Same shape as Create proposal.

Response

proposal
object

Status codes

CodeMeaning
200New draft version created (or existing one returned and updated under the idempotency rule).
400Body validation failed. Response includes error.issues with per-field details.
401Missing or invalid API token.