Housecall Pro Public API

The Housecall Pro Public API is a REST + JSON API hosted on Stoplight that gives MAX-plan customers programmatic access to core platform resources — customers, leads, jobs, estimates, invoices, payments, employees, companies, schedule items, and line items. The API is multi-location aware (a single key can pull across all locations of a multi-location admin) and supports webhook subscriptions for customer, estimate, invoice, job, lead, and payment events. Authentication is via a bearer/Token API key generated by an Admin in the App Store. Housecall Pro does not provide dedicated developer support, so integrations are typically built by partner developers or via integration platforms (Zapier, Make, Pipedream, Rollout).

Housecall Pro Public API is published by Housecall Pro on the APIs.io network, described by a machine-readable OpenAPI specification.

This API exposes 6 machine-runnable capabilities that can be deployed as REST, MCP, or Agent Skill surfaces via Naftiko and 3 JSON Schema definitions.

Tagged areas include Home Services, Field Service Management, Customers, Jobs, and Estimates. The published artifact set on APIs.io includes API documentation, authentication docs, a changelog, a getting-started guide, an OpenAPI specification, a JSON-LD context, 6 Naftiko capability specs, and 3 JSON Schemas.

Documentation

Specifications

Schemas & Data

Other Resources

OpenAPI Specification

housecall-pro-public-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Housecall Pro Public API
  version: '1.0'
  description: |
    The Housecall Pro Public API exposes core resources of the Housecall Pro home services
    business management platform — customers, leads, jobs, estimates, invoices, payments,
    employees, schedule items, line items, and webhooks. The API is available to Pros on
    the MAX plan and is documented on Stoplight at https://docs.housecallpro.com/.
  contact:
    name: Housecall Pro
    url: https://www.housecallpro.com
  license:
    name: Proprietary
servers:
  - url: https://api.housecallpro.com
    description: Production
security:
  - bearerAuth: []
  - apiKey: []
tags:
  - name: Customers
  - name: Leads
  - name: Jobs
  - name: Estimates
  - name: Invoices
  - name: Payments
  - name: Employees
  - name: Companies
  - name: Schedule Items
  - name: Line Items
  - name: Webhooks
