# Create Estimate Creates a new quote, proforma or fees_note. Endpoint: POST /{estimates-type}.json Version: 2.0.0 Security: apiKeyAuth ## Query parameters: - `api_key` (string, required) Your API Key. Example: "YOUR_API_KEY" ## Path parameters: - `estimates-type` (string, required) The type of the estimate document. Enum: "quotes", "proformas", "fees_notes" ## Request fields (application/json): - `quote` (object, required) - `quote.date` (string, required) dd/mm/yyyy Example: "22/11/2025" - `quote.due_date` (string) dd/mm/yyyy. Defaults to date when omitted. Example: "22/12/2025" - `quote.reference` (string) Example: "PO-999" - `quote.observations` (string) No enforced character limit (text column). Example: "Services rendered" - `quote.retention` (string) Example: "0" - `quote.tax_exemption` (string) Example: "M00" - `quote.sequence_id` (string) Example: "123456" - `quote.manual_sequence_number` (string) 255-character limit is the database column default, not an explicit business rule. - `quote.client` (object) Optional. When omitted, the document is issued to the generic Consumidor Final client. - `quote.client.id` (integer) Internal client ID. Preferred way to identify an existing client — see schema description. Example: 1310176 - `quote.client.name` (string) Example: "Client A" - `quote.client.code` (string) Maximum length is the database default, not a business rule. Example: "CLI-001" - `quote.client.email` (string) Example: "client@mail.com" - `quote.client.address` (string) No enforced character limit. Example: "Street A" - `quote.client.city` (string) Maximum length is the database default, not a business rule. Example: "Lisbon" - `quote.client.postal_code` (string) Maximum length is the database default, not a business rule. Example: "1000-100" - `quote.client.fiscal_id` (string) Maximum length is the database default, not a business rule. Example: "500999888" - `quote.client.country` (string) Maximum length is the database default, not a business rule. Example: "Portugal" - `quote.client.website` (string) Example: "www.client-a.com" - `quote.client.phone` (string) Example: "912345678" - `quote.client.fax` (string) Example: "212345678" - `quote.client.observations` (string) No enforced character limit. Example: "VIP Client" - `quote.items` (array, required) - `quote.items.name` (string, required) Maximum 60 characters. V3 rejects a longer name with HTTP 422; V2 accepts the request and silently truncates the stored value to 60 characters. Example: "Consulting" - `quote.items.description` (string) Maximum 200 characters and 20 lines. V3 rejects a longer description with HTTP 422; V2 accepts the request and silently truncates the stored value to 200 characters. Example: "IT Services" - `quote.items.unit_price` (number, required) Example: 50 - `quote.items.quantity` (number, required) Example: 2 - `quote.items.unit` (string) One of a fixed set of supported unit values. Example: "hour" - `quote.items.discount` (number) - `quote.items.tax` (object) - `quote.items.tax.name` (string) Defaults to 255 characters at the database level. Example: "IVA23" - `quote.mb_reference` (string) Enum: "0", "1" - `quote.auto_add_related_document` (string) Example: "0" - `quote.tax_exemption_reason` (string) Validated at 210 characters by the document model, below the 255-character database column limit. Example: "M00" ## Response 201 fields (application/json): - `quote` (object) - `quote.id` (integer) Example: 541791 - `quote.status` (string) Example: "final" - `quote.archived` (boolean) - `quote.type` (string) Enum: "Quote", "Proforma", "FeesNote" - `quote.sequence_number` (string) Example: "1/A" - `quote.inverted_sequence_number` (string) Example: "A/1" - `quote.atcud` (string) Example: "ABCD1234-1" - `quote.date` (string) Example: "12/06/2017" - `quote.due_date` (string) Example: "12/06/2017" - `quote.reference` (string,null) - `quote.observations` (string,null) No enforced character limit (text column). Example: "foo" - `quote.retention` (string,null) - `quote.permalink` (string) Example: "https://web.invoicexpress.com/documents/541791f16ae45a73b703c684a221ef198c10020f3d56a1" - `quote.saft_hash` (string) Server-generated. No enforced character limit (text column). Example: "NfTN" - `quote.sum` (number) Example: 10 - `quote.discount` (number) - `quote.before_taxes` (number) Example: 10 - `quote.taxes` (number) Example: 2.3 - `quote.total` (number) Example: 12.3 - `quote.currency` (string) Example: "Euro" - `quote.sequence_id` (integer,null) Example: 12345 - `quote.tax_exemption` (string) Example: "M01" - `quote.cancel_reason` (string) Only present when the document is canceled. Example: "Wrong client" - `quote.mb_reference` (object) Only present when the document is final and has an MB reference. - `quote.mb_reference.entity` (string) Example: "10611" - `quote.mb_reference.value` (number) Example: 123.45 - `quote.multicurrency` (object) Only present for documents in a foreign currency. - `quote.multicurrency.rate` (number) Example: 1.1 - `quote.client` (object) id and name are always present. The other fields are only returned when they have a value. - `quote.client.name` (string) Example: "John Doe" - `quote.client.code` (string) Example: "C1" - `quote.client.country` (string) Example: "Portugal" - `quote.client.email` (string) Example: "john@example.com" - `quote.client.address` (string) Example: "Avenida da República" - `quote.client.postal_code` (string) Example: "1050-555" - `quote.client.city` (string) Example: "Lisboa" - `quote.client.fiscal_id` (string) Example: "508025338" - `quote.client.website` (string) Example: "www.example.com" - `quote.client.phone` (string) Example: "910000000" - `quote.client.fax` (string) Example: "210000000" - `quote.client.observations` (string) Example: "VIP client" - `quote.items` (array) - `quote.items.description` (string,null) Example: "Big Product" - `quote.items.unit_price` (string) Example: "100.0" - `quote.items.quantity` (string) Example: "1.0" - `quote.items.unit` (string) Example: "un" - `quote.items.tax` (object) - `quote.items.subtotal` (number) Example: 100 - `quote.items.tax_amount` (number) Example: 23 - `quote.items.discount_amount` (number) ## Response 401 fields (application/json): - `errors` (array) - `errors.error` (string) Example: "Authentication Error" ## Response 422 fields (application/json): - `errors` (array) Example: [{"error":"Date can't be blank"},{"error":"This document is being saved by another request. Please try again."}] - `errors.error` (string)