SmartMoving Lead Provider API

Push new leads into a SmartMoving account from any website or third-party lead provider by POSTing to /leads/from-provider/v2. Authenticated by a per-source providerKey query parameter (not the Open API key) and free on every SmartMoving plan, with fields for contact, move details, origin and destination addresses, referral source, and UTM tracking.

OpenAPI Specification

smartmoving-openapi.yml Raw ↑
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