Quote data model

Updated:

View field support, webhooks, and list parameters for each integration on the Supported Integrations page.

FieldTypeRequiredDescription
idstringNo
created_atstring (date-time)No(ISO-8601 / YYYY-MM-DDTHH:MM:SSZ format)
updated_atstring (date-time)No(ISO-8601 / YYYY-MM-DDTHH:MM:SSZ format)
quote_numberstringNoExternal identifier for this quote (Xero QuoteNumber, QBO DocNumber, NetSuite tranId)
referencestringNocustomer-side reference / PO number
titlestringNoshort title (Xero Title, max 100)
summarystringNolonger summary (Xero Summary, max 3000)
payment_termsenumNounified payment terms enum, as on accounting_invoice / accounting_bill Values: ON_RECEIPT, NET_7, NET_10, NET_15, NET_20, NET_25, NET_30, NET_45, NET_60, NET_90, OTHER
customer_messagestringNocustomer-visible message
memostringNointernal note, not customer-visible
contact_idstringNo(reference to AccountingContact)
contactsAccountingTransactionContact[]Nodenormalized parties, reusing the transaction contact shape
contacts[].idstringYes
contacts[].is_customerbooleanNo
contacts[].is_supplierbooleanNo
issued_atstring (date-time)NoXero Date, QBO TxnDate (ISO-8601 / YYYY-MM-DDTHH:MM:SSZ format)
expires_atstring (date-time)NoXero ExpiryDate, QBO ExpirationDate (ISO-8601 / YYYY-MM-DDTHH:MM:SSZ format)
sent_atstring (date-time)No(ISO-8601 / YYYY-MM-DDTHH:MM:SSZ format)
accepted_atstring (date-time)No(ISO-8601 / YYYY-MM-DDTHH:MM:SSZ format)
declined_atstring (date-time)No(ISO-8601 / YYYY-MM-DDTHH:MM:SSZ format)
statusenumNowhere EXPIRED is derived (expires_at < now), the source status is preserved in raw Values: DRAFT, SENT, ACCEPTED, DECLINED, INVOICED, EXPIRED, VOIDED, DELETED
currencystringNo
currency_ratenumberNoexchange rate to the organization's base currency
sub_total_amountnumberNo
tax_amountnumberNo
discount_amountnumberNo
total_amountnumberNo
tax_modeenumNoINCLUSIVE / EXCLUSIVE / NONE; maps Xero LineAmountTypes (a boolean cannot represent NoTax) Values: INCLUSIVE, EXCLUSIVE, NONE
lineitemsAccountingLineitem[]No
lineitems[].idstringNo
lineitems[].created_atstring (date-time)No(ISO-8601 / YYYY-MM-DDTHH:MM:SSZ format)
lineitems[].updated_atstring (date-time)No(ISO-8601 / YYYY-MM-DDTHH:MM:SSZ format)
lineitems[].refunded_atstring (date-time)No(ISO-8601 / YYYY-MM-DDTHH:MM:SSZ format)
lineitems[].total_amountnumberNounit_quantity * unit_amount + tax_amount
lineitems[].refund_amountnumberNo
lineitems[].discount_amountnumberNo
lineitems[].tax_amountnumberNo
lineitems[].item_idstringNo(reference to CommerceItem)
lineitems[].unit_amountnumberNo
lineitems[].unit_quantitynumberNo
lineitems[].item_skustringNo
lineitems[].item_namestringNo
lineitems[].item_descriptionstringNo
lineitems[].notesstringNo
lineitems[].taxrate_idstringNo
lineitems[].account_idstringNo(reference to AccountingAccount)
lineitems[].category_idsstring[]No(reference to AccountingCategory)
lineitems[].locationsAccountingReference[]No
lineitems[].locations[].idstringNo
lineitems[].locations[].namestringNo
lineitems[].item_variantsAccountingReference[]No
lineitems[].item_variants[].idstringNo
lineitems[].item_variants[].namestringNo
lineitems[].feesAccountingFee[]No
lineitems[].fees[].typeenumYesUnified fee category Values: TAX, DISCOUNT, PROMOTION, SHIPPING, GIFT_WRAP, COD, SURCHARGE, TIP, SERVICE_CHARGE, OTHER
lineitems[].fees[].original_typestringNoThe provider's original fee label, e.g. "VAT" or a shipping carrier name
lineitems[].fees[].amountnumberYes
lineitems[].fees[].currencystringNoISO 4217 currency code, e.g. USD
lineitems[].contact_idstringNo(reference to AccountingContact)
lineitems[].project_idstringNoref -> AccountingProject; the project this line is coded to (reference to TaskProject)
lineitems[].exchange_ratenumberNoThe exchange rate applied to this line, for multi-currency documents
lineitems[].is_billablebooleanNoTrue when the line is rebillable to a customer
invoice_idstringNopopulated once the quote is converted to an invoice; left null when the source cannot supply it (reference to AccountingInvoice)
project_idstringNopoints to an AccountingProject (accounting costing project) (reference to TaskProject)
group_idstringNopoints to a HRIS Group (reference to HrisGroup)
category_idsstring[]Notracking categories / classes (AccountingCategory dimensions)
urlstringNopublic online-quote link where exposed
organization_idstringNo
metadataAccountingMetadata[]No
metadata[].idstringNoThe ID of the custom field definition (from the metadata/metadata endpoint).
metadata[].slugstringNoThe integration's API name (key) of an existing custom field. List valid slugs for this object with the metadata/metadata endpoint; unknown slugs are rejected by the integration.
metadata[].valueobjectNoThe field's value, typed by format: DATE as ISO-8601 (YYYY-MM-DD, or YYYY-MM-DDTHH:MM:SSZ for date-times); NUMBER, PRICE and CURRENCY as a number; BOOLEAN and YES_NO as true/false; MULTIPLE_SELECT as an array of option values; otherwise a string.
metadata[].namespacestringNo
metadata[].formatenumNoThe data type of the custom field, which determines how value is formatted. Values: TEXT, NUMBER, DATE, BOOLEAN, FILE, TEXTAREA, SINGLE_SELECT, MULTIPLE_SELECT, MEASUREMENT, PRICE, YES_NO, CURRENCY, URL
metadata[].extra_dataobjectNo

