# 📝 Quotes

Sales quotes and estimates

## List quotes

> List all quotes for an organization

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"tags":[{"name":"Quotes","description":"Sales quotes and estimates"}],"servers":[{"url":"https://skhokho.ai","description":"Production"},{"url":"http://102.209.118.152:8000/","description":"Local"},{"url":"https://dev.skhokho.ai","description":"Development"}],"security":[{"basicAuth":[]},{"cookieAuth":[]}],"components":{"securitySchemes":{"basicAuth":{"type":"http","scheme":"basic"},"cookieAuth":{"type":"apiKey","in":"cookie","name":"sessionid"}},"schemas":{"QuoteList":{"type":"object","description":"Lightweight version for list views.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"title":{"type":"string"},"quote_number":{"type":"string","maxLength":100},"status":{"enum":["draft","sent","viewed","accepted","rejected","expired","converted"],"type":"string","description":"* `draft` - Draft\n* `sent` - Sent\n* `viewed` - Viewed by Client\n* `accepted` - Accepted\n* `rejected` - Rejected\n* `expired` - Expired\n* `converted` - Converted to Invoice"},"status_display":{"type":"string","readOnly":true},"quote_date":{"type":"string","format":"date"},"valid_until":{"type":"string","format":"date","nullable":true},"total_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true,"description":"Subtotal + Total Tax Amount"},"is_expired":{"type":"boolean","readOnly":true},"currency":{"type":"string","readOnly":true},"client":{"allOf":[{"$ref":"#/components/schemas/FinanceClientMini"}],"readOnly":true},"date_created":{"type":"string","format":"date-time","readOnly":true,"nullable":true}},"required":["client","currency","date_created","is_expired","quote_number","status_display","title","total_amount"]},"FinanceClientMini":{"type":"object","description":"Lightweight serializer for Client model.\nUsed for nested client references in invoices and quotes.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","readOnly":true},"entity_type":{"enum":["individual","company","non_profit","government","partnership","other"],"type":"string","description":"* `individual` - Individual\n* `company` - Company\n* `non_profit` - Non-Profit Organization\n* `government` - Government Entity\n* `partnership` - Partnership\n* `other` - Other"}},"required":["name"]}}},"paths":{"/api/v1.0/organisation/{org_id}/quotes/":{"get":{"operationId":"organisation_quotes_list","description":"List all quotes for an organization","summary":"List quotes","parameters":[{"in":"query","name":"client_id","schema":{"type":"string"},"description":"Filter by client unique_id"},{"in":"query","name":"expired","schema":{"type":"string"},"description":"Filter expired quotes (true/false)"},{"in":"query","name":"from_date","schema":{"type":"string"},"description":"Filter quotes from this quote_date (YYYY-MM-DD)"},{"in":"path","name":"org_id","schema":{"type":"string"},"required":true},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search quote_number or title"},{"in":"query","name":"status","schema":{"type":"string","enum":["accepted","converted","draft","rejected","sent","viewed"]},"description":"Filter by quote status"},{"in":"query","name":"to_date","schema":{"type":"string"},"description":"Filter quotes up to this quote_date (YYYY-MM-DD)"}],"tags":["Quotes"],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/QuoteList"}}}},"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"}}}}}}
```

## Create quote

> Create a new quote

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"tags":[{"name":"Quotes","description":"Sales quotes and estimates"}],"servers":[{"url":"https://skhokho.ai","description":"Production"},{"url":"http://102.209.118.152:8000/","description":"Local"},{"url":"https://dev.skhokho.ai","description":"Development"}],"security":[{"basicAuth":[]},{"cookieAuth":[]}],"components":{"securitySchemes":{"basicAuth":{"type":"http","scheme":"basic"},"cookieAuth":{"type":"apiKey","in":"cookie","name":"sessionid"}},"schemas":{"QuoteRequest":{"type":"object","description":"Comprehensive serializer for Quote model.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"title":{"type":"string","minLength":1},"description":{"type":"string","nullable":true},"terms_and_conditions":{"type":"string","nullable":true},"notes":{"type":"string","nullable":true},"quote_number":{"type":"string","minLength":1,"maxLength":100},"status":{"enum":["draft","sent","viewed","accepted","rejected","expired","converted"],"type":"string","description":"* `draft` - Draft\n* `sent` - Sent\n* `viewed` - Viewed by Client\n* `accepted` - Accepted\n* `rejected` - Rejected\n* `expired` - Expired\n* `converted` - Converted to Invoice"},"quote_date":{"type":"string","format":"date"},"valid_until":{"type":"string","format":"date","nullable":true},"client_id":{"type":"string","writeOnly":true,"nullable":true,"minLength":1},"items":{"type":"array","items":{"$ref":"#/components/schemas/QuoteItemRequest"}}},"required":["quote_number","title"]},"QuoteItemRequest":{"type":"object","description":"Serializer for quote line items.","properties":{"product_id":{"type":"string","writeOnly":true,"nullable":true,"minLength":1},"service_id":{"type":"string","writeOnly":true,"nullable":true,"minLength":1},"quantity":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"unit_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"discount_percentage":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"Discount %"},"vat_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"VAT Rate (%)","description":"VAT/tax rate percentage for this line item"},"currency":{"type":"string","minLength":1,"description":"Currency code (ISO 4217) for this line item","maxLength":3}},"required":["quantity","unit_price"]},"Quote":{"type":"object","description":"Comprehensive serializer for Quote model.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"title":{"type":"string"},"description":{"type":"string","nullable":true},"terms_and_conditions":{"type":"string","nullable":true},"notes":{"type":"string","nullable":true},"quote_number":{"type":"string","maxLength":100},"status":{"enum":["draft","sent","viewed","accepted","rejected","expired","converted"],"type":"string","description":"* `draft` - Draft\n* `sent` - Sent\n* `viewed` - Viewed by Client\n* `accepted` - Accepted\n* `rejected` - Rejected\n* `expired` - Expired\n* `converted` - Converted to Invoice"},"status_display":{"type":"string","readOnly":true},"quote_date":{"type":"string","format":"date"},"valid_until":{"type":"string","format":"date","nullable":true},"sent_date":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"subtotal":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true,"description":"Calculated from line items"},"total_tax_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true,"description":"Total VAT/tax from all line items"},"total_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true,"description":"Subtotal + Total Tax Amount"},"is_expired":{"type":"boolean","readOnly":true},"currency":{"type":"string","readOnly":true},"client":{"allOf":[{"$ref":"#/components/schemas/FinanceClientMini"}],"readOnly":true},"items":{"type":"array","items":{"$ref":"#/components/schemas/QuoteItem"}},"created_by":{"allOf":[{"$ref":"#/components/schemas/FinancePersonMini"}],"readOnly":true},"date_created":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"last_updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true}},"required":["client","created_by","currency","date_created","is_expired","last_updated","quote_number","sent_date","status_display","subtotal","title","total_amount","total_tax_amount"]},"FinanceClientMini":{"type":"object","description":"Lightweight serializer for Client model.\nUsed for nested client references in invoices and quotes.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","readOnly":true},"entity_type":{"enum":["individual","company","non_profit","government","partnership","other"],"type":"string","description":"* `individual` - Individual\n* `company` - Company\n* `non_profit` - Non-Profit Organization\n* `government` - Government Entity\n* `partnership` - Partnership\n* `other` - Other"}},"required":["name"]},"QuoteItem":{"type":"object","description":"Serializer for quote line items.","properties":{"item_name":{"type":"string","readOnly":true},"quantity":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"unit_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"discount_percentage":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"Discount %"},"vat_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"VAT Rate (%)","description":"VAT/tax rate percentage for this line item"},"currency":{"type":"string","description":"Currency code (ISO 4217) for this line item","maxLength":3},"line_subtotal":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true},"line_vat_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true},"line_total":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true}},"required":["item_name","line_subtotal","line_total","line_vat_amount","quantity","unit_price"]},"FinancePersonMini":{"type":"object","description":"Lightweight serializer for Person model.\nUsed for nested person references in financial documents.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","readOnly":true}},"required":["full_name"]}}},"paths":{"/api/v1.0/organisation/{org_id}/quotes/create/":{"post":{"operationId":"organisation_quotes_create_create","description":"Create a new quote","summary":"Create quote","parameters":[{"in":"path","name":"org_id","schema":{"type":"string"},"required":true}],"tags":["Quotes"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/QuoteRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/QuoteRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote"}}},"description":""},"400":{"description":"Bad Request"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"}}}}}}
```