paths:
  /customers:
    get:
      tags: [Customers]
      summary: List Customers
      operationId: listCustomers
      parameters:
        - name: page
          in: query
          schema: { type: integer }
        - name: page_size
          in: query
          schema: { type: integer }
        - name: q
          in: query
          schema: { type: string }
      responses:
        '200':
          description: Customer collection.
          content:
            application/json:
              schema:
                type: object
                properties:
                  customers:
                    type: array
                    items: { $ref: '#/components/schemas/Customer' }
    post:
      tags: [Customers]
      summary: Create Customer
      operationId: createCustomer
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/Customer' }
      responses:
        '201': { description: Customer created. }
  /customers/{customer_id}:
    get:
      tags: [Customers]
      summary: Get Customer
      operationId: getCustomer
      parameters:
        - name: customer_id
          in: path
          required: true
          schema: { type: string }
      responses:
        '200':
          description: Single customer.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/Customer' }
    put:
      tags: [Customers]
      summary: Update Customer
      operationId: updateCustomer
      parameters:
        - { name: customer_id, in: path, required: true, schema: { type: string } }
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/Customer' }
      responses:
        '200': { description: Customer updated. }
    delete:
      tags: [Customers]
      summary: Delete Customer
      operationId: deleteCustomer
      parameters:
        - { name: customer_id, in: path, required: true, schema: { type: string } }
      responses:
        '204': { description: Customer deleted. }
  /leads:
    get:
      tags: [Leads]
      summary: List Leads
      operationId: listLeads
      responses:
        '200': { description: Lead collection. }
    post:
      tags: [Leads]
      summary: Create Lead
      operationId: createLead
      responses:
        '201': { description: Lead created. }
  /jobs:
    get:
      tags: [Jobs]
      summary: List Jobs
      operationId: listJobs
      parameters:
        - { name: page, in: query, schema: { type: integer } }
        - { name: page_size, in: query, schema: { type: integer } }
        - { name: scheduled_start_min, in: query, schema: { type: string, format: date-time } }
        - { name: scheduled_start_max, in: query, schema: { type: string, format: date-time } }
        - { name: customer_id, in: query, schema: { type: string } }
        - { name: employee_ids, in: query, schema: { type: array, items: { type: string } } }
      responses:
        '200':
          description: Job collection.
          content:
            application/json:
              schema:
                type: object
                properties:
                  jobs:
                    type: array
                    items: { $ref: '#/components/schemas/Job' }
    post:
      tags: [Jobs]
      summary: Create Job
      operationId: createJob
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/Job' }
      responses:
        '201': { description: Job created. }
  /jobs/{job_id}:
    get:
      tags: [Jobs]
      summary: Get Job
      operationId: getJob
      parameters:
        - { name: job_id, in: path, required: true, schema: { type: string } }
      responses:
        '200':
          description: Single job.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/Job' }
    put:
      tags: [Jobs]
      summary: Update Job
      operationId: updateJob
      parameters:
        - { name: job_id, in: path, required: true, schema: { type: string } }
      responses:
        '200': { description: Job updated. }
    delete:
      tags: [Jobs]
      summary: Delete Job
      operationId: deleteJob
      parameters:
        - { name: job_id, in: path, required: true, schema: { type: string } }
      responses:
        '204': { description: Job deleted. }
  /jobs/{job_id}/line_items:
    get:
      tags: [Line Items]
      summary: List Job Line Items
      operationId: listJobLineItems
      parameters:
        - { name: job_id, in: path, required: true, schema: { type: string } }
      responses:
        '200': { description: Line item collection. }
    post:
      tags: [Line Items]
      summary: Create Job Line Item
      operationId: createJobLineItem
      parameters:
        - { name: job_id, in: path, required: true, schema: { type: string } }
      responses:
        '201': { description: Line item created. }
  /jobs/{job_id}/appointments:
    get:
      tags: [Schedule Items]
      summary: List Job Appointments
      operationId: listJobAppointments
      parameters:
        - { name: job_id, in: path, required: true, schema: { type: string } }
      responses:
        '200': { description: Appointment collection. }
  /estimates:
    get:
      tags: [Estimates]
      summary: List Estimates
      operationId: listEstimates
      responses:
        '200':
          description: Estimate collection.
          content:
            application/json:
              schema:
                type: object
                properties:
                  estimates:
                    type: array
                    items: { $ref: '#/components/schemas/Estimate' }
    post:
      tags: [Estimates]
      summary: Create Estimate
      operationId: createEstimate
      responses:
        '201': { description: Estimate created. }
  /estimates/{estimate_id}:
    get:
      tags: [Estimates]
      summary: Get Estimate
      operationId: getEstimate
      parameters:
        - { name: estimate_id, in: path, required: true, schema: { type: string } }
      responses:
        '200':
          description: Single estimate.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/Estimate' }
  /invoices:
    get:
      tags: [Invoices]
      summary: List Invoices
      operationId: listInvoices
      responses:
        '200':
          description: Invoice collection.
          content:
            application/json:
              schema:
                type: object
                properties:
                  invoices:
                    type: array
                    items: { $ref: '#/components/schemas/Invoice' }
    post:
      tags: [Invoices]
      summary: Create Invoice
      operationId: createInvoice
      responses:
        '201': { description: Invoice created. }
  /invoices/{invoice_id}:
    get:
      tags: [Invoices]
      summary: Get Invoice
      operationId: getInvoice
      parameters:
        - { name: invoice_id, in: path, required: true, schema: { type: string } }
      responses:
        '200':
          description: Single invoice.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/Invoice' }
  /invoices/{invoice_id}/payments:
    get:
      tags: [Payments]
      summary: List Invoice Payments
      operationId: listInvoicePayments
      parameters:
        - { name: invoice_id, in: path, required: true, schema: { type: string } }
      responses:
        '200':
          description: Payment collection.
          content:
            application/json:
              schema:
                type: object
                properties:
                  payments:
                    type: array
                    items: { $ref: '#/components/schemas/Payment' }
  /employees:
    get:
      tags: [Employees]
      summary: List Employees
      operationId: listEmployees
      responses:
        '200':
          description: Employee collection.
          content:
            application/json:
              schema:
                type: object
                properties:
                  employees:
                    type: array
                    items: { $ref: '#/components/schemas/Employee' }
  /employees/{employee_id}:
    get:
      tags: [Employees]
      summary: Get Employee
      operationId: getEmployee
      parameters:
        - { name: employee_id, in: path, required: true, schema: { type: string } }
      responses:
        '200':
          description: Single employee.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/Employee' }
  /companies:
    get:
      tags: [Companies]
      summary: List Companies
      operationId: listCompanies
      responses:
        '200': { description: Company collection. }
  /webhooks:
    get:
      tags: [Webhooks]
      summary: List Webhook Subscriptions
      operationId: listWebhooks
      responses:
        '200': { description: Webhook collection. }
    post:
      tags: [Webhooks]
      summary: Create Webhook Subscription
      operationId: createWebhook
      responses:
        '201': { description: Webhook subscription created. }
  /webhooks/{webhook_id}:
    delete:
      tags: [Webhooks]
      summary: Delete Webhook Subscription
      operationId: deleteWebhook
      parameters:
        - { name: webhook_id, in: path, required: true, schema: { type: string } }
      responses:
        '204': { description: Webhook deleted. }
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API Key
      description: Bearer token using the API key generated from the MAX-plan App Store API card.
    apiKey:
      type: apiKey
      in: header
      name: Authorization
      description: API key passed as `Authorization: Token {key}`.
  schemas:
    Customer:
      type: object
      properties:
        id: { type: string }
        first_name: { type: string }
        last_name: { type: string }
        email: { type: string, format: email }
        mobile_number: { type: string }
        home_number: { type: string }
        work_number: { type: string }
        company: { type: string }
        notifications_enabled: { type: boolean }
        lead_source: { type: string }
        tags:
          type: array
          items: { type: string }
        addresses:
          type: array
          items: { $ref: '#/components/schemas/Address' }
        created_at: { type: string, format: date-time }
        updated_at: { type: string, format: date-time }
    Address:
      type: object
      properties:
        id: { type: string }
        type: { type: string, enum: [billing, service] }
        street: { type: string }
        street_line_2: { type: string }
        city: { type: string }
        state: { type: string }
        zip: { type: string }
        country: { type: string }
    Job:
      type: object
      properties:
        id: { type: string }
        invoice_number: { type: string }
        description: { type: string }
        customer: { $ref: '#/components/schemas/Customer' }
        address: { $ref: '#/components/schemas/Address' }
        notes: { type: string }
        work_status: { type: string, enum: [unscheduled, scheduled, in_progress, complete, completed_unrated, user_canceled, pro_canceled] }
        work_timestamps:
          type: object
          properties:
            on_my_way_at: { type: string, format: date-time }
            started_at: { type: string, format: date-time }
            completed_at: { type: string, format: date-time }
        schedule:
          type: object
          properties:
            scheduled_start: { type: string, format: date-time }
            scheduled_end: { type: string, format: date-time }
            arrival_window: { type: integer }
        total_amount: { type: integer, description: Amount in cents. }
        outstanding_balance: { type: integer }
        assigned_employees:
          type: array
          items: { $ref: '#/components/schemas/Employee' }
        tags:
          type: array
          items: { type: string }
        created_at: { type: string, format: date-time }
        updated_at: { type: string, format: date-time }
    Estimate:
      type: object
      properties:
        id: { type: string }
        estimate_number: { type: string }
        work_status: { type: string }
        customer: { $ref: '#/components/schemas/Customer' }
        address: { $ref: '#/components/schemas/Address' }
        total_amount: { type: integer }
        approval_status: { type: string, enum: [pro_approved, customer_approved, declined, pending] }
        options:
          type: array
          items:
            type: object
            properties:
              id: { type: string }
              name: { type: string }
              total_amount: { type: integer }
        created_at: { type: string, format: date-time }
    Invoice:
      type: object
      properties:
        id: { type: string }
        invoice_number: { type: string }
        status: { type: string, enum: [draft, sent, paid, voided, canceled] }
        amount: { type: integer }
        outstanding_balance: { type: integer }
        customer_id: { type: string }
        job_id: { type: string }
        due_at: { type: string, format: date-time }
        created_at: { type: string, format: date-time }
    Payment:
      type: object
      properties:
        id: { type: string }
        invoice_id: { type: string }
        amount: { type: integer }
        payment_method: { type: string, enum: [cash, check, credit_card, ach, other] }
        status: { type: string, enum: [succeeded, pending, failed, refunded] }
        processed_at: { type: string, format: date-time }
    Employee:
      type: object
      properties:
        id: { type: string }
        first_name: { type: string }
        last_name: { type: string }
        email: { type: string, format: email }
        mobile_number: { type: string }
        role: { type: string, enum: [admin, office_staff, field_tech] }
        color_hex: { type: string }
        avatar_url: { type: string }
        permissions:
          type: object
          additionalProperties: { type: boolean }