SoftSolzSoftSolz
HomeAPI GuideAPI ReferenceWidget Tester

Draft a new quote

Create a draft quote. Totals are worked out from the lines, the discount and each line tax rate. Values that are not valid are refused with a 400 and the field named in details.field, never changed quietly: a price that is not a whole number of minor units or is negative (invalid_unit_price), a tax rate outside 0 to 100 (invalid_tax_rate), a negative quantity (invalid_quantity), a title over 200 characters (title_too_long) or a line description over 500 characters (line_description_too_long). A quote_number that is already used answers 409 quote_number_taken. The quote is not sent until you call the send endpoint.

POSThttps://app.softsolz.uk/api/v1/services/quotes/quotes

Recent Requests

Kept only in this browser
TimeStatusTook
Send a request with Try it to see it here.

Headers

Authorizationstringrequired

Bearer token: Bearer sk_live_... (or sk_test_... for sandbox). A login token will not work here.

Idempotency-Keystring

Optional idempotency key for safe retries.

Body Params

titlestring | null

Short title of the quote.

linesarray of objectsrequired

Priced lines, in the order they should appear. At least one is needed.

currencystring

Three-letter currency code, for example GBP. It is kept exactly as sent, so send it in capitals. Defaults to GBP.

discount_centsinteger

Discount off the subtotal in minor units. It cannot be negative or more than the subtotal; otherwise the request is refused with 400 invalid_discount or discount_too_large. Defaults to 0.

contact_idstring | null

Contact the quote is for. Their email address receives the signing link.

company_idstring | null

Company the quote is for.

deal_idstring | null

Pipeline deal the quote belongs to.

quote_numberstring | null

Your own quote number. Leave it out to get the next number in the Q-0001 series.

valid_untilstring | null

Last day the customer can accept, as YYYY-MM-DD.

notesstring | null

Notes shown to the customer.

termsstring | null

Terms and conditions shown to the customer.

requires_signatureboolean

Whether the customer must sign to accept. Defaults to true.

Response

Response Body

idstringQuote id.
quote_numberstringQuote number shown to the customer, unique in the workspace.
titlestring | nullShort title of the quote.
contact_idstring | nullContact the quote is for.
contact_namestring | nullFull name of that contact.
contact_emailstring | nullEmail address of that contact.
company_idstring | nullCompany the quote is for.
company_namestring | nullName of that company.
deal_idstring | nullPipeline deal the quote belongs to.
statusstringWhere the quote is in its life.
currencystringThree-letter currency code, exactly as sent when the quote was created.
subtotal_centsintegerSum of the line totals in minor units, before discount and tax.
discount_centsintegerDiscount taken off the subtotal in minor units.
tax_centsintegerTax in minor units, worked out on the discounted amount.
total_centsintegerAmount the customer pays in minor units.
valid_untilstring | nullLast day the customer can accept the quote, as YYYY-MM-DD.
is_expiredbooleanTrue when the quote is still open (draft, sent or viewed) but its valid until date has passed.
notesstring | nullNotes shown to the customer.
termsstring | nullTerms and conditions shown to the customer.
requires_signaturebooleanWhether the customer must sign to accept.
sent_atstring | nullWhen the quote was first sent.
first_viewed_atstring | nullWhen the customer first opened the quote.
decided_atstring | nullWhen the customer accepted or declined.
declined_reasonstring | nullReason the customer gave when declining.
converted_invoice_idinteger | nullInvoice raised from this quote, once converted.
converted_invoice_numberstring | nullNumber of that invoice, once converted.
esign_modestringHow signing works: no signature, one signer, signers in turn, or all signers at once.
countersign_requiredbooleanWhether someone in your business must countersign after the customer. It is true whenever a signer from your business is on the quote. The quote stays open until that person has signed.
expires_atstring | nullWhen the quote expires automatically.
reminder_cadence_daysinteger | nullDays between automatic reminders, or null for none.
last_reminded_atstring | nullWhen the last reminder went out.
template_idstring | nullQuote template this quote was built from.
owner_user_idinteger | nullWorkspace member who owns the quote.
parent_quote_idstring | nullEarlier quote this one is a new version of.
converted_atstring | nullWhen the quote was converted.
converted_subscription_idstring | nullSubscription started from this quote, once converted.
deposit_centsintegerFixed deposit asked for on acceptance, in minor units.
deposit_percentnumberDeposit asked for on acceptance as a percentage of the total.
deposit_paid_atstring | nullWhen the deposit was paid.
approval_requiredbooleanWhether the quote must be approved inside your business before it is sent.
approved_atstring | nullWhen the quote was approved.
public_view_countintegerTimes the customer opened the quote.
total_view_secondsintegerTotal seconds the customer spent reading the quote.
owner_namestring | nullName of the workspace member who created the quote.
created_atstringWhen the quote was created.
updated_atstringWhen the quote last changed.
linesarray of objectsPriced lines, in order.
signatureobject | nullThe customer signature, once the quote is signed.
signersarray of objectsPeople asked to sign or copied in.

