Housecall Pro field-service management: customers, jobs, estimates, leads, invoices, scheduling and dispatch over the Housecall v1 public API.
Housecall Pro ships in the w6w first-party pack. It declares 39 actions, 3 health checks, and the host runs its code in a sandbox that never sees the credential.
io.w6w.housecallproHousecall Pro runs the day-to-day operations for home-service businesses — plumbers, HVAC and electrical contractors, cleaners and more — and this app puts that operational data into a workflow. Create and update customers, look up and create jobs, schedule and dispatch them to the right technician, and manage line items and notes on a job as it moves through the pipeline.
On the sales side, list and read estimates, approve or decline the individual options a customer was offered, and convert a qualified lead straight into a job or an estimate. Read invoices, browse the price book of services you already have on file, and check which zip codes or addresses a service zone actually covers.
Reference data rounds it out: employees, tags, lead sources, job types, routes and pipeline statuses are all readable, so a workflow can label and route work using the same vocabulary Housecall Pro’s own UI does.
Three routes to the same 39 actions. The Workflow tab is generated from Housecall Pro's own manifest and carries its real ids, so it is copy-pasteable; the Code and CLI examples are the same call for any action on any app, so every app-specific value in them is a blank you fill in.
booking-window-list List the windows a job or estimate can be booked into, from the company's Online Booking settings and the employees' actual open slots.
company-get Fetch the company profile. Its `locations` array holds the location ids the X-Company-Id field on every other action expects.
customer-address-create Add an address to a customer. The id it returns is the `address_id` Create Job requires.
customer-get Fetch one customer by id. The response carries the customer's `addresses` array, which is where the address id a job needs comes from.
customer-update Update a customer's attributes. Only the fields you set are sent. Addresses are managed separately, with Create Customer Address.
employee-list List the active employees, with their roles and permissions. Deactivated employees are not returned and there is no documented way to include them.
estimate-get Fetch one estimate by id, with its options. Requires an integration-partner credential: the reference lists only the Application API Key and OAuth token for this endpoint, not the Company API Key a Pro generates for themselves. Find Estimates does accept one, and returns the same records.
estimate-list List estimates, filtered by customer, assigned employee, status or schedule dates.
estimate-option-approve Mark one or more estimate options approved. If the company has 'automatically copy an approved estimate to a new job' enabled, this creates a job and returns its id in `copied_on_approval_to_job_id`.
estimate-option-line-item-list List the line items on one option of an estimate. Option ids come from Get Estimate's `options` array.
event-list List calendar events — the non-job entries on the schedule. Not webhook events.
invoice-get Fetch one invoice by uuid, with its line items, taxes, discounts and payments. Amounts are integers in cents.
invoice-list List invoices, filtered by status, customer, payment method, created/due/paid dates or outstanding amount. Amounts are integers in cents.
job-appointment-list List a job's appointments. A multi-day job has more than one, which is also why Update Job Schedule refuses those jobs.
job-create Create a job for an existing customer and address. Line-item prices are integers in cents.
job-dispatch Assign employees to a job. Send the full set — the response is the job's complete assigned employee list. Requires an integration-partner credential: the reference lists only the Application API Key and OAuth token for this endpoint, not the Company API Key a Pro generates for themselves.
job-get Fetch one job by id. Amounts are integers in cents. `recurrence_id` and `recurrence_status` are null unless the job belongs to a recurring series.
job-invoice-list List the invoices for a job. Amounts are integers in cents. A job split across progress invoices returns several.
job-line-item-create Add one line item to a job. Housecall Pro rate-limits this endpoint specifically — to add several items to one job, use its bulk update instead of calling this in a loop.
job-line-item-list List every line item on a job. Unpaginated — the whole list comes back in one call. Prices and costs are integers in cents.
job-list List jobs, filtered by customer, assigned employee, work status or schedule dates.
job-note-create Append a note to a job. Notes accumulate; this never replaces an existing one.
job-schedule-update Set a job's scheduled window, arrival window and dispatched employees. Refused for a multi-day job with more than one appointment — use the appointment actions for those. Requires an integration-partner credential: the reference lists only the Application API Key and OAuth token for this endpoint, not the Company API Key a Pro generates for themselves.
job-tag-add Attach an existing tag to a job by tag id. Use Get Tags to find one, or Create Tag to make it first.
job-type-list List the company's job types. Filter by name — the endpoint documents no pagination parameters, only a name filter.
lead-convert Convert a lead into a job or an estimate. The response carries `job_id` or `estimate_id` depending on which was asked for.
lead-create Create a lead. Supply either a customer id or an inline customer object, and either an address id or an inline address object.
lead-get Fetch one lead by id. `conversions` lists the jobs or estimates it became, and is empty until it is converted.
lead-list List leads, filtered by customer, status, assigned employee, tag or lead source.
lead-source-list List the available lead sources. `editable` is false for Housecall Pro's built-in ones.
pipeline-status-list List the pipeline stages for leads, jobs or estimates. Returns an empty list — not an error — for an organization without pipeline enabled.
price-book-service-list Search the price book's services by name, description or task number. Materials and labor rates come back as empty lists unless expanded. Requires an integration-partner credential: the reference lists only the Application API Key and OAuth token for this endpoint, not the Company API Key a Pro generates for themselves.
route-list List a day's routes — each groups an employee with their job appointments, events and estimates. Defaults to today. Requires an integration-partner credential: the reference lists only the Application API Key and OAuth token for this endpoint, not the Company API Key a Pro generates for themselves.
service-zone-list List service zones, optionally filtered by zip code or address — which answers whether a given address is served at all. Requires an integration-partner credential: the reference lists only the Application API Key and OAuth token for this endpoint, not the Company API Key a Pro generates for themselves.
tag-create Create a tag. Use Get Tags first if it may already exist — names are not unique.
A workflow step names the app and the action, and the editor fills in the
connection when you pick one. This is the Step shape from the
workflow spec, carrying Housecall Pro's real ids.
{
"manifestVersion": "2",
"name": "housecallpro-example",
"steps": [
{
"id": "customer-address-create",
"uses": {
"app": "io.w6w.housecallpro",
"action": "customer-address-create",
"connection": "conn_YOUR_CONNECTION_ID"
},
"with": {
"customerId": "<customerId>",
"street": "<street>",
"city": "<city>"
}
}
]
}customer-address-create booking-window-list company-get customer-create customer-get +34 more actions available
Every app-specific value here is a blank you have to fill in. An
app action is reached through the connection that authenticates it, so the
address is a connection id, not the app id — and connections belong to your account,
so a public page cannot know yours. Create one for Housecall Pro, then fill in
the three blanks: conn_YOUR_CONNECTION_ID, the action key, and the
parameters that action declares. The call itself is real — the shape is transcribed
from the studio's own snippet builder, which prints the same kind of blanks — but
nothing in it is specific to Housecall Pro. The Workflow tab is where this app's
real ids are.
npm install @w6w/sdkyarn add @w6w/sdkpnpm add @w6w/sdkdeno add npm:@w6w/sdkimport { W6wClient, isActionRun } from "@w6w/sdk";
// Reads W6W_BASE_URL and W6W_TOKEN from the environment when omitted.
const client = new W6wClient();
const envelope = await client.run({
urn: "conn_YOUR_CONNECTION_ID",
action: "job-create",
payload: {
customerId: "<value>",
addressId: "<value>",
// invoiceNumber: "<value>",
// schedule: "<value>",
// assignedEmployeeIds: "<value>",
// lineItems: "<value>",
// tags: "<value>",
// leadSource: "<value>",
// notes: "<value>",
// jobTypeId: "<value>",
// businessUnitId: "<value>",
// companyId: "<value>",
},
});
if (isActionRun(envelope)) console.log(envelope.value); npm install -g @w6w/cli w6w run conn_YOUR_CONNECTION_ID --action job-create --payload '{"customerId":"<value>","addressId":"<value>"}' Give an AI agent Housecall Pro — without giving it Housecall Pro's credentials. One MCP endpoint exposes every app, function and workflow the caller is entitled to, as tools it can discover and run. Access is granted per team while we onboard.
One tool call{
"name": "w6w_invoke",
"arguments": {
"ref": "app:io.w6w.housecallpro#customer-address-create",
"input": {
"customerId": "<customerId>",
"street": "<street>",
"city": "<city>"
}
}
}
Every tool names its target with a single ref. The
app: form above doesn't name a connection at all — the
host resolves which of the caller's Housecall Pro connections to sign
with, and refuses rather than guesses when the answer is ambiguous.
The token is attached host-side, at the moment of the call. It is never a tool argument, never in the model's context, and never in a transcript — so a prompt injection has nothing to exfiltrate.
Tools are derived per end user from what that person has actually connected and is entitled to — not one shared bot identity carrying the union of everyone's access.
Multi-step work runs on the workflow engine and returns a run handle the agent can poll — retries, branching and state survive the conversation that started them.
Housecall Pro's declared health checks are on the surface too, so an agent can tell "the vendor is down" from "your credential expired" before it burns a retry on either.
The MCP surface is part of the hosted platform. Housecall Pro itself is MIT, and the runtime that executes it is source-available (FSL).
Housecall Pro declares its own checks, so its health is a property of the app rather than something the host guesses at.
Statuspage summary at status.housecallpro.com. Informational only: none of its nineteen components covers api.housecallpro.com — the one named 'Add a job API' is the separate Partner Jobs intake API, not the public API this app calls. See the `api` check for the host the actions actually use.
Unsigned GET https://api.housecallpro.com/company. A 401 with Housecall Pro's own `{"message":"Unauthorized"}` body is the pass: it proves the API routed and answered. This says nothing about any credential.