openapi: 3.0.3 info: title: SmartMoving Open API description: >- The SmartMoving Open API lets moving companies read and write the core objects of their SmartMoving CRM and operations platform - customers, opportunities (quotes / estimates), leads, jobs (booked moves), payments, and follow-ups. The Open API is fronted by Azure API Management and is available to Growth Plan customers in two tiers: Basic (read-only, for reporting and analytics) and Premium (read/write plus webhooks, for full integration and automation). All Open API requests authenticate with an x-api-key header issued at Settings > Integrations > SmartMoving API; the Azure gateway may additionally require an Ocp-Apim-Subscription-Key. A separate, free Lead Provider API (POST /leads/from-provider/v2) is available on every SmartMoving plan and authenticates with a per-source providerKey query parameter instead of the Open API key; it is included here for completeness. Endpoints under Customers, Opportunities, Leads, and Jobs are confirmed against SmartMoving's documentation and community SDKs. Reference-data endpoints for branches, users, service types, and referral sources are modeled from the documented data model and marked with x-endpoint-status; verify exact paths and shapes in the SmartMoving Developer Portal. version: '1.0' contact: name: SmartMoving url: https://www.smartmoving.com license: name: Proprietary url: https://www.smartmoving.com/terms servers: - url: https://api.smartmoving.com/api description: SmartMoving Open API (production) security: - apiKeyAuth: [] tags: - name: Customers description: Customer (contact / account) records. - name: Opportunities description: Sales opportunities - quotes and estimates. - name: Leads description: Sales pipeline leads and their statuses. - name: Lead Provider description: Inbound lead intake from websites and third-party providers. - name: Jobs description: Jobs (booked moves) attached to opportunities. - name: Reference Data description: Account lookup data - branches, users, service types, referral sources. paths: /customers: get: operationId: listCustomers tags: - Customers summary: List customers description: Lists customers in the account with pagination. x-endpoint-status: confirmed parameters: - $ref: '#/components/parameters/Page' - $ref: '#/components/parameters/PageSize' responses: '200': description: A paged list of customers. content: application/json: schema: $ref: '#/components/schemas/CustomerList' '401': $ref: '#/components/responses/Unauthorized' post: operationId: createCustomer tags: - Customers summary: Create a customer (Premium) description: Creates a new customer. Requires the Premium (read/write) tier. x-endpoint-status: confirmed requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/Customer' responses: '201': description: The created customer. content: application/json: schema: $ref: '#/components/schemas/Customer' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' /customers/search: get: operationId: searchCustomers tags: - Customers summary: Search customers (Premium) description: Searches customers by a free-text query. x-endpoint-status: confirmed parameters: - name: query in: query required: true schema: type: string description: Free-text search term matched against customer fields. - $ref: '#/components/parameters/Page' - $ref: '#/components/parameters/PageSize' responses: '200': description: Matching customers. content: application/json: schema: $ref: '#/components/schemas/CustomerList' '401': $ref: '#/components/responses/Unauthorized' /customers/{id}: parameters: - $ref: '#/components/parameters/IdPath' get: operationId: getCustomer tags: - Customers summary: Retrieve a customer description: Retrieves a single customer by ID. x-endpoint-status: confirmed responses: '200': description: The requested customer. content: application/json: schema: $ref: '#/components/schemas/Customer' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' put: operationId: updateCustomer tags: - Customers summary: Update a customer (Premium) description: Updates an existing customer. Requires the Premium tier. x-endpoint-status: confirmed requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/Customer' responses: '200': description: The updated customer. content: application/json: schema: $ref: '#/components/schemas/Customer' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' /customers/{id}/opportunities: parameters: - $ref: '#/components/parameters/IdPath' get: operationId: listCustomerOpportunities tags: - Customers summary: List a customer's opportunities description: Lists the opportunities (quotes / estimates) belonging to a customer. x-endpoint-status: confirmed responses: '200': description: The customer's opportunities. content: application/json: schema: type: array items: $ref: '#/components/schemas/Opportunity' '401': $ref: '#/components/responses/Unauthorized' /customers/{id}/storage-accounts: parameters: - $ref: '#/components/parameters/IdPath' get: operationId: listCustomerStorageAccounts tags: - Customers summary: List a customer's storage accounts description: Lists the storage accounts associated with a customer. x-endpoint-status: confirmed responses: '200': description: The customer's storage accounts. content: application/json: schema: type: array items: type: object '401': $ref: '#/components/responses/Unauthorized' /opportunities/{id}: parameters: - $ref: '#/components/parameters/IdPath' get: operationId: getOpportunity tags: - Opportunities summary: Retrieve an opportunity description: Retrieves an opportunity (quote / estimate) by ID. x-endpoint-status: confirmed responses: '200': description: The requested opportunity. content: application/json: schema: $ref: '#/components/schemas/Opportunity' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /opportunities/quote/{quoteNumber}: parameters: - name: quoteNumber in: path required: true schema: type: string description: The human-facing quote number. get: operationId: getOpportunityByQuote tags: - Opportunities summary: Retrieve an opportunity by quote number description: Retrieves an opportunity by its quote number. x-endpoint-status: confirmed responses: '200': description: The matching opportunity. content: application/json: schema: $ref: '#/components/schemas/Opportunity' '404': $ref: '#/components/responses/NotFound' /opportunities/{id}/payments: parameters: - $ref: '#/components/parameters/IdPath' get: operationId: listOpportunityPayments tags: - Opportunities summary: List an opportunity's payments description: Lists payments recorded against an opportunity. x-endpoint-status: confirmed responses: '200': description: The opportunity's payments. content: application/json: schema: type: array items: $ref: '#/components/schemas/Payment' '401': $ref: '#/components/responses/Unauthorized' /opportunities/{id}/follow-ups: parameters: - $ref: '#/components/parameters/IdPath' get: operationId: listOpportunityFollowUps tags: - Opportunities summary: List an opportunity's follow-ups (Premium) description: Lists follow-up tasks recorded against an opportunity. x-endpoint-status: confirmed responses: '200': description: The opportunity's follow-ups. content: application/json: schema: type: array items: type: object '401': $ref: '#/components/responses/Unauthorized' post: operationId: createOpportunityFollowUp tags: - Opportunities summary: Create an opportunity follow-up (Premium) description: Creates a follow-up task against an opportunity. Requires the Premium tier. x-endpoint-status: confirmed requestBody: required: true content: application/json: schema: type: object responses: '201': description: The created follow-up. content: application/json: schema: type: object '403': $ref: '#/components/responses/Forbidden' /opportunities/{id}/jobs: parameters: - $ref: '#/components/parameters/IdPath' get: operationId: listOpportunityJobs tags: - Jobs summary: List an opportunity's jobs description: Lists the jobs (booked moves) associated with an opportunity. x-endpoint-status: confirmed responses: '200': description: The opportunity's jobs. content: application/json: schema: type: array items: $ref: '#/components/schemas/Job' '401': $ref: '#/components/responses/Unauthorized' post: operationId: createJob tags: - Jobs summary: Create a job (Premium) description: Creates a job (booked move) against an opportunity. Requires the Premium tier. x-endpoint-status: confirmed requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/Job' responses: '201': description: The created job. content: application/json: schema: $ref: '#/components/schemas/Job' '403': $ref: '#/components/responses/Forbidden' /jobs/{id}: parameters: - $ref: '#/components/parameters/IdPath' delete: operationId: deleteJob tags: - Jobs summary: Delete a job (Premium) description: Deletes a job by ID. Requires the Premium tier. x-endpoint-status: confirmed responses: '204': description: The job was deleted. '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' /leads: get: operationId: listLeads tags: - Leads summary: List leads description: Lists leads in the account with pagination. x-endpoint-status: confirmed parameters: - $ref: '#/components/parameters/Page' - $ref: '#/components/parameters/PageSize' responses: '200': description: A paged list of leads. content: application/json: schema: $ref: '#/components/schemas/LeadList' '401': $ref: '#/components/responses/Unauthorized' /leads/{id}: parameters: - $ref: '#/components/parameters/IdPath' get: operationId: getLead tags: - Leads summary: Retrieve a lead description: Retrieves a single lead by ID. x-endpoint-status: confirmed responses: '200': description: The requested lead. content: application/json: schema: $ref: '#/components/schemas/Lead' '404': $ref: '#/components/responses/NotFound' /leads/statuses: get: operationId: listLeadStatuses tags: - Leads summary: List lead statuses description: Lists the lead statuses configured for the account. x-endpoint-status: confirmed responses: '200': description: The available lead statuses. content: application/json: schema: type: array items: type: object '401': $ref: '#/components/responses/Unauthorized' /leads/salesperson/{id}: parameters: - $ref: '#/components/parameters/IdPath' get: operationId: listLeadsBySalesperson tags: - Leads summary: List leads by salesperson (Premium) description: Lists leads assigned to a given salesperson (user). Requires the Premium tier. x-endpoint-status: confirmed responses: '200': description: The salesperson's leads. content: application/json: schema: $ref: '#/components/schemas/LeadList' '403': $ref: '#/components/responses/Forbidden' /leads/from-provider/v2: post: operationId: createLeadFromProvider tags: - Lead Provider summary: Submit a lead from a provider description: >- Pushes a new lead into a SmartMoving account from a website or third-party lead provider. Authenticated by a per-source providerKey query parameter rather than the Open API x-api-key, and free on every SmartMoving plan. Either the individual origin/destination address components or the *AddressFull fields may be supplied, but not both. x-endpoint-status: confirmed security: [] parameters: - name: providerKey in: query required: true schema: type: string description: Per-source provider key from Settings > Sales > Lead Providers. - name: branchId in: query required: false schema: type: string description: Optional branch to route the lead to. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ProviderLead' responses: '200': description: The lead was accepted. content: application/json: schema: type: object '400': description: Invalid lead payload. /branches: get: operationId: listBranches tags: - Reference Data summary: List branches description: >- Lists the branches (locations) configured for the account. Modeled from the documented data model; verify the exact path in the Developer Portal. x-endpoint-status: modeled responses: '200': description: The account's branches. content: application/json: schema: type: array items: $ref: '#/components/schemas/Branch' '401': $ref: '#/components/responses/Unauthorized' /users: get: operationId: listUsers tags: - Reference Data summary: List users description: >- Lists the users (staff / salespeople) in the account. Modeled from the documented data model; verify the exact path in the Developer Portal. x-endpoint-status: modeled responses: '200': description: The account's users. content: application/json: schema: type: array items: $ref: '#/components/schemas/User' '401': $ref: '#/components/responses/Unauthorized' /service-types: get: operationId: listServiceTypes tags: - Reference Data summary: List service types description: >- Lists the move service types configured for the account. Modeled from the documented data model; verify the exact path in the Developer Portal. x-endpoint-status: modeled responses: '200': description: The account's service types. content: application/json: schema: type: array items: type: object '401': $ref: '#/components/responses/Unauthorized' /referral-sources: get: operationId: listReferralSources tags: - Reference Data summary: List referral sources description: >- Lists the referral / lead sources configured for the account. Modeled from the documented data model; verify the exact path in the Developer Portal. x-endpoint-status: modeled responses: '200': description: The account's referral sources. content: application/json: schema: type: array items: type: object '401': $ref: '#/components/responses/Unauthorized' components: securitySchemes: apiKeyAuth: type: apiKey in: header name: x-api-key description: >- Open API key issued at Settings > Integrations > SmartMoving API. The Azure API Management gateway may additionally require an Ocp-Apim-Subscription-Key header. parameters: Page: name: Page in: query required: false schema: type: integer default: 1 description: 1-based page number. PageSize: name: PageSize in: query required: false schema: type: integer default: 25 description: Number of records per page. IdPath: name: id in: path required: true schema: type: string description: The record identifier (GUID). responses: Unauthorized: description: Missing or invalid API key. content: application/json: schema: $ref: '#/components/schemas/Error' Forbidden: description: The API key's tier does not permit this operation (write requires Premium). content: application/json: schema: $ref: '#/components/schemas/Error' NotFound: description: The requested record was not found. content: application/json: schema: $ref: '#/components/schemas/Error' schemas: Error: type: object properties: statusCode: type: integer message: type: string CustomerList: type: object properties: pageResults: type: array items: $ref: '#/components/schemas/Customer' totalResults: type: integer page: type: integer pageSize: type: integer Customer: type: object properties: id: type: string name: type: string emailAddress: type: string phoneNumber: type: string address: type: string createdOn: type: string format: date-time Opportunity: type: object properties: id: type: string quoteNumber: type: string customerId: type: string branchId: type: string status: type: string serviceType: type: string moveDate: type: string format: date estimatedTotal: type: number Job: type: object properties: id: type: string opportunityId: type: string jobNumber: type: string type: type: string jobDate: type: string format: date branchId: type: string Payment: type: object properties: id: type: string opportunityId: type: string amount: type: number method: type: string receivedOn: type: string format: date-time LeadList: type: object properties: pageResults: type: array items: $ref: '#/components/schemas/Lead' totalResults: type: integer page: type: integer pageSize: type: integer Lead: type: object properties: id: type: string firstName: type: string lastName: type: string phoneNumber: type: string email: type: string status: type: string referralSource: type: string branchId: type: string createdOn: type: string format: date-time ProviderLead: type: object required: - FirstName properties: FirstName: type: string LastName: type: string FullName: type: string PhoneNumber: type: string PhoneType: type: string Email: type: string MoveDate: type: string description: Move date in YYYYMMDD format. MoveSize: type: string Bedrooms: type: string ServiceType: type: string ReferralSource: type: string Notes: type: string OriginStreet: type: string OriginCity: type: string OriginState: type: string OriginZip: type: string OriginAddressFull: type: string DestinationStreet: type: string DestinationCity: type: string DestinationState: type: string DestinationZip: type: string DestinationAddressFull: type: string UtmSource: type: string UtmMedium: type: string UtmCampaign: type: string leadCost: type: number Branch: type: object properties: id: type: string name: type: string phoneNumber: type: string address: type: string User: type: object properties: id: type: string name: type: string email: type: string role: type: string