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.
https://app.softsolz.uk/api/v1/services/quotes/quotesRecent Requests
Kept only in this browserHeaders
AuthorizationstringrequiredBearer token: Bearer sk_live_... (or sk_test_... for sandbox). A login token will not work here.
Idempotency-KeystringOptional idempotency key for safe retries.
Body Params
titlestring | nullShort title of the quote.
linesarray of objectsrequiredPriced lines, in the order they should appear. At least one is needed.
currencystringThree-letter currency code, for example GBP. It is kept exactly as sent, so send it in capitals. Defaults to GBP.
discount_centsintegerDiscount 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 | nullContact the quote is for. Their email address receives the signing link.
company_idstring | nullCompany the quote is for.
deal_idstring | nullPipeline deal the quote belongs to.
quote_numberstring | nullYour own quote number. Leave it out to get the next number in the Q-0001 series.
valid_untilstring | nullLast day the customer can accept, as YYYY-MM-DD.
notesstring | nullNotes shown to the customer.
termsstring | nullTerms and conditions shown to the customer.
requires_signaturebooleanWhether 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" } ] }}