| companyId | string · required | The company to create the record in. Required for token auth. |
| firstName | string · required | Customer's first name. |
| lastName | string · required | Customer's last name. |
| emailAddress | string · required | Stored lower-cased, and checked against the existing customers in the company. Must be in [email protected] form. |
| middleName | string | Included in fullName when present. |
| phoneNumber | string | Digits, spaces and the characters - + ( ) only. Stored as sent — no reformatting. |
| company | string | Business name. The field is company; companyName is not recognised and is dropped without an error. |
| address | object | Billing address, and the one formattedAddress is built from. Every sub-field is optional. |
| address.address1 | string | Street address. |
| address.address2 | string | Unit, suite or floor. |
| address.city | string | City. |
| address.province | string | Province or state. Free text — the portal writes the full name, e.g. British Columbia, not a code. |
| address.postalCode | string | Postal or ZIP code. Stored upper-cased. |
| address.country | string | Country. Free text — the portal writes the full name, e.g. Canada, not an ISO code. |
| shippingAddress | object | Where goods go when that differs from billing. Same six sub-fields, stored independently — setting one address never populates the other. |
| shippingAddress.address1 | string | Street address. |
| shippingAddress.address2 | string | Unit, suite or floor. |
| shippingAddress.city | string | City. |
| shippingAddress.province | string | Province or state, as a full name. |
| shippingAddress.postalCode | string | Postal or ZIP code. Stored upper-cased. |
| shippingAddress.country | string | Country, as a full name. |
| integrations.quickbooks.displayName | string | The name QuickBooks matches this customer on. Left blank, an export falls back to company, or to the full name when there is no company. |
| integrations.quickbooks.customerNumber | string | Your QuickBooks customer number. |
| contacts | array | Secondary contacts at this business. The customer's own name and email stay the primary contact and are never repeated here. Sending contacts replaces the whole list — a row you leave out is deleted. |
| contacts[].contactId | string | Server-generated, 12 alphanumeric characters. Omit it on a new contact; send it back unchanged when editing, or the contact is treated as a new person and any invoice or quote pointing at it falls back to its stored snapshot. |
| contacts[].firstName | string · required | Contact's first name. |
| contacts[].lastName | string · required | Contact's last name. |
| contacts[].emailAddress | string · required | Stored lower-cased. Rows with no email address are dropped. |
| contacts[].phoneNumber | string | Same format rules as the customer's own phone number. |
| contacts[].jobTitle | string | Free text, e.g. Accounts Payable. |
| contacts[].notes | string | Free text note about this contact. |
| forceCreate | boolean | Skip both duplicate-email checks and create the record anyway. A control flag — it is not stored on the customer. |