TypeScript

TypeScript
export type AccountingQuote = {
	id?: string;
	created_at?: string-time; // (ISO-8601 / YYYY-MM-DDTHH:MM:SSZ format)
	updated_at?: string-time; // (ISO-8601 / YYYY-MM-DDTHH:MM:SSZ format)
	quote_number?: string; // External identifier for this quote (Xero QuoteNumber, QBO DocNumber, NetSuite tranId)
	reference?: string; // customer-side reference / PO number
	title?: string; // short title (Xero Title, max 100)
	summary?: string; // longer summary (Xero Summary, max 3000)
	payment_terms?: 'ON_RECEIPT' | 'NET_7' | 'NET_10' | 'NET_15' | 'NET_20' | 'NET_25' | 'NET_30' | 'NET_45' | 'NET_60' | 'NET_90' | 'OTHER'; // unified payment terms enum, as on accounting_invoice / accounting_bill
	customer_message?: string; // customer-visible message
	memo?: string; // internal note, not customer-visible
	contact_id?: string; // (reference to AccountingContact)
	contacts?: []; // denormalized parties, reusing the transaction contact shape
	issued_at?: string-time; // Xero Date, QBO TxnDate (ISO-8601 / YYYY-MM-DDTHH:MM:SSZ format)
	expires_at?: string-time; // Xero ExpiryDate, QBO ExpirationDate (ISO-8601 / YYYY-MM-DDTHH:MM:SSZ format)
	sent_at?: string-time; // (ISO-8601 / YYYY-MM-DDTHH:MM:SSZ format)
	accepted_at?: string-time; // (ISO-8601 / YYYY-MM-DDTHH:MM:SSZ format)
	declined_at?: string-time; // (ISO-8601 / YYYY-MM-DDTHH:MM:SSZ format)
	status?: 'DRAFT' | 'SENT' | 'ACCEPTED' | 'DECLINED' | 'INVOICED' | 'EXPIRED' | 'VOIDED' | 'DELETED'; // where EXPIRED is derived (expires_at < now), the source status is preserved in raw
	currency?: string;
	currency_rate?: number; // exchange rate to the organization's base currency
	sub_total_amount?: number;
	tax_amount?: number;
	discount_amount?: number;
	total_amount?: number;
	tax_mode?: 'INCLUSIVE' | 'EXCLUSIVE' | 'NONE'; // INCLUSIVE / EXCLUSIVE / NONE; maps Xero LineAmountTypes (a boolean cannot represent NoTax)
	lineitems?: [];
	invoice_id?: string; // populated once the quote is converted to an invoice; left null when the source cannot supply it (reference to AccountingInvoice)
	project_id?: string; // points to an AccountingProject (accounting costing project) (reference to TaskProject)
	group_id?: string; // points to a HRIS Group (reference to HrisGroup)
	category_ids?: string[]; // tracking categories / classes (AccountingCategory dimensions)
	url?: string; // public online-quote link where exposed
	organization_id?: string;
	metadata?: [];
	raw?: any;
} 

