## Create or update a customer **post** `/customers` Creates a new customer or updates an existing one based on the provided information. **Upsert Logic:** 1. If `id` is provided, updates the customer with that ID 1. If no `id` but phone/email provided, searches for existing customer by phone first, then email 1. If no existing customer found, creates a new customer Tags are merged (not replaced) when updating. ### Header Parameters - `"rotor-api-version": "1.1.0"` - `"1.1.0"` ### Body Parameters - `id: optional string` Optional — provide to update an existing customer - `billing_city: optional string` - `billing_country: optional string` - `billing_same_as_property: optional boolean` - `billing_state: optional string` - `billing_street1: optional string` - `billing_street2: optional string` - `billing_zip: optional string` - `company_name: optional string` - `email: optional string` - `first_name: optional string` - `last_name: optional string` - `notes: optional string` - `phone: optional string` - `property_city: optional string` - `property_country: optional string` - `property_state: optional string` - `property_street1: optional string` - `property_street2: optional string` - `property_zip: optional string` - `service_frequency: optional string` - `service_type: optional string` - `source: optional string` - `status: optional "active" or "inactive"` - `"active"` - `"inactive"` - `tags: optional array of string` ### Returns - `id: optional string` - `billing_city: optional string` - `billing_country: optional string` - `billing_same_as_property: optional boolean` - `billing_state: optional string` - `billing_street1: optional string` - `billing_street2: optional string` - `billing_zip: optional string` - `company_name: optional string` - `created_at: optional string` - `email: optional string` - `first_name: optional string` - `last_name: optional string` - `message: optional string` - `notes: optional string` - `phone: optional string` - `property_city: optional string` - `property_country: optional string` - `property_state: optional string` - `property_street1: optional string` - `property_street2: optional string` - `property_zip: optional string` - `service_frequency: optional string` - `service_type: optional string` - `source: optional string` - `status: optional "active" or "inactive"` - `"active"` - `"inactive"` - `tags: optional array of string` ### Example ```http curl https://api.getrotor.com/open-api/customers \ -H 'Content-Type: application/json' \ -H "x-api-key: $ROTOR_API_KEY" \ -d '{}' ``` #### Response ```json { "id": "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e", "billing_city": "billing_city", "billing_country": "billing_country", "billing_same_as_property": true, "billing_state": "billing_state", "billing_street1": "billing_street1", "billing_street2": "billing_street2", "billing_zip": "billing_zip", "company_name": "company_name", "created_at": "2019-12-27T18:11:19.117Z", "email": "dev@stainless.com", "first_name": "first_name", "last_name": "last_name", "message": "Customer created successfully", "notes": "notes", "phone": "phone", "property_city": "property_city", "property_country": "property_country", "property_state": "property_state", "property_street1": "property_street1", "property_street2": "property_street2", "property_zip": "property_zip", "service_frequency": "service_frequency", "service_type": "service_type", "source": "source", "status": "active", "tags": [ "string" ] } ```