## Retrieve quote

> Retrieve a specific quote with full details

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"tags":[{"name":"Quotes","description":"Sales quotes and estimates"}],"servers":[{"url":"https://skhokho.ai","description":"Production"},{"url":"http://102.209.118.152:8000/","description":"Local"},{"url":"https://dev.skhokho.ai","description":"Development"}],"security":[{"basicAuth":[]},{"cookieAuth":[]}],"components":{"securitySchemes":{"basicAuth":{"type":"http","scheme":"basic"},"cookieAuth":{"type":"apiKey","in":"cookie","name":"sessionid"}},"schemas":{"Quote":{"type":"object","description":"Comprehensive serializer for Quote model.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"title":{"type":"string"},"description":{"type":"string","nullable":true},"terms_and_conditions":{"type":"string","nullable":true},"notes":{"type":"string","nullable":true},"quote_number":{"type":"string","maxLength":100},"status":{"enum":["draft","sent","viewed","accepted","rejected","expired","converted"],"type":"string","description":"* `draft` - Draft\n* `sent` - Sent\n* `viewed` - Viewed by Client\n* `accepted` - Accepted\n* `rejected` - Rejected\n* `expired` - Expired\n* `converted` - Converted to Invoice"},"status_display":{"type":"string","readOnly":true},"quote_date":{"type":"string","format":"date"},"valid_until":{"type":"string","format":"date","nullable":true},"sent_date":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"subtotal":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true,"description":"Calculated from line items"},"total_tax_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true,"description":"Total VAT/tax from all line items"},"total_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true,"description":"Subtotal + Total Tax Amount"},"is_expired":{"type":"boolean","readOnly":true},"currency":{"type":"string","readOnly":true},"client":{"allOf":[{"$ref":"#/components/schemas/FinanceClientMini"}],"readOnly":true},"items":{"type":"array","items":{"$ref":"#/components/schemas/QuoteItem"}},"created_by":{"allOf":[{"$ref":"#/components/schemas/FinancePersonMini"}],"readOnly":true},"date_created":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"last_updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true}},"required":["client","created_by","currency","date_created","is_expired","last_updated","quote_number","sent_date","status_display","subtotal","title","total_amount","total_tax_amount"]},"FinanceClientMini":{"type":"object","description":"Lightweight serializer for Client model.\nUsed for nested client references in invoices and quotes.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","readOnly":true},"entity_type":{"enum":["individual","company","non_profit","government","partnership","other"],"type":"string","description":"* `individual` - Individual\n* `company` - Company\n* `non_profit` - Non-Profit Organization\n* `government` - Government Entity\n* `partnership` - Partnership\n* `other` - Other"}},"required":["name"]},"QuoteItem":{"type":"object","description":"Serializer for quote line items.","properties":{"item_name":{"type":"string","readOnly":true},"quantity":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"unit_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"discount_percentage":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"Discount %"},"vat_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"VAT Rate (%)","description":"VAT/tax rate percentage for this line item"},"currency":{"type":"string","description":"Currency code (ISO 4217) for this line item","maxLength":3},"line_subtotal":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true},"line_vat_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true},"line_total":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true}},"required":["item_name","line_subtotal","line_total","line_vat_amount","quantity","unit_price"]},"FinancePersonMini":{"type":"object","description":"Lightweight serializer for Person model.\nUsed for nested person references in financial documents.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","readOnly":true}},"required":["full_name"]}}},"paths":{"/api/v1.0/organisation/{org_id}/quotes/{quote_id}/":{"get":{"operationId":"organisation_quotes_retrieve","description":"Retrieve a specific quote with full details","summary":"Retrieve quote","parameters":[{"in":"path","name":"org_id","schema":{"type":"string"},"required":true},{"in":"path","name":"quote_id","schema":{"type":"string"},"required":true}],"tags":["Quotes"],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote"}}},"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}}}}}
```

## Update quote

> Update an existing quote

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"tags":[{"name":"Quotes","description":"Sales quotes and estimates"}],"servers":[{"url":"https://skhokho.ai","description":"Production"},{"url":"http://102.209.118.152:8000/","description":"Local"},{"url":"https://dev.skhokho.ai","description":"Development"}],"security":[{"basicAuth":[]},{"cookieAuth":[]}],"components":{"securitySchemes":{"basicAuth":{"type":"http","scheme":"basic"},"cookieAuth":{"type":"apiKey","in":"cookie","name":"sessionid"}},"schemas":{"QuoteRequest":{"type":"object","description":"Comprehensive serializer for Quote model.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"title":{"type":"string","minLength":1},"description":{"type":"string","nullable":true},"terms_and_conditions":{"type":"string","nullable":true},"notes":{"type":"string","nullable":true},"quote_number":{"type":"string","minLength":1,"maxLength":100},"status":{"enum":["draft","sent","viewed","accepted","rejected","expired","converted"],"type":"string","description":"* `draft` - Draft\n* `sent` - Sent\n* `viewed` - Viewed by Client\n* `accepted` - Accepted\n* `rejected` - Rejected\n* `expired` - Expired\n* `converted` - Converted to Invoice"},"quote_date":{"type":"string","format":"date"},"valid_until":{"type":"string","format":"date","nullable":true},"client_id":{"type":"string","writeOnly":true,"nullable":true,"minLength":1},"items":{"type":"array","items":{"$ref":"#/components/schemas/QuoteItemRequest"}}},"required":["quote_number","title"]},"QuoteItemRequest":{"type":"object","description":"Serializer for quote line items.","properties":{"product_id":{"type":"string","writeOnly":true,"nullable":true,"minLength":1},"service_id":{"type":"string","writeOnly":true,"nullable":true,"minLength":1},"quantity":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"unit_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"discount_percentage":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"Discount %"},"vat_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"VAT Rate (%)","description":"VAT/tax rate percentage for this line item"},"currency":{"type":"string","minLength":1,"description":"Currency code (ISO 4217) for this line item","maxLength":3}},"required":["quantity","unit_price"]},"Quote":{"type":"object","description":"Comprehensive serializer for Quote model.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"title":{"type":"string"},"description":{"type":"string","nullable":true},"terms_and_conditions":{"type":"string","nullable":true},"notes":{"type":"string","nullable":true},"quote_number":{"type":"string","maxLength":100},"status":{"enum":["draft","sent","viewed","accepted","rejected","expired","converted"],"type":"string","description":"* `draft` - Draft\n* `sent` - Sent\n* `viewed` - Viewed by Client\n* `accepted` - Accepted\n* `rejected` - Rejected\n* `expired` - Expired\n* `converted` - Converted to Invoice"},"status_display":{"type":"string","readOnly":true},"quote_date":{"type":"string","format":"date"},"valid_until":{"type":"string","format":"date","nullable":true},"sent_date":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"subtotal":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true,"description":"Calculated from line items"},"total_tax_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true,"description":"Total VAT/tax from all line items"},"total_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true,"description":"Subtotal + Total Tax Amount"},"is_expired":{"type":"boolean","readOnly":true},"currency":{"type":"string","readOnly":true},"client":{"allOf":[{"$ref":"#/components/schemas/FinanceClientMini"}],"readOnly":true},"items":{"type":"array","items":{"$ref":"#/components/schemas/QuoteItem"}},"created_by":{"allOf":[{"$ref":"#/components/schemas/FinancePersonMini"}],"readOnly":true},"date_created":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"last_updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true}},"required":["client","created_by","currency","date_created","is_expired","last_updated","quote_number","sent_date","status_display","subtotal","title","total_amount","total_tax_amount"]},"FinanceClientMini":{"type":"object","description":"Lightweight serializer for Client model.\nUsed for nested client references in invoices and quotes.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","readOnly":true},"entity_type":{"enum":["individual","company","non_profit","government","partnership","other"],"type":"string","description":"* `individual` - Individual\n* `company` - Company\n* `non_profit` - Non-Profit Organization\n* `government` - Government Entity\n* `partnership` - Partnership\n* `other` - Other"}},"required":["name"]},"QuoteItem":{"type":"object","description":"Serializer for quote line items.","properties":{"item_name":{"type":"string","readOnly":true},"quantity":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"unit_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"discount_percentage":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"Discount %"},"vat_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"VAT Rate (%)","description":"VAT/tax rate percentage for this line item"},"currency":{"type":"string","description":"Currency code (ISO 4217) for this line item","maxLength":3},"line_subtotal":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true},"line_vat_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true},"line_total":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true}},"required":["item_name","line_subtotal","line_total","line_vat_amount","quantity","unit_price"]},"FinancePersonMini":{"type":"object","description":"Lightweight serializer for Person model.\nUsed for nested person references in financial documents.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","readOnly":true}},"required":["full_name"]}}},"paths":{"/api/v1.0/organisation/{org_id}/quotes/{quote_id}/update/":{"put":{"operationId":"organisation_quotes_update_update","description":"Update an existing quote","summary":"Update quote","parameters":[{"in":"path","name":"org_id","schema":{"type":"string"},"required":true},{"in":"path","name":"quote_id","schema":{"type":"string"},"required":true}],"tags":["Quotes"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/QuoteRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/QuoteRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote"}}},"description":""},"400":{"description":"Bad Request"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}}}}}
```

## Update quote

> Update an existing quote

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"tags":[{"name":"Quotes","description":"Sales quotes and estimates"}],"servers":[{"url":"https://skhokho.ai","description":"Production"},{"url":"http://102.209.118.152:8000/","description":"Local"},{"url":"https://dev.skhokho.ai","description":"Development"}],"security":[{"basicAuth":[]},{"cookieAuth":[]}],"components":{"securitySchemes":{"basicAuth":{"type":"http","scheme":"basic"},"cookieAuth":{"type":"apiKey","in":"cookie","name":"sessionid"}},"schemas":{"PatchedQuoteRequest":{"type":"object","description":"Comprehensive serializer for Quote model.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"title":{"type":"string","minLength":1},"description":{"type":"string","nullable":true},"terms_and_conditions":{"type":"string","nullable":true},"notes":{"type":"string","nullable":true},"quote_number":{"type":"string","minLength":1,"maxLength":100},"status":{"enum":["draft","sent","viewed","accepted","rejected","expired","converted"],"type":"string","description":"* `draft` - Draft\n* `sent` - Sent\n* `viewed` - Viewed by Client\n* `accepted` - Accepted\n* `rejected` - Rejected\n* `expired` - Expired\n* `converted` - Converted to Invoice"},"quote_date":{"type":"string","format":"date"},"valid_until":{"type":"string","format":"date","nullable":true},"client_id":{"type":"string","writeOnly":true,"nullable":true,"minLength":1},"items":{"type":"array","items":{"$ref":"#/components/schemas/QuoteItemRequest"}}}},"QuoteItemRequest":{"type":"object","description":"Serializer for quote line items.","properties":{"product_id":{"type":"string","writeOnly":true,"nullable":true,"minLength":1},"service_id":{"type":"string","writeOnly":true,"nullable":true,"minLength":1},"quantity":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"unit_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"discount_percentage":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"Discount %"},"vat_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"VAT Rate (%)","description":"VAT/tax rate percentage for this line item"},"currency":{"type":"string","minLength":1,"description":"Currency code (ISO 4217) for this line item","maxLength":3}},"required":["quantity","unit_price"]},"Quote":{"type":"object","description":"Comprehensive serializer for Quote model.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"title":{"type":"string"},"description":{"type":"string","nullable":true},"terms_and_conditions":{"type":"string","nullable":true},"notes":{"type":"string","nullable":true},"quote_number":{"type":"string","maxLength":100},"status":{"enum":["draft","sent","viewed","accepted","rejected","expired","converted"],"type":"string","description":"* `draft` - Draft\n* `sent` - Sent\n* `viewed` - Viewed by Client\n* `accepted` - Accepted\n* `rejected` - Rejected\n* `expired` - Expired\n* `converted` - Converted to Invoice"},"status_display":{"type":"string","readOnly":true},"quote_date":{"type":"string","format":"date"},"valid_until":{"type":"string","format":"date","nullable":true},"sent_date":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"subtotal":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true,"description":"Calculated from line items"},"total_tax_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true,"description":"Total VAT/tax from all line items"},"total_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true,"description":"Subtotal + Total Tax Amount"},"is_expired":{"type":"boolean","readOnly":true},"currency":{"type":"string","readOnly":true},"client":{"allOf":[{"$ref":"#/components/schemas/FinanceClientMini"}],"readOnly":true},"items":{"type":"array","items":{"$ref":"#/components/schemas/QuoteItem"}},"created_by":{"allOf":[{"$ref":"#/components/schemas/FinancePersonMini"}],"readOnly":true},"date_created":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"last_updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true}},"required":["client","created_by","currency","date_created","is_expired","last_updated","quote_number","sent_date","status_display","subtotal","title","total_amount","total_tax_amount"]},"FinanceClientMini":{"type":"object","description":"Lightweight serializer for Client model.\nUsed for nested client references in invoices and quotes.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","readOnly":true},"entity_type":{"enum":["individual","company","non_profit","government","partnership","other"],"type":"string","description":"* `individual` - Individual\n* `company` - Company\n* `non_profit` - Non-Profit Organization\n* `government` - Government Entity\n* `partnership` - Partnership\n* `other` - Other"}},"required":["name"]},"QuoteItem":{"type":"object","description":"Serializer for quote line items.","properties":{"item_name":{"type":"string","readOnly":true},"quantity":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"unit_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"discount_percentage":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"Discount %"},"vat_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"VAT Rate (%)","description":"VAT/tax rate percentage for this line item"},"currency":{"type":"string","description":"Currency code (ISO 4217) for this line item","maxLength":3},"line_subtotal":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true},"line_vat_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true},"line_total":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true}},"required":["item_name","line_subtotal","line_total","line_vat_amount","quantity","unit_price"]},"FinancePersonMini":{"type":"object","description":"Lightweight serializer for Person model.\nUsed for nested person references in financial documents.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","readOnly":true}},"required":["full_name"]}}},"paths":{"/api/v1.0/organisation/{org_id}/quotes/{quote_id}/update/":{"patch":{"operationId":"organisation_quotes_update_partial_update","description":"Update an existing quote","summary":"Update quote","parameters":[{"in":"path","name":"org_id","schema":{"type":"string"},"required":true},{"in":"path","name":"quote_id","schema":{"type":"string"},"required":true}],"tags":["Quotes"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedQuoteRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedQuoteRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedQuoteRequest"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote"}}},"description":""},"400":{"description":"Bad Request"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}}}}}
```

## Perform quote action

> Perform an action on a quote using query parameter.\
> &#x20;   \
> &#x20;   \*\*Available Actions:\*\*\
> &#x20;   \- \`mark\_as\_draft\` - Mark a quote as draft\
> &#x20;   \- \`mark\_as\_sent\` - Mark a draft quote as sent to the client\
> &#x20;   \- \`mark\_as\_viewed\` - Mark a quote as viewed by the client\
> &#x20;   \- \`mark\_as\_accepted\` - Mark a quote as accepted by the client\
> &#x20;   \- \`mark\_as\_rejected\` - Mark a quote as rejected\
> &#x20;   \- \`mark\_as\_expired\` - Mark a quote as expired\
> &#x20;   \- \`duplicate\` - Create a duplicate of the quote\
> &#x20;   \- \`convert\_to\_invoice\` - Convert an accepted quote to an invoice (requires \`invoice\_number\` and \`due\_date\` parameters)\
> &#x20;   \
> &#x20;   \*\*Examples:\*\*\
> &#x20;   \- \`/quotes/{id}/action?action=mark\_as\_draft\`\
> &#x20;   \- \`/quotes/{id}/action?action=mark\_as\_sent\`\
> &#x20;   \- \`/quotes/{id}/action?action=mark\_as\_viewed\`\
> &#x20;   \- \`/quotes/{id}/action?action=mark\_as\_accepted\`\
> &#x20;   \- \`/quotes/{id}/action?action=mark\_as\_rejected\`\
> &#x20;   \- \`/quotes/{id}/action?action=mark\_as\_expired\`\
> &#x20;   \- \`/quotes/{id}/action?action=duplicate\`\
> &#x20;   \- \`/quotes/{id}/action?action=convert\_to\_invoice\&invoice\_number=INV-001\&due\_date=2025-12-31\`\
> &#x20;  &#x20;

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"tags":[{"name":"Quotes","description":"Sales quotes and estimates"}],"servers":[{"url":"https://skhokho.ai","description":"Production"},{"url":"http://102.209.118.152:8000/","description":"Local"},{"url":"https://dev.skhokho.ai","description":"Development"}],"security":[{"basicAuth":[]},{"cookieAuth":[]}],"components":{"securitySchemes":{"basicAuth":{"type":"http","scheme":"basic"},"cookieAuth":{"type":"apiKey","in":"cookie","name":"sessionid"}},"schemas":{"Quote":{"type":"object","description":"Comprehensive serializer for Quote model.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"title":{"type":"string"},"description":{"type":"string","nullable":true},"terms_and_conditions":{"type":"string","nullable":true},"notes":{"type":"string","nullable":true},"quote_number":{"type":"string","maxLength":100},"status":{"enum":["draft","sent","viewed","accepted","rejected","expired","converted"],"type":"string","description":"* `draft` - Draft\n* `sent` - Sent\n* `viewed` - Viewed by Client\n* `accepted` - Accepted\n* `rejected` - Rejected\n* `expired` - Expired\n* `converted` - Converted to Invoice"},"status_display":{"type":"string","readOnly":true},"quote_date":{"type":"string","format":"date"},"valid_until":{"type":"string","format":"date","nullable":true},"sent_date":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"subtotal":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true,"description":"Calculated from line items"},"total_tax_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true,"description":"Total VAT/tax from all line items"},"total_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true,"description":"Subtotal + Total Tax Amount"},"is_expired":{"type":"boolean","readOnly":true},"currency":{"type":"string","readOnly":true},"client":{"allOf":[{"$ref":"#/components/schemas/FinanceClientMini"}],"readOnly":true},"items":{"type":"array","items":{"$ref":"#/components/schemas/QuoteItem"}},"created_by":{"allOf":[{"$ref":"#/components/schemas/FinancePersonMini"}],"readOnly":true},"date_created":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"last_updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true}},"required":["client","created_by","currency","date_created","is_expired","last_updated","quote_number","sent_date","status_display","subtotal","title","total_amount","total_tax_amount"]},"FinanceClientMini":{"type":"object","description":"Lightweight serializer for Client model.\nUsed for nested client references in invoices and quotes.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","readOnly":true},"entity_type":{"enum":["individual","company","non_profit","government","partnership","other"],"type":"string","description":"* `individual` - Individual\n* `company` - Company\n* `non_profit` - Non-Profit Organization\n* `government` - Government Entity\n* `partnership` - Partnership\n* `other` - Other"}},"required":["name"]},"QuoteItem":{"type":"object","description":"Serializer for quote line items.","properties":{"item_name":{"type":"string","readOnly":true},"quantity":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"unit_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"discount_percentage":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"Discount %"},"vat_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"VAT Rate (%)","description":"VAT/tax rate percentage for this line item"},"currency":{"type":"string","description":"Currency code (ISO 4217) for this line item","maxLength":3},"line_subtotal":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true},"line_vat_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true},"line_total":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true}},"required":["item_name","line_subtotal","line_total","line_vat_amount","quantity","unit_price"]},"FinancePersonMini":{"type":"object","description":"Lightweight serializer for Person model.\nUsed for nested person references in financial documents.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","readOnly":true}},"required":["full_name"]},"Invoice":{"type":"object","description":"Comprehensive serializer for Invoice model.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"title":{"type":"string"},"description":{"type":"string","nullable":true},"invoice_number":{"type":"string","maxLength":100},"status":{"enum":["draft","sent","viewed","paid","partially_paid","overdue","cancelled","refunded"],"type":"string","description":"* `draft` - Draft\n* `sent` - Sent\n* `viewed` - Viewed by Client\n* `paid` - Paid\n* `partially_paid` - Partially Paid\n* `overdue` - Overdue\n* `cancelled` - Cancelled\n* `refunded` - Refunded"},"status_display":{"type":"string","readOnly":true},"invoice_date":{"type":"string","format":"date","nullable":true},"due_date":{"type":"string","format":"date"},"subtotal":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true,"description":"Calculated from line items"},"total_tax_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true,"description":"Total VAT/tax from all line items"},"total_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true,"description":"Subtotal + Total Tax Amount"},"paid_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"remaining_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true},"is_overdue":{"type":"boolean","readOnly":true},"currency":{"type":"string","readOnly":true},"client":{"allOf":[{"$ref":"#/components/schemas/FinanceClientMini"}],"readOnly":true},"items":{"type":"array","items":{"$ref":"#/components/schemas/InvoiceItem"}},"created_by":{"allOf":[{"$ref":"#/components/schemas/FinancePersonMini"}],"readOnly":true},"date_created":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"last_updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true}},"required":["client","created_by","currency","date_created","due_date","invoice_number","is_overdue","last_updated","remaining_amount","status_display","subtotal","title","total_amount","total_tax_amount"]},"InvoiceItem":{"type":"object","description":"Serializer for invoice line items.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"item_name":{"type":"string","readOnly":true},"quantity":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"unit_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"discount_percentage":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"Discount %"},"vat_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"VAT Rate (%)","description":"VAT/tax rate percentage for this line item"},"currency":{"type":"string","description":"Currency code (ISO 4217) for this line item","maxLength":3},"line_subtotal":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true},"line_vat_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true},"line_total":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true}},"required":["item_name","line_subtotal","line_total","line_vat_amount","quantity","unit_price"]}}},"paths":{"/api/v1.0/organisation/{org_id}/quotes/{quote_id}/action/":{"get":{"operationId":"organisation_quotes_action_retrieve","description":"Perform an action on a quote using query parameter.\n    \n    **Available Actions:**\n    - `mark_as_draft` - Mark a quote as draft\n    - `mark_as_sent` - Mark a draft quote as sent to the client\n    - `mark_as_viewed` - Mark a quote as viewed by the client\n    - `mark_as_accepted` - Mark a quote as accepted by the client\n    - `mark_as_rejected` - Mark a quote as rejected\n    - `mark_as_expired` - Mark a quote as expired\n    - `duplicate` - Create a duplicate of the quote\n    - `convert_to_invoice` - Convert an accepted quote to an invoice (requires `invoice_number` and `due_date` parameters)\n    \n    **Examples:**\n    - `/quotes/{id}/action?action=mark_as_draft`\n    - `/quotes/{id}/action?action=mark_as_sent`\n    - `/quotes/{id}/action?action=mark_as_viewed`\n    - `/quotes/{id}/action?action=mark_as_accepted`\n    - `/quotes/{id}/action?action=mark_as_rejected`\n    - `/quotes/{id}/action?action=mark_as_expired`\n    - `/quotes/{id}/action?action=duplicate`\n    - `/quotes/{id}/action?action=convert_to_invoice&invoice_number=INV-001&due_date=2025-12-31`\n    ","summary":"Perform quote action","parameters":[{"in":"query","name":"action","schema":{"type":"string","enum":["convert_to_invoice","duplicate","mark_as_accepted","mark_as_draft","mark_as_expired","mark_as_rejected","mark_as_sent","mark_as_viewed"]},"description":"The action to perform on the quote","required":true},{"in":"query","name":"due_date","schema":{"type":"string"},"description":"Payment due date in YYYY-MM-DD format (required when action=convert_to_invoice)"},{"in":"query","name":"invoice_date","schema":{"type":"string"},"description":"Invoice date in YYYY-MM-DD format (optional, defaults to today)"},{"in":"query","name":"invoice_number","schema":{"type":"string"},"description":"Invoice number (required when action=convert_to_invoice)"},{"in":"path","name":"org_id","schema":{"type":"string"},"required":true},{"in":"path","name":"quote_id","schema":{"type":"string"},"required":true}],"tags":["Quotes"],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote"}}},"description":""},"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice"}}},"description":""},"400":{"description":"Bad Request - Invalid action or missing required parameters"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}}}}}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.skhokho.ai/finance/quotes.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