Zod

Zod
import { z } from 'zod';

export const ZodAccountingQuote = z.object({
	id: z.string().optional(),
	created_at: z.string-time().optional().describe("(ISO-8601 / YYYY-MM-DDTHH:MM:SSZ format)"),
	updated_at: z.string-time().optional().describe("(ISO-8601 / YYYY-MM-DDTHH:MM:SSZ format)"),
	quote_number: z.string().optional().describe("External identifier for this quote (Xero QuoteNumber, QBO DocNumber, NetSuite tranId)"),
	reference: z.string().optional().describe("customer-side reference / PO number"),
	title: z.string().optional().describe("short title (Xero Title, max 100)"),
	summary: z.string().optional().describe("longer summary (Xero Summary, max 3000)"),
	payment_terms: z.enum("ON_RECEIPT", "NET_7", "NET_10", "NET_15", "NET_20", "NET_25", "NET_30", "NET_45", "NET_60", "NET_90", "OTHER").optional().describe("unified payment terms enum, as on accounting_invoice / accounting_bill"),
	customer_message: z.string().optional().describe("customer-visible message"),
	memo: z.string().optional().describe("internal note, not customer-visible"),
	contact_id: z.string().optional().describe("(reference to AccountingContact)"),
	contacts: z.array().optional().describe("denormalized parties, reusing the transaction contact shape"),
	issued_at: z.string-time().optional().describe("Xero Date, QBO TxnDate (ISO-8601 / YYYY-MM-DDTHH:MM:SSZ format)"),
	expires_at: z.string-time().optional().describe("Xero ExpiryDate, QBO ExpirationDate (ISO-8601 / YYYY-MM-DDTHH:MM:SSZ format)"),
	sent_at: z.string-time().optional().describe("(ISO-8601 / YYYY-MM-DDTHH:MM:SSZ format)"),
	accepted_at: z.string-time().optional().describe("(ISO-8601 / YYYY-MM-DDTHH:MM:SSZ format)"),
	declined_at: z.string-time().optional().describe("(ISO-8601 / YYYY-MM-DDTHH:MM:SSZ format)"),
	status: z.enum("DRAFT", "SENT", "ACCEPTED", "DECLINED", "INVOICED", "EXPIRED", "VOIDED", "DELETED").optional().describe("where EXPIRED is derived (expires_at < now), the source status is preserved in raw"),
	currency: z.string().optional(),
	currency_rate: z.number().optional().describe("exchange rate to the organization's base currency"),
	sub_total_amount: z.number().optional(),
	tax_amount: z.number().optional(),
	discount_amount: z.number().optional(),
	total_amount: z.number().optional(),
	tax_mode: z.enum("INCLUSIVE", "EXCLUSIVE", "NONE").optional().describe("INCLUSIVE / EXCLUSIVE / NONE; maps Xero LineAmountTypes (a boolean cannot represent NoTax)"),
	lineitems: z.array().optional(),
	invoice_id: z.string().optional().describe("populated once the quote is converted to an invoice; left null when the source cannot supply it (reference to AccountingInvoice)"),
	project_id: z.string().optional().describe("points to an AccountingProject (accounting costing project) (reference to TaskProject)"),
	group_id: z.string().optional().describe("points to a HRIS Group (reference to HrisGroup)"),
	category_ids: z.array().optional().describe("tracking categories / classes (AccountingCategory dimensions)"),
	url: z.string().optional().describe("public online-quote link where exposed"),
	organization_id: z.string().optional(),
	metadata: z.array().optional(),

});

Python

Python
import dataclasses