Request

curl --request POST \
--url https://app.softsolz.uk/api/v1/services/quotes/quotes \
--header 'Authorization: Bearer sk_live_your_key' \
--header 'Content-Type: application/json' \
--data '{
"title": "Website redesign",
"currency": "GBP",
"valid_until": "2026-12-31",
"discount_cents": 10000,
"notes": "Includes two rounds of changes.",
"terms": "Payment due within 14 days of acceptance.",
"lines": [
{
"description": "Design and build",
"quantity": 1,
"unit_price_cents": 120000,
"tax_rate_percent": 20
},
{
"description": "Content writing, per page",
"quantity": 6,
"unit_price_cents": 5000,
"tax_rate_percent": 20
}
]
}'

Credentials

Sent as a Bearer token and used in the samples above and in Try it. Kept only in this browser tab until you close it. Use an sk_test_ key to stay in your sandbox.

Response · 201

{
"data": {
"id": "42",
"quote_number": "Q-0007",
"title": "Website redesign",
"contact_id": "7d3f2b1a-9c4e-4f6a-8b2d-1e5c7a9b0f12",
"contact_name": "Jane Doe",
"contact_email": "jane@example.com",
"company_id": null,
"company_name": null,
"deal_id": null,
"status": "draft",
"currency": "GBP",
"subtotal_cents": 150000,
"discount_cents": 10000,
"tax_cents": 28000,
"total_cents": 168000,
"valid_until": "2026-12-31",
"is_expired": false,
"notes": "Includes two rounds of changes.",
"terms": "Payment due within 14 days of acceptance.",
"requires_signature": true,
"sent_at": null,
"first_viewed_at": null,
"decided_at": null,
"declined_reason": null,
"converted_invoice_id": null,
"converted_invoice_number": null,
"esign_mode": "single",
"countersign_required": false,
"expires_at": null,
"reminder_cadence_days": null,
"last_reminded_at": null,
"template_id": null,
"owner_user_id": null,
"parent_quote_id": null,
"converted_at": null,
"converted_subscription_id": null,
"deposit_cents": 0,
"deposit_percent": 0,
"deposit_paid_at": null,
"approval_required": false,
"approved_at": null,
"public_view_count": 0,
"total_view_seconds": 0,
"owner_name": "Alex Morgan",
"created_at": "2026-10-01T09:00:00.000Z",
"updated_at": "2026-10-01T09:00:00.000Z",
"lines": [
{
"id": "311",
"description": "Design and build",
"quantity": 1,
"unit_price_cents": 120000,
"tax_rate_percent": 20,
"line_total_cents": 120000,
"sort_order": 10,
"product_id": null,
"price_id": null,
"recurring_interval": null,
"is_optional": false,
"is_selected": true
},
{
"id": "312",
"description": "Content writing, per page",
"quantity": 6,
"unit_price_cents": 5000,
"tax_rate_percent": 20,
"line_total_cents": 30000,
"sort_order": 20,
"product_id": null,
"price_id": null,
"recurring_interval": null,
"is_optional": false,
"is_selected": true
}
],
"signature": {
"signer_name": "Jane Doe",
"signer_email": "jane@example.com",
"typed_name": "Jane Doe",
"signature_image": null,
"intent_statement": "I agree to this quote and its terms.",
"document_fingerprint": "9f2c4e1b7a3d5f6e8c0b2a4d6f8e0c1a3b5d7f9e1c3a5b7d9f1e3c5a7b9d1f3e",
"signed_at": "2026-10-03T14:20:00.000Z",
"signer_email_differs": false,
"invited_signer_name": "Jane Doe"
},
"signers": [
{
"id": "58",
"quote_id": "42",
"party": "customer",
"role": "signer",
"name": "Jane Doe",
"email": "jane@example.com",
"sign_order": 1,
"status": "pending",
"sent_at": null,
"first_viewed_at": null,
"signed_at": null,
"declined_at": null,
"declined_reason": null,
"has_signature": false,
"typed_name": null,
"created_at": "2026-10-01T09:00:00.000Z"
}
]
}
}