@dataclasses.dataclass
class AccountingQuotePayment_terms(str, Enum):
	ON_RECEIPT = 'ON_RECEIPT'
	NET_7 = 'NET_7'
	NET_10 = 'NET_10'
	NET_15 = 'NET_15'
	NET_20 = 'NET_20'
	NET_25 = 'NET_25'
	NET_30 = 'NET_30'
	NET_45 = 'NET_45'
	NET_60 = 'NET_60'
	NET_90 = 'NET_90'
	OTHER = 'OTHER'

@dataclasses.dataclass
class AccountingQuoteStatus(str, Enum):
	DRAFT = 'DRAFT'
	SENT = 'SENT'
	ACCEPTED = 'ACCEPTED'
	DECLINED = 'DECLINED'
	INVOICED = 'INVOICED'
	EXPIRED = 'EXPIRED'
	VOIDED = 'VOIDED'
	DELETED = 'DELETED'

@dataclasses.dataclass
class AccountingQuoteTax_mode(str, Enum):
	INCLUSIVE = 'INCLUSIVE'
	EXCLUSIVE = 'EXCLUSIVE'
	NONE = 'NONE'

@dataclasses.dataclass
class AccountingQuote:
	id: Optional[str]
	"""(ISO-8601 / YYYY-MM-DDTHH:MM:SSZ format)"""
	created_at: Optional[str]
	"""(ISO-8601 / YYYY-MM-DDTHH:MM:SSZ format)"""
	updated_at: Optional[str]
	"""External identifier for this quote (Xero QuoteNumber, QBO DocNumber, NetSuite tranId)"""
	quote_number: Optional[str]
	"""customer-side reference / PO number"""
	reference: Optional[str]
	"""short title (Xero Title, max 100)"""
	title: Optional[str]
	"""longer summary (Xero Summary, max 3000)"""
	summary: Optional[str]
	"""unified payment terms enum, as on accounting_invoice / accounting_bill"""
	payment_terms: Optional[AccountingQuotePayment_terms]
	"""customer-visible message"""
	customer_message: Optional[str]
	"""internal note, not customer-visible"""
	memo: Optional[str]
	"""(reference to AccountingContact)"""
	contact_id: Optional[str]
	"""denormalized parties, reusing the transaction contact shape"""
	contacts: Optional[PropertyAccountingQuoteContacts]
	"""Xero Date, QBO TxnDate (ISO-8601 / YYYY-MM-DDTHH:MM:SSZ format)"""
	issued_at: Optional[str]
	"""Xero ExpiryDate, QBO ExpirationDate (ISO-8601 / YYYY-MM-DDTHH:MM:SSZ format)"""
	expires_at: Optional[str]
	"""(ISO-8601 / YYYY-MM-DDTHH:MM:SSZ format)"""
	sent_at: Optional[str]
	"""(ISO-8601 / YYYY-MM-DDTHH:MM:SSZ format)"""
	accepted_at: Optional[str]
	"""(ISO-8601 / YYYY-MM-DDTHH:MM:SSZ format)"""
	declined_at: Optional[str]
	"""where EXPIRED is derived (expires_at < now), the source status is preserved in raw"""
	status: Optional[AccountingQuoteStatus]
	currency: Optional[str]
	"""exchange rate to the organization's base currency"""
	currency_rate: Optional[int]
	sub_total_amount: Optional[int]
	tax_amount: Optional[int]
	discount_amount: Optional[int]
	total_amount: Optional[int]
	"""INCLUSIVE / EXCLUSIVE / NONE; maps Xero LineAmountTypes (a boolean cannot represent NoTax)"""
	tax_mode: Optional[AccountingQuoteTax_mode]
	lineitems: Optional[PropertyAccountingQuoteLineitems]
	"""populated once the quote is converted to an invoice; left null when the source cannot supply it (reference to AccountingInvoice)"""
	invoice_id: Optional[str]
	"""points to an AccountingProject (accounting costing project) (reference to TaskProject)"""
	project_id: Optional[str]
	"""points to a HRIS Group (reference to HrisGroup)"""
	group_id: Optional[str]
	"""tracking categories / classes (AccountingCategory dimensions)"""
	category_ids: Optional[List[List[str]]]
	"""public online-quote link where exposed"""
	url: Optional[str]
	organization_id: Optional[str]
	metadata: Optional[PropertyAccountingQuoteMetadata]
Are we missing anything? Let us know
Was this page helpful?