> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to Jobber

The Jobber connector lets your AI agent act in each user's Jobber account. Each user signs in to Jobber once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 49 tools.

**Authentication:** OAuth 2.0
**Categories:** CRM & Sales, Productivity
**Tools:** 49: 23 read, 25 write, 1 destructive
**Users sign in with:** OAuth
**OAuth app:** Your own Jobber app
**Built by:** Scalekit connector
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=JOBBER)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### Create the Jobber connection

   In **AgentKit > Connections**, create a Jobber connection and copy its redirect URI. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

4. ### Register an OAuth app

   Jobber connections use your own OAuth app. Register one with Jobber and add the redirect URI you copied.

   Then enter the app's Client ID and Client Secret on the Jobber connection.

5. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   import { ScalekitClient } from '@scalekit-sdk/node'
   import 'dotenv/config'
   import { createInterface } from 'node:readline/promises'

   const scalekit = new ScalekitClient(
     process.env.SCALEKIT_ENVIRONMENT_URL,
     process.env.SCALEKIT_CLIENT_ID,
     process.env.SCALEKIT_CLIENT_SECRET,
   )
   const actions = scalekit.actions

   const connector = 'jobber'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize Jobber:', link)
   const rl = createInterface({ input: process.stdin, output: process.stdout })
   await rl.question('Press Enter after authorizing...')
   rl.close()

   // Make your first call
   const result = await actions.executeTool({
     connector,
     identifier,
     toolName: 'jobber_account_get',
     toolInput: {},
   })
   console.log(result)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_dotenv()

   scalekit_client = ScalekitClient(
       env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),
       client_id=os.getenv("SCALEKIT_CLIENT_ID"),
       client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
   )
   actions = scalekit_client.actions

   connection_name = "jobber"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_response = actions.get_authorization_link(
       connection_name=connection_name,
       identifier=identifier,
   )
   print("Authorize Jobber:", link_response.link)
   input("Press Enter after authorizing...")

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="jobber_account_get",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user signs in once. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'jobber_account_get',
  toolInput: {},
  connector: 'jobber',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="jobber_account_get",
    tool_input={},
    connection_name="jobber",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `jobber_account_get`

Get Account · Read-only

Get the Jobber account (business) that the connection is authorized for.
Returns the account id, name, company contact details and the account owner.
Use it to confirm which Jobber business you are connected to. Use jobber_users_list for team members.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `jobber_client_get`

Get Client · Read-only

Get one Jobber client by ID.
Returns the client's names, company, contact preferences, emails, phones, billing address, tags and up to 10 properties.
Use it for one client's full details. Use jobber_clients_list to search for a client first.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `client_id` (`string`, required): Jobber encoded ID of the client. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL0NsaWVudC8xMjM0NTY3OA==.

Example input: `{"client_id":"<client_id>"}`

### `jobber_clients_list`

List Clients · Read-only

List clients in Jobber, optionally filtered by a text search, lead/company/archived flags, tags or dates.
Returns each client's id, name, company, lead and archived flags, balance, emails, phones and billing address, plus pageInfo for paging.
Use it to browse or find clients. Use jobber_client_get for one client's full details.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Cursor for the next page. Pass the pageInfo.endCursor value from the previous response when pageInfo.hasNextPage is true. Leave empty for the first page. Example: MjU.
- `created_after` (`string`, optional): Only return records whose creation time is on or after this ISO 8601 timestamp. Example: 2026-01-01T00:00:00Z.
- `created_before` (`string`, optional): Only return records whose creation time is on or before this ISO 8601 timestamp. Example: 2026-12-31T23:59:59Z.
- `first` (`integer`, optional): Number of clients to return in this page. Defaults to 20. Keep it small (20 to 50) so the query stays within Jobber's per-request query cost budget. Example: 25.
- `is_archived` (`boolean`, optional): Set to true to return only archived clients, or false to exclude them. Example: false.
- `is_company` (`boolean`, optional): Set to true to return only company clients, or false for individuals only. Example: false.
- `is_lead` (`boolean`, optional): Set to true to return only leads, or false to return only clients that are not leads. Example: true.
- `search_term` (`string`, optional): Free-text search across client names, emails, phone numbers and addresses. Leave empty to return all records. Example: Smith.
- `tags` (`array`, optional): Only return clients that have these tags. Example: ["VIP", "Commercial"].
- `updated_after` (`string`, optional): Only return records whose last update time is on or after this ISO 8601 timestamp. Example: 2026-01-01T00:00:00Z.
- `updated_before` (`string`, optional): Only return records whose last update time is on or before this ISO 8601 timestamp. Example: 2026-12-31T23:59:59Z.

Example input: `{}`

### `jobber_expenses_list`

List Expenses · Read-only

List expenses recorded in Jobber, optionally matching a text search.
Returns each expense's id, title, description, date, total, linked job and the users who entered it and are reimbursed, plus pageInfo.
Use it for job costing. Use jobber_expense_create to record a new expense.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Cursor for the next page. Pass the pageInfo.endCursor value from the previous response when pageInfo.hasNextPage is true. Leave empty for the first page. Example: MjU.
- `first` (`integer`, optional): Number of expenses to return in this page. Defaults to 20. Keep it small (20 to 50) so the query stays within Jobber's per-request query cost budget. Example: 25.
- `search_term` (`string`, optional): Free-text search across expense titles and descriptions. Leave empty to return all records. Example: Smith.

Example input: `{}`

### `jobber_invoice_get`

Get Invoice · Read-only

Get one Jobber invoice by ID.
Returns the invoice's number, subject, status, dates, amounts and balance, client, billing address, up to 50 line items, linked jobs and up to 20 payment records.
Use it for one invoice. Use jobber_invoices_list to find invoices.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `invoice_id` (`string`, required): Jobber encoded ID of the invoice. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL0ludm9pY2UvMTIzNDU2Nzg=.

Example input: `{"invoice_id":"<invoice_id>"}`

### `jobber_invoices_list`

List Invoices · Read-only

List invoices in Jobber, optionally filtered by client, status, text or issued, due and update dates.
Returns each invoice's id, number, subject, status, dates, amounts and balance, and client, plus pageInfo.
Use it to review receivables. Use jobber_invoice_get for one invoice's line items and payments.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Cursor for the next page. Pass the pageInfo.endCursor value from the previous response when pageInfo.hasNextPage is true. Leave empty for the first page. Example: MjU.
- `client_id` (`string`, optional): Jobber encoded ID of the client to filter by. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL0NsaWVudC8xMjM0NTY3OA==.
- `due_after` (`string`, optional): Only return records whose due date is on or after this ISO 8601 timestamp. Example: 2026-01-01T00:00:00Z.
- `due_before` (`string`, optional): Only return records whose due date is on or before this ISO 8601 timestamp. Example: 2026-12-31T23:59:59Z.
- `first` (`integer`, optional): Number of invoices to return in this page. Defaults to 20. Keep it small (20 to 50) so the query stays within Jobber's per-request query cost budget. Example: 25.
- `issued_after` (`string`, optional): Only return records whose issued date is on or after this ISO 8601 timestamp. Example: 2026-01-01T00:00:00Z.
- `issued_before` (`string`, optional): Only return records whose issued date is on or before this ISO 8601 timestamp. Example: 2026-12-31T23:59:59Z.
- `search_term` (`string`, optional): Free-text search across invoice subjects, numbers and client names. Leave empty to return all records. Example: Smith.
- `status` (`string`, optional): Only return invoices with this status: draft, awaiting_payment, paid, past_due, bad_debt, sent_not_due or voided. Example: past_due. One of: `draft`, `awaiting_payment`, `paid`, `past_due`, `bad_debt`, `sent_not_due`, `voided`.
- `updated_after` (`string`, optional): Only return records whose last update time is on or after this ISO 8601 timestamp. Example: 2026-01-01T00:00:00Z.
- `updated_before` (`string`, optional): Only return records whose last update time is on or before this ISO 8601 timestamp. Example: 2026-12-31T23:59:59Z.

Example input: `{}`

### `jobber_job_get`

Get Job · Read-only

Get one Jobber job by ID.
Returns the job's number, title, status, instructions, dates, totals, client, property, quote, up to 50 line items, 20 visits and 10 invoices.
Use it for one job. Use jobber_jobs_list to find jobs.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `job_id` (`string`, required): Jobber encoded ID of the job. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL0pvYi8xMjM0NTY3OA==.

Example input: `{"job_id":"<job_id>"}`

### `jobber_jobs_list`

List Jobs · Read-only

List jobs in Jobber, optionally filtered by status, job type, text or date ranges.
Returns each job's id, number, title, status, type, dates, totals, client and property, plus pageInfo.
Use it to browse jobs. Use jobber_job_get for one job's line items and visits.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Cursor for the next page. Pass the pageInfo.endCursor value from the previous response when pageInfo.hasNextPage is true. Leave empty for the first page. Example: MjU.
- `created_after` (`string`, optional): Only return records whose creation time is on or after this ISO 8601 timestamp. Example: 2026-01-01T00:00:00Z.
- `created_before` (`string`, optional): Only return records whose creation time is on or before this ISO 8601 timestamp. Example: 2026-12-31T23:59:59Z.
- `first` (`integer`, optional): Number of jobs to return in this page. Defaults to 20. Keep it small (20 to 50) so the query stays within Jobber's per-request query cost budget. Example: 25.
- `job_type` (`string`, optional): Only return ONE_OFF or RECURRING jobs. Example: ONE_OFF. One of: `ONE_OFF`, `RECURRING`.
- `search_term` (`string`, optional): Free-text search across job titles, numbers and client names. Leave empty to return all records. Example: Smith.
- `start_after` (`string`, optional): Only return records whose start date is on or after this ISO 8601 timestamp. Example: 2026-01-01T00:00:00Z.
- `start_before` (`string`, optional): Only return records whose start date is on or before this ISO 8601 timestamp. Example: 2026-12-31T23:59:59Z.
- `status` (`string`, optional): Only return jobs with this status, for example active, upcoming, late, requires_invoicing or archived. Example: active. One of: `requires_invoicing`, `archived`, `late`, `today`, `upcoming`, `action_required`, `on_hold`, `unscheduled`, `active`, `expiring_within_30_days`.

Example input: `{}`

### `jobber_payment_records_list`

List Payment Records · Read-only

List payments recorded in Jobber, optionally for one client, payment type or entry date range.
Returns each payment's id, amount, entry date, payment type, adjustment type, details, client and invoice, plus pageInfo.
Use it to reconcile payments. Use jobber_invoice_get for one invoice's payments.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Cursor for the next page. Pass the pageInfo.endCursor value from the previous response when pageInfo.hasNextPage is true. Leave empty for the first page. Example: MjU.
- `client_id` (`string`, optional): Jobber encoded ID of the client to filter by. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL0NsaWVudC8xMjM0NTY3OA==.
- `entry_after` (`string`, optional): Only return records whose entry date is on or after this ISO 8601 timestamp. Example: 2026-01-01T00:00:00Z.
- `entry_before` (`string`, optional): Only return records whose entry date is on or before this ISO 8601 timestamp. Example: 2026-12-31T23:59:59Z.
- `first` (`integer`, optional): Number of payment records to return in this page. Defaults to 20. Keep it small (20 to 50) so the query stays within Jobber's per-request query cost budget. Example: 25.

Example input: `{}`

### `jobber_products_list`

List Products and Services · Read-only

List the products and services catalog in Jobber, optionally matching a text search.
Returns each item's id, name, description, category, default price, internal cost, markup, taxable and visible flags, plus pageInfo.
Use it to find a productOrServiceId for line items.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Cursor for the next page. Pass the pageInfo.endCursor value from the previous response when pageInfo.hasNextPage is true. Leave empty for the first page. Example: MjU.
- `first` (`integer`, optional): Number of products and services to return in this page. Defaults to 20. Keep it small (20 to 50) so the query stays within Jobber's per-request query cost budget. Example: 25.
- `search_term` (`string`, optional): Free-text search across product and service names. Leave empty to return all records. Example: Smith.
- `show_inactive` (`boolean`, optional): Set to true to include hidden (inactive) items. Example: false.

Example input: `{}`

### `jobber_properties_list`

List Properties · Read-only

List service properties (job sites) in Jobber, optionally for one client or matching a text search.
Returns each property's id, name, address, owning client and tax rate, plus pageInfo for paging.
Use it to find a property id for quotes, jobs and requests. Use jobber_property_get for one property.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Cursor for the next page. Pass the pageInfo.endCursor value from the previous response when pageInfo.hasNextPage is true. Leave empty for the first page. Example: MjU.
- `client_id` (`string`, optional): Jobber encoded ID of the client whose properties to list. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL0NsaWVudC8xMjM0NTY3OA==.
- `first` (`integer`, optional): Number of properties to return in this page. Defaults to 20. Keep it small (20 to 50) so the query stays within Jobber's per-request query cost budget. Example: 25.
- `search_term` (`string`, optional): Free-text search across property addresses. Leave empty to return all records. Example: Smith.

Example input: `{}`

### `jobber_property_get`

Get Property · Read-only

Get one Jobber service property by ID.
Returns the property's id, name, address, owning client and tax rate.
Use it for one property. Use jobber_properties_list to find properties.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `property_id` (`string`, required): Jobber encoded ID of the property. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1Byb3BlcnR5LzEyMzQ1Njc4.

Example input: `{"property_id":"<property_id>"}`

### `jobber_quote_get`

Get Quote · Read-only

Get one Jobber quote by ID.
Returns the quote's number, title, status, message, amounts, client, property, up to 50 line items and linked jobs.
Use it for one quote. Use jobber_quotes_list to find quotes.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `quote_id` (`string`, required): Jobber encoded ID of the quote. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1F1b3RlLzEyMzQ1Njc4.

Example input: `{"quote_id":"<quote_id>"}`

### `jobber_quotes_list`

List Quotes · Read-only

List quotes in Jobber, optionally filtered by client, status, salesperson, text or dates.
Returns each quote's id, number, title, status, amounts, client and property, plus pageInfo for paging.
Use it to browse quotes. Use jobber_quote_get for one quote's line items.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Cursor for the next page. Pass the pageInfo.endCursor value from the previous response when pageInfo.hasNextPage is true. Leave empty for the first page. Example: MjU.
- `client_id` (`string`, optional): Jobber encoded ID of the client to filter by. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL0NsaWVudC8xMjM0NTY3OA==.
- `created_after` (`string`, optional): Only return records whose creation time is on or after this ISO 8601 timestamp. Example: 2026-01-01T00:00:00Z.
- `created_before` (`string`, optional): Only return records whose creation time is on or before this ISO 8601 timestamp. Example: 2026-12-31T23:59:59Z.
- `first` (`integer`, optional): Number of quotes to return in this page. Defaults to 20. Keep it small (20 to 50) so the query stays within Jobber's per-request query cost budget. Example: 25.
- `salesperson_id` (`string`, optional): Jobber encoded ID of the salesperson to filter by. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1VzZXIvMTIzNDU2Nzg=.
- `search_term` (`string`, optional): Free-text search across quote titles, numbers and client names. Leave empty to return all records. Example: Smith.
- `status` (`string`, optional): Only return quotes with this status: draft, awaiting_response, archived, approved, converted or changes_requested. Example: awaiting_response. One of: `draft`, `awaiting_response`, `archived`, `approved`, `converted`, `changes_requested`.
- `updated_after` (`string`, optional): Only return records whose last update time is on or after this ISO 8601 timestamp. Example: 2026-01-01T00:00:00Z.
- `updated_before` (`string`, optional): Only return records whose last update time is on or before this ISO 8601 timestamp. Example: 2026-12-31T23:59:59Z.

Example input: `{}`

### `jobber_request_get`

Get Request · Read-only

Get one Jobber work request by ID.
Returns the request's title, status, contact details, client, property, assessment, linked quotes and jobs, and up to 10 notes.
Use it for one request. Use jobber_requests_list to find requests.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `request_id` (`string`, required): Jobber encoded ID of the request. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1JlcXVlc3QvMTIzNDU2Nzg=.

Example input: `{"request_id":"<request_id>"}`

### `jobber_requests_list`

List Requests · Read-only

List work requests (incoming service requests) in Jobber, optionally filtered by client, status, text or dates.
Returns each request's id, title, status, source, contact details, client and property, plus pageInfo.
Use it to triage new work. Use jobber_request_get for one request's details.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Cursor for the next page. Pass the pageInfo.endCursor value from the previous response when pageInfo.hasNextPage is true. Leave empty for the first page. Example: MjU.
- `client_id` (`string`, optional): Jobber encoded ID of the client to filter by. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL0NsaWVudC8xMjM0NTY3OA==.
- `created_after` (`string`, optional): Only return records whose creation time is on or after this ISO 8601 timestamp. Example: 2026-01-01T00:00:00Z.
- `created_before` (`string`, optional): Only return records whose creation time is on or before this ISO 8601 timestamp. Example: 2026-12-31T23:59:59Z.
- `first` (`integer`, optional): Number of requests to return in this page. Defaults to 20. Keep it small (20 to 50) so the query stays within Jobber's per-request query cost budget. Example: 25.
- `search_term` (`string`, optional): Free-text search across request titles and client names. Leave empty to return all records. Example: Smith.
- `status` (`string`, optional): Only return requests with this status, for example new, upcoming, overdue, converted or archived. Example: new. One of: `new`, `completed`, `converted`, `archived`, `upcoming`, `overdue`, `unscheduled`, `assessment_completed`, `today`, `needs_approval`.
- `updated_after` (`string`, optional): Only return records whose last update time is on or after this ISO 8601 timestamp. Example: 2026-01-01T00:00:00Z.
- `updated_before` (`string`, optional): Only return records whose last update time is on or before this ISO 8601 timestamp. Example: 2026-12-31T23:59:59Z.

Example input: `{}`

### `jobber_scheduled_items_list`

List Scheduled Items · Read-only

List everything on the Jobber calendar within a time range: visits, tasks, events, assessments and reminders.
Returns each item's type (__typename), id, title, start and end times, duration and assigned users, plus pageInfo.
Use it for a calendar view. Use jobber_visits_list for visits only.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `ends_at` (`string`, required): End of the time range, as an ISO 8601 timestamp. Example: 2026-11-08T00:00:00Z.
- `starts_at` (`string`, required): Start of the time range, as an ISO 8601 timestamp. Example: 2026-11-01T00:00:00Z.
- `after` (`string`, optional): Cursor for the next page. Pass the pageInfo.endCursor value from the previous response when pageInfo.hasNextPage is true. Leave empty for the first page. Example: MjU.
- `assigned_to` (`array`, optional): Only return items assigned to these users (Jobber encoded user IDs). Example: ["Z2lkOi8vSm9iYmVyL1VzZXIvMTIzNDU2Nzg="].
- `first` (`integer`, optional): Number of scheduled items to return in this page. Defaults to 20. Keep it small (20 to 50) so the query stays within Jobber's per-request query cost budget. Example: 25.
- `item_type` (`string`, optional): Only return one kind of item: BASIC_TASK, VISIT, EVENT, ASSESSMENT, QUOTE_REMINDER or INVOICE_REMINDER. Example: VISIT. One of: `BASIC_TASK`, `VISIT`, `EVENT`, `ASSESSMENT`, `QUOTE_REMINDER`, `INVOICE_REMINDER`.

Example input: `{"ends_at":"<ends_at>","starts_at":"<starts_at>"}`

### `jobber_tax_rates_list`

List Tax Rates · Read-only

List the tax rates configured in the Jobber account, optionally matching a text search.
Returns each tax rate's id, name, label, percentage, default flag and description, plus pageInfo.
Use it to find a taxRateId for quotes, jobs, invoices and properties.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Cursor for the next page. Pass the pageInfo.endCursor value from the previous response when pageInfo.hasNextPage is true. Leave empty for the first page. Example: MjU.
- `first` (`integer`, optional): Number of tax rates to return in this page. Defaults to 20. Keep it small (20 to 50) so the query stays within Jobber's per-request query cost budget. Example: 25.
- `search_term` (`string`, optional): Free-text search across tax rate names. Leave empty to return all records. Example: Smith.

Example input: `{}`

### `jobber_time_sheet_entries_list`

List Time Sheet Entries · Read-only

List time sheet entries in Jobber, optionally filtered by user, approval, payable or running state, or dates.
Returns each entry's id, start and end times, final duration in seconds, approval and running flags, note, user and job, plus pageInfo.
Use it for payroll and labor costing.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Cursor for the next page. Pass the pageInfo.endCursor value from the previous response when pageInfo.hasNextPage is true. Leave empty for the first page. Example: MjU.
- `assigned_to` (`string`, optional): Jobber encoded ID of the user whose time sheet entries to list. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1VzZXIvMTIzNDU2Nzg=.
- `first` (`integer`, optional): Number of time sheet entries to return in this page. Defaults to 20. Keep it small (20 to 50) so the query stays within Jobber's per-request query cost budget. Example: 25.
- `is_approved` (`boolean`, optional): Set to true for approved entries only. Example: true.
- `is_payable` (`boolean`, optional): Set to true for payable entries only. Example: true.
- `start_after` (`string`, optional): Only return records whose start time is on or after this ISO 8601 timestamp. Example: 2026-01-01T00:00:00Z.
- `start_before` (`string`, optional): Only return records whose start time is on or before this ISO 8601 timestamp. Example: 2026-12-31T23:59:59Z.
- `ticking` (`boolean`, optional): Set to true for entries whose timer is running. Example: false.

Example input: `{}`

### `jobber_user_get`

Get User · Read-only

Get one Jobber user by ID, or the currently authorized user when no ID is given.
Returns the user's id, name, email, phone, status and owner/admin flags.
Use it for one user's details. Use jobber_users_list to browse or search users.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `user_id` (`string`, optional): Jobber encoded ID of the user. Leave empty to get the user who authorized the connection. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1VzZXIvMTIzNDU2Nzg=.

Example input: `{}`

### `jobber_users_list`

List Users · Read-only

List team members (users) on the Jobber account, optionally filtered by status or a name search.
Returns each user's id, name, email, phone, status and owner/admin flags, plus pageInfo for paging.
Use it to find a user id for assignments. Use jobber_user_get for one user.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Cursor for the next page. Pass the pageInfo.endCursor value from the previous response when pageInfo.hasNextPage is true. Leave empty for the first page. Example: MjU.
- `first` (`integer`, optional): Number of users to return in this page. Defaults to 20. Keep it small (20 to 50) so the query stays within Jobber's per-request query cost budget. Example: 25.
- `search_term` (`string`, optional): Free-text search across user names. Leave empty to return all records. Example: Smith.
- `status` (`string`, optional): Only return users with this status: ACTIVATED or DEACTIVATED. Leave empty for all users. Example: ACTIVATED. One of: `ACTIVATED`, `DEACTIVATED`.

Example input: `{}`

### `jobber_visit_get`

Get Visit · Read-only

Get one Jobber visit by ID.
Returns the visit's title, status, times, instructions, job, client, property, assigned users, line items and invoice.
Use it for one visit. Use jobber_visits_list to find visits.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `visit_id` (`string`, required): Jobber encoded ID of the visit. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1Zpc2l0LzEyMzQ1Njc4.

Example input: `{"visit_id":"<visit_id>"}`

### `jobber_visits_list`

List Visits · Read-only

List scheduled visits in Jobber, optionally filtered by status, assigned user, job, completion or dates.
Returns each visit's id, title, status, start and end times, completion, job, client and property, plus pageInfo.
Use it to see the visit schedule. Use jobber_scheduled_items_list for tasks, events and assessments too.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Cursor for the next page. Pass the pageInfo.endCursor value from the previous response when pageInfo.hasNextPage is true. Leave empty for the first page. Example: MjU.
- `assigned_to` (`string`, optional): Jobber encoded ID of the user the visits are assigned to. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1VzZXIvMTIzNDU2Nzg=.
- `first` (`integer`, optional): Number of visits to return in this page. Defaults to 20. Keep it small (20 to 50) so the query stays within Jobber's per-request query cost budget. Example: 25.
- `is_complete` (`boolean`, optional): Set to true for completed visits only, or false for incomplete visits only. Example: false.
- `job_ids` (`array`, optional): Only return visits on these jobs (Jobber encoded job IDs). Example: ["Z2lkOi8vSm9iYmVyL0pvYi8xMjM0NTY3OA=="].
- `start_after` (`string`, optional): Only return records whose start time is on or after this ISO 8601 timestamp. Example: 2026-01-01T00:00:00Z.
- `start_before` (`string`, optional): Only return records whose start time is on or before this ISO 8601 timestamp. Example: 2026-12-31T23:59:59Z.
- `status` (`string`, optional): Only return visits with this status: ACTIVE, COMPLETED, LATE, TODAY, UNSCHEDULED or UPCOMING. Example: UPCOMING. One of: `ACTIVE`, `COMPLETED`, `LATE`, `TODAY`, `UNSCHEDULED`, `UPCOMING`.

Example input: `{}`

### `jobber_client_create`

Create Client · Write

Create a client (customer or lead) in Jobber with optional emails, phones, billing address and properties.
Returns the new client's id, names and contact details, plus userErrors when Jobber rejects the input.
Use it to add a new person or company. Use jobber_client_update to change an existing client.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `billing_address` (`object`, optional): Billing address of the client. Street address with street1, street2, city, province (state or province), postalCode and country. All parts are optional strings. Example: {"street1": "123 Main St", "city": "Austin", "province": "TX", "postalCode": "78701", "country": "United States"}.
- `company_name` (`string`, optional): Company name of the client. Provide a first/last name, a company name, or both. Example: Smith Landscaping.
- `emails` (`array`, optional): Email addresses to add. Each entry has an address, an optional description (MAIN, WORK, PERSONAL or OTHER) and an optional primary flag. Example: [{"address": "jane@example.com", "description": "MAIN", "primary": true}].
- `first_name` (`string`, optional): First name of the client. Example: Jane.
- `is_company` (`boolean`, optional): Set to true to show the company name as the client's primary name. Example: false.
- `last_name` (`string`, optional): Last name of the client. Example: Smith.
- `phones` (`array`, optional): Phone numbers to add. Each entry has a number, an optional description (MAIN, WORK, MOBILE, HOME, FAX or OTHER), an optional primary flag and an optional smsAllowed flag. Example: [{"number": "555-123-4567", "description": "MOBILE", "primary": true, "smsAllowed": true}].
- `properties` (`array`, optional): Service properties to create for the client. Each entry needs an address object (street1, street2, city, province, postalCode, country) and can have a name. Example: [{"name": "Home", "address": {"street1": "123 Main St", "city": "Austin", "province": "TX", "postalCode": "78701"}}].
- `receives_reminders` (`boolean`, optional): Whether the client receives visit and assessment reminders. Example: true.
- `title` (`string`, optional): Honorific title: MR, MS, MRS, MISS or DR. Example: MS. One of: `MR`, `MS`, `MRS`, `MISS`, `DR`.

Example input: `{}`

### `jobber_client_note_create`

Create Client Note · Write

Add an internal note to a Jobber client.
Returns the new note's id, message and creation time, plus userErrors when Jobber rejects the input.
Use it to record context on a client. Notes are visible to the team, not the client.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `client_id` (`string`, required): Jobber encoded ID of the client. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL0NsaWVudC8xMjM0NTY3OA==.
- `message` (`string`, required): Text of the note to add to the client. Example: Customer asked to use the side gate.
- `pinned` (`boolean`, optional): Set to true to pin the note to the top of the notes list. Example: false.

Example input: `{"client_id":"<client_id>","message":"<message>"}`

### `jobber_client_unarchive`

Unarchive Client · Write

Restore an archived Jobber client to the active client list.
Returns the client's id and archived flag, plus userErrors when the client cannot be restored.
Use it to undo jobber_client_archive.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `client_id` (`string`, required): Jobber encoded ID of the archived client to restore. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL0NsaWVudC8xMjM0NTY3OA==.

Example input: `{"client_id":"<client_id>"}`

### `jobber_client_update`

Update Client · Write

Update an existing Jobber client's names, company, billing address, contact preferences, tags, emails or phones.
Returns the updated client's details, plus userErrors when Jobber rejects the input.
Use it to change a client. Use jobber_client_create to add a new client.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `client_id` (`string`, required): Jobber encoded ID of the client to update. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL0NsaWVudC8xMjM0NTY3OA==.
- `billing_address` (`object`, optional): New billing address. Street address with street1, street2, city, province (state or province), postalCode and country. All parts are optional strings. Example: {"street1": "123 Main St", "city": "Austin", "province": "TX", "postalCode": "78701", "country": "United States"}.
- `company_name` (`string`, optional): New company name. Example: Smith Landscaping.
- `emails_to_add` (`array`, optional): Email addresses to add. Each entry has an address, an optional description (MAIN, WORK, PERSONAL or OTHER) and an optional primary flag. Example: [{"address": "jane@example.com", "description": "MAIN", "primary": true}].
- `first_name` (`string`, optional): New first name. Example: Jane.
- `is_company` (`boolean`, optional): Set to true to show the company name as the client's primary name. Example: false.
- `last_name` (`string`, optional): New last name. Example: Smith.
- `phones_to_add` (`array`, optional): Phone numbers to add. Each entry has a number, an optional description (MAIN, WORK, MOBILE, HOME, FAX or OTHER), an optional primary flag and an optional smsAllowed flag. Example: [{"number": "555-123-4567", "description": "MOBILE", "primary": true, "smsAllowed": true}].
- `receives_reminders` (`boolean`, optional): Whether the client receives visit and assessment reminders. Example: true.
- `receives_review_requests` (`boolean`, optional): Whether the client receives review requests. Example: false.
- `tags_to_add` (`array`, optional): Tags to add to the client. Example: ["VIP"].
- `tags_to_delete` (`array`, optional): Tags to remove from the client. Example: ["Prospect"].
- `title` (`string`, optional): Honorific title: MR, MS, MRS, MISS or DR. Example: DR. One of: `MR`, `MS`, `MRS`, `MISS`, `DR`.

Example input: `{"client_id":"<client_id>"}`

### `jobber_expense_create`

Create Expense · Write

Record an expense in Jobber, optionally linked to a job or reimbursable to a user.
Returns the new expense's id, title, date, total and links, plus userErrors when Jobber rejects the input.
Use it to log materials or costs. Use jobber_expenses_list to review expenses.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `date` (`string`, required): When the expense was incurred, as an ISO 8601 timestamp. Example: 2026-11-02T00:00:00Z.
- `title` (`string`, required): Title of the expense. Example: Mulch, 10 bags.
- `description` (`string`, optional): Details about the expense. Example: Home Depot receipt 4471.
- `linked_job_id` (`string`, optional): Jobber encoded ID of the job the expense belongs to. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL0pvYi8xMjM0NTY3OA==.
- `reimbursable_to_id` (`string`, optional): Jobber encoded ID of the user to reimburse. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1VzZXIvMTIzNDU2Nzg=.
- `total` (`number`, optional): Total cost of the expense. Example: 89.5.

Example input: `{"date":"<date>","title":"<title>"}`

### `jobber_invoice_create`

Create Invoice · Write

Create an invoice for a Jobber client, either from a job or with its own line items.
Returns the new invoice's id, number, status, amounts and line items, plus userErrors when Jobber rejects the input.
Use it to bill a client. Use jobber_invoice_update to change an invoice.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `client_id` (`string`, required): Jobber encoded ID of the client being invoiced. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL0NsaWVudC8xMjM0NTY3OA==.
- `due_details` (`object`, required): When payment is due. Set invoiceNet to a number of days after issue, or dueDate to an ISO 8601 timestamp. Example: {"invoiceNet": 30}.
- `line_items` (`array`, required): Line items on the invoice. Each item needs a name; most also set quantity and unitPrice. You can add a description, a category (PRODUCT, SERVICE or LABOUR), taxable, a service date, or link an existing catalog item with productOrServiceId. Example: [{"name": "Window cleaning", "quantity": 2, "unitPrice": 60.0, "taxable": true}].
- `tax_calculation_method` (`string`, required): Whether line item prices exclude tax (EXCLUSIVE) or already include it (INCLUSIVE). Example: EXCLUSIVE. One of: `EXCLUSIVE`, `INCLUSIVE`.
- `issued_date` (`string`, optional): Date the invoice is issued, as an ISO 8601 timestamp. Example: 2026-11-02T00:00:00Z.
- `job_id` (`string`, optional): Jobber encoded ID of the job to invoice. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL0pvYi8xMjM0NTY3OA==.
- `mark_sent` (`boolean`, optional): Set to true to mark the invoice as sent (status changes from draft) without emailing it. Example: false.
- `message` (`string`, optional): Message to the client on the invoice. Example: Thank you!
- `property_id` (`string`, optional): Jobber encoded ID of the property for an invoice that has no job. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1Byb3BlcnR5LzEyMzQ1Njc4.
- `subject` (`string`, optional): Subject line of the invoice. Example: November lawn care.
- `tax_rate_id` (`string`, optional): Jobber encoded ID of the tax rate to apply. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1RheFJhdGUvMTIzNDU2Nzg=.

Example input: `{"client_id":"<client_id>","due_details":{"invoiceNet":30},"line_items":[{"name":"Window cleaning","quantity":2,"unitPrice":60,"taxable":true}],"tax_calculation_method":"EXCLUSIVE"}`

### `jobber_invoice_note_create`

Create Invoice Note · Write

Add an internal note to a Jobber invoice.
Returns the new note's id, message and creation time, plus userErrors when Jobber rejects the input.
Use it to record context on a invoice. Notes are visible to the team, not the client.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `invoice_id` (`string`, required): Jobber encoded ID of the invoice. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL0ludm9pY2UvMTIzNDU2Nzg=.
- `message` (`string`, required): Text of the note to add to the invoice. Example: Customer asked to use the side gate.
- `pinned` (`boolean`, optional): Set to true to pin the note to the top of the notes list. Example: false.

Example input: `{"invoice_id":"<invoice_id>","message":"<message>"}`

### `jobber_invoice_update`

Update Invoice · Write

Update a Jobber invoice's subject, message, number, dates, due terms, discount, tax rate or payment options.
Returns the updated invoice, plus userErrors when Jobber rejects the input.
Use it to change an invoice. A discount or tax rate change can change the total.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `invoice_id` (`string`, required): Jobber encoded ID of the invoice to update. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL0ludm9pY2UvMTIzNDU2Nzg=.
- `allow_partial_payments` (`boolean`, optional): Whether the client can pay part of the invoice. Example: true.
- `discount` (`object`, optional): Discount on the invoice with discountRate and discountType (Percent or Unit). Set the rate to 0 to remove it. Example: {"discountRate": 10, "discountType": "Percent"}.
- `due_details` (`object`, optional): New due terms. Set invoiceNet to a number of days after issue, or dueDate to an ISO 8601 timestamp. Example: {"invoiceNet": 15}.
- `invoice_number` (`string`, optional): New invoice number. Example: 2031.
- `issued_date` (`string`, optional): New issued date, as an ISO 8601 timestamp. Example: 2026-11-03T00:00:00Z.
- `message` (`string`, optional): New message to the client. Example: Updated per our call.
- `subject` (`string`, optional): New subject line. Example: November lawn care (revised).
- `tax_rate_id` (`string`, optional): Jobber encoded ID of the tax rate for the invoice. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1RheFJhdGUvMTIzNDU2Nzg=.

Example input: `{"invoice_id":"<invoice_id>"}`

### `jobber_job_close`

Close Job · Write

Close a Jobber job and decide what happens to its incomplete visits.
Returns the job's id, number and new status, plus userErrors when the job cannot be closed.
Use it when the work is finished. Create the invoice with jobber_invoice_create.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `job_id` (`string`, required): Jobber encoded ID of the job to close. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL0pvYi8xMjM0NTY3OA==.
- `modify_incomplete_visits_by` (`string`, required): What to do with incomplete visits: DESTROY_ALL removes them all; COMPLETE_PAST_DESTROY_FUTURE completes past visits and removes future ones. Example: COMPLETE_PAST_DESTROY_FUTURE. One of: `DESTROY_ALL`, `COMPLETE_PAST_DESTROY_FUTURE`.
- `completed_on` (`string`, optional): Date the job was completed (YYYY-MM-DD, account time zone). Defaults to today. Example: 2026-11-02.

Example input: `{"job_id":"<job_id>","modify_incomplete_visits_by":"DESTROY_ALL"}`

### `jobber_job_create`

Create Job · Write

Create a job at a client property in Jobber, with its invoicing setup and optional line items.
Returns the new job's id, number, status, dates and totals, plus userErrors when Jobber rejects the input.
Use it to book work, for example after jobber_quote_approve. Use jobber_job_update to change a job.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `invoicing` (`object`, required): How the job is invoiced. invoicingType is FIXED_PRICE or VISIT_BASED. invoicingSchedule is ON_COMPLETION, PERIODIC, PER_VISIT or NEVER. Example: {"invoicingType": "FIXED_PRICE", "invoicingSchedule": "ON_COMPLETION"}.
- `property_id` (`string`, required): Jobber encoded ID of the client property where the work happens. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1Byb3BlcnR5LzEyMzQ1Njc4.
- `instructions` (`string`, optional): Instructions for the team. Example: Ladder needed.
- `line_items` (`array`, optional): Line items on the job. Each item needs a name, quantity, unitPrice and saveToProductsAndServices (true to also save it to the products and services list). You can add a description, a category (PRODUCT, SERVICE or LABOUR), taxable, or link an existing catalog item with productOrServiceId. Example: [{"name": "Gutter cleaning", "quantity": 1, "unitPrice": 120.0, "saveToProductsAndServices": false}].
- `quote_id` (`string`, optional): Jobber encoded ID of the approved quote this job comes from. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1F1b3RlLzEyMzQ1Njc4.
- `request_id` (`string`, optional): Jobber encoded ID of the request this job comes from. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1JlcXVlc3QvMTIzNDU2Nzg=.
- `salesperson_id` (`string`, optional): Jobber encoded ID of the user who sold the job. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1VzZXIvMTIzNDU2Nzg=.
- `scheduling` (`object`, optional): Visit scheduling. createVisits and notifyTeam are required when you set this. You can also set assignedTo (user ids), startTime and endTime (HH:MM:SS) and a recurrence rule starting with RRULE:. Example: {"createVisits": true, "notifyTeam": false, "startTime": "09:00:00", "endTime": "11:00:00"}.
- `timeframe` (`object`, optional): When the job starts and how long it runs. startAt is a date (YYYY-MM-DD); durationValue is a number of durationUnits (DAYS, WEEKS, MONTHS or YEARS). Example: {"startAt": "2026-11-02", "durationValue": 1, "durationUnits": "DAYS"}.
- `title` (`string`, optional): Title of the job. Example: Gutter cleaning.

Example input: `{"invoicing":{"invoicingType":"FIXED_PRICE","invoicingSchedule":"ON_COMPLETION"},"property_id":"<property_id>"}`

### `jobber_job_note_create`

Create Job Note · Write

Add an internal note to a Jobber job.
Returns the new note's id, message and creation time, plus userErrors when Jobber rejects the input.
Use it to record context on a job. Notes are visible to the team, not the client.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `job_id` (`string`, required): Jobber encoded ID of the job. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL0pvYi8xMjM0NTY3OA==.
- `message` (`string`, required): Text of the note to add to the job. Example: Customer asked to use the side gate.
- `pinned` (`boolean`, optional): Set to true to pin the note to the top of the notes list. Example: false.

Example input: `{"job_id":"<job_id>","message":"<message>"}`

### `jobber_job_update`

Update Job · Write

Update a Jobber job's title, instructions, number, timeframe, invoicing, salesperson or review-request setting.
Returns the updated job, plus userErrors when Jobber rejects the input.
Use it to change a job. Use jobber_job_close to close it.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `job_id` (`string`, required): Jobber encoded ID of the job to update. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL0pvYi8xMjM0NTY3OA==.
- `allow_review_request` (`boolean`, optional): Whether Jobber sends a review request text when the job is done. Example: true.
- `instructions` (`string`, optional): New instructions. They also apply to the job's incomplete visits. Example: Bring a 30 ft ladder.
- `job_number` (`integer`, optional): New job number. Example: 512.
- `salesperson_id` (`string`, optional): Jobber encoded ID of the user who sold the job. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1VzZXIvMTIzNDU2Nzg=.
- `timeframe` (`object`, optional): New start date and duration. startAt is a date (YYYY-MM-DD); durationValue is a number of durationUnits (DAYS, WEEKS, MONTHS or YEARS). Example: {"startAt": "2026-11-09", "durationValue": 2, "durationUnits": "DAYS"}.
- `title` (`string`, optional): New title. Example: Gutter cleaning and repair.

Example input: `{"job_id":"<job_id>"}`

### `jobber_product_create`

Create Product or Service · Write

Add a product or service to the Jobber catalog.
Returns the new item's id, name, category and pricing, plus userErrors when Jobber rejects the input.
Use it to save a reusable line item. Use jobber_product_update to change one.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `default_unit_cost` (`number`, required): Default price per unit charged to clients. Example: 45.0.
- `name` (`string`, required): Name of the product or service. Example: Lawn mowing.
- `category` (`string`, optional): Kind of item: PRODUCT, SERVICE or LABOUR. Example: SERVICE. One of: `PRODUCT`, `SERVICE`, `LABOUR`.
- `description` (`string`, optional): Description shown on line items. Example: Mow, edge and blow.
- `duration_minutes` (`integer`, optional): Time to deliver the service, in minutes. Example: 60.
- `internal_unit_cost` (`number`, optional): Your internal cost per unit, used for margins. Example: 20.0.
- `markup` (`number`, optional): Default markup percentage. Example: 25.
- `taxable` (`boolean`, optional): Whether the item is taxable. Example: true.

Example input: `{"default_unit_cost":45,"name":"<name>"}`

### `jobber_product_update`

Update Product or Service · Write

Update a product or service in the Jobber catalog: name, description, pricing, category, taxable or visible.
Returns the updated item, plus userErrors when Jobber rejects the input.
Use it to change catalog pricing. Existing quotes and invoices keep their old prices.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `product_id` (`string`, required): Jobber encoded ID of the product or service to update. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1Byb2R1Y3RPclNlcnZpY2UvMTIzNDU2Nzg=.
- `category` (`string`, optional): Kind of item: PRODUCT, SERVICE or LABOUR. Example: SERVICE. One of: `PRODUCT`, `SERVICE`, `LABOUR`.
- `default_unit_cost` (`number`, optional): New default price per unit. Example: 55.0.
- `description` (`string`, optional): New description. Example: Mow, edge, trim and blow.
- `internal_unit_cost` (`number`, optional): New internal cost per unit. Example: 25.0.
- `name` (`string`, optional): New name. Example: Lawn mowing (large lot).
- `taxable` (`boolean`, optional): Whether the item is taxable. Example: true.
- `visible` (`boolean`, optional): Set to false to hide the item from the catalog. Example: true.

Example input: `{"product_id":"<product_id>"}`

### `jobber_property_create`

Create Property · Write

Add a service property (job site address) to an existing Jobber client.
Returns the created properties with their ids and addresses, plus userErrors when Jobber rejects the input.
Use it before creating a quote or job at a new address. Use jobber_property_update to change one.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `client_id` (`string`, required): Jobber encoded ID of the client that owns the new property. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL0NsaWVudC8xMjM0NTY3OA==.
- `properties` (`array`, required): Properties to create. Each entry needs an address object (street1, street2, city, province, postalCode, country) and can have a name or a taxRateId. Example: [{"name": "Lake house", "address": {"street1": "9 Shore Rd", "city": "Austin", "province": "TX", "postalCode": "78732"}}].

Example input: `{"client_id":"<client_id>","properties":[{"name":"Lake house","address":{"street1":"9 Shore Rd","city":"Austin","province":"TX","postalCode":"78732"}}]}`

### `jobber_property_update`

Update Property · Write

Update a Jobber service property's name, address or tax rate.
Returns the updated property, plus userErrors when Jobber rejects the input.
Use it to fix a job site address. Use jobber_property_create to add a new one.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `property_id` (`string`, required): Jobber encoded ID of the property to update. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1Byb3BlcnR5LzEyMzQ1Njc4.
- `address` (`object`, optional): New address for the property. Street address with street1, street2, city, province (state or province), postalCode and country. All parts are optional strings. Example: {"street1": "123 Main St", "city": "Austin", "province": "TX", "postalCode": "78701", "country": "United States"}.
- `name` (`string`, optional): New name for the property. Example: Main residence.
- `tax_rate_id` (`string`, optional): Jobber encoded ID of the tax rate to apply to work at this property. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1RheFJhdGUvMTIzNDU2Nzg=.

Example input: `{"property_id":"<property_id>"}`

### `jobber_quote_approve`

Approve Quote · Write

Mark a Jobber quote as approved by the client.
Returns the quote's id, number and new status, plus userErrors when the quote cannot be approved.
Use it after the client accepts. Then create the job with jobber_job_create.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `quote_id` (`string`, required): Jobber encoded ID of the quote to approve. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1F1b3RlLzEyMzQ1Njc4.

Example input: `{"quote_id":"<quote_id>"}`

### `jobber_quote_create`

Create Quote · Write

Create a draft quote with line items for a Jobber client and property.
Returns the new quote's id, number, status, amounts and line items, plus userErrors when Jobber rejects the input.
Use it to price work. Use jobber_quote_update to change a quote and jobber_quote_approve to approve it.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `client_id` (`string`, required): Jobber encoded ID of the client the quote is for. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL0NsaWVudC8xMjM0NTY3OA==.
- `line_items` (`array`, required): Line items on the quote. Each item needs a name and saveToProductsAndServices (true to also save it to the products and services list). Most items also set quantity and unitPrice; you can add a description, a category (PRODUCT, SERVICE or LABOUR), taxable, optional, or link an existing catalog item with productOrServiceId. Example: [{"name": "Lawn mowing", "quantity": 1, "unitPrice": 45.0, "saveToProductsAndServices": false}].
- `property_id` (`string`, required): Jobber encoded ID of the client property the quote is for. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1Byb3BlcnR5LzEyMzQ1Njc4.
- `deposit` (`object`, optional): Required deposit on the quote as an object with a rate and a type. Type Percent treats the rate as a percentage; type Unit treats it as a fixed amount. Example: {"rate": 10, "type": "Percent"}.
- `discount` (`object`, optional): Discount on the quote as an object with a rate and a type. Type Percent treats the rate as a percentage; type Unit treats it as a fixed amount. Example: {"rate": 10, "type": "Percent"}.
- `message` (`string`, optional): Message to the client shown on the quote. Example: Thanks for the opportunity!
- `request_id` (`string`, optional): Jobber encoded ID of the request this quote answers. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1JlcXVlc3QvMTIzNDU2Nzg=.
- `salesperson_id` (`string`, optional): Jobber encoded ID of the user who is the salesperson. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1VzZXIvMTIzNDU2Nzg=.
- `tax_rate_id` (`string`, optional): Jobber encoded ID of the tax rate for the quote. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1RheFJhdGUvMTIzNDU2Nzg=.
- `title` (`string`, optional): Title of the quote. Example: Weekly lawn care.

Example input: `{"client_id":"<client_id>","line_items":[{"name":"Lawn mowing","quantity":1,"unitPrice":45,"saveToProductsAndServices":false}],"property_id":"<property_id>"}`

### `jobber_quote_note_create`

Create Quote Note · Write

Add an internal note to a Jobber quote.
Returns the new note's id, message and creation time, plus userErrors when Jobber rejects the input.
Use it to record context on a quote. Notes are visible to the team, not the client.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `message` (`string`, required): Text of the note to add to the quote. Example: Customer asked to use the side gate.
- `quote_id` (`string`, required): Jobber encoded ID of the quote. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1F1b3RlLzEyMzQ1Njc4.
- `pinned` (`boolean`, optional): Set to true to pin the note to the top of the notes list. Example: false.

Example input: `{"message":"<message>","quote_id":"<quote_id>"}`

### `jobber_quote_update`

Update Quote · Write

Update a Jobber quote's title, message, number, discount, deposit, tax rate or salesperson.
Returns the updated quote, plus userErrors when Jobber rejects the input.
Use it to revise a quote. Line items are not changed by this tool.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `quote_id` (`string`, required): Jobber encoded ID of the quote to update. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1F1b3RlLzEyMzQ1Njc4.
- `deposit` (`object`, optional): Required deposit as an object with a rate and a type. Type Percent treats the rate as a percentage; type Unit treats it as a fixed amount. Example: {"rate": 10, "type": "Percent"}. Set the rate to 0 to remove the deposit.
- `discount` (`object`, optional): Discount on the quote as an object with a rate and a type. Type Percent treats the rate as a percentage; type Unit treats it as a fixed amount. Example: {"rate": 10, "type": "Percent"}. Set the rate to 0 to remove the discount.
- `message` (`string`, optional): New message to the client. Example: Updated per our call.
- `quote_number` (`string`, optional): New quote number. Example: 1042.
- `salesperson_id` (`string`, optional): Jobber encoded ID of the user who is the salesperson. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1VzZXIvMTIzNDU2Nzg=.
- `tax_rate_id` (`string`, optional): Jobber encoded ID of the tax rate for the quote. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1RheFJhdGUvMTIzNDU2Nzg=.
- `title` (`string`, optional): New title. Example: Bi-weekly lawn care.

Example input: `{"quote_id":"<quote_id>"}`

### `jobber_request_create`

Create Request · Write

Create a work request for an existing Jobber client.
Returns the new request's id, title, status, client and property, plus userErrors when Jobber rejects the input.
Use it to log incoming work before quoting. Use jobber_request_update to change a request.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `client_id` (`string`, required): Jobber encoded ID of the client the request is for. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL0NsaWVudC8xMjM0NTY3OA==.
- `property_id` (`string`, optional): Jobber encoded ID of the property for the request. Defaults to the client's most recent property. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1Byb3BlcnR5LzEyMzQ1Njc4.
- `salesperson_id` (`string`, optional): Jobber encoded ID of the user who is the salesperson. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1VzZXIvMTIzNDU2Nzg=.
- `source` (`string`, optional): Channel the request came from: SOCIAL_MEDIA, INTERNAL or EXTERNAL. Example: EXTERNAL. One of: `SOCIAL_MEDIA`, `INTERNAL`, `EXTERNAL`.
- `title` (`string`, optional): Title of the request. Example: Spring cleanup estimate.

Example input: `{"client_id":"<client_id>"}`

### `jobber_request_note_create`

Create Request Note · Write

Add an internal note to a Jobber request.
Returns the new note's id, message and creation time, plus userErrors when Jobber rejects the input.
Use it to record context on a request. Notes are visible to the team, not the client.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `message` (`string`, required): Text of the note to add to the request. Example: Customer asked to use the side gate.
- `request_id` (`string`, required): Jobber encoded ID of the request. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1JlcXVlc3QvMTIzNDU2Nzg=.
- `pinned` (`boolean`, optional): Set to true to pin the note to the top of the notes list. Example: false.

Example input: `{"message":"<message>","request_id":"<request_id>"}`

### `jobber_request_update`

Update Request · Write

Update a Jobber work request's title, property, salesperson or referring client.
Returns the updated request, plus userErrors when Jobber rejects the input.
Use it to change a request. Use jobber_request_create to add one.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `request_id` (`string`, required): Jobber encoded ID of the request to update. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1JlcXVlc3QvMTIzNDU2Nzg=.
- `property_id` (`string`, optional): Jobber encoded ID of the property for the request. It must belong to the same client. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1Byb3BlcnR5LzEyMzQ1Njc4.
- `referring_client_id` (`string`, optional): Jobber encoded ID of the client who referred this request. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL0NsaWVudC8xMjM0NTY3OA==.
- `salesperson_id` (`string`, optional): Jobber encoded ID of the user who is the salesperson. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1VzZXIvMTIzNDU2Nzg=.
- `title` (`string`, optional): New title. Example: Fall cleanup estimate.

Example input: `{"request_id":"<request_id>"}`

### `jobber_task_create`

Create Task · Write

Create a task on the Jobber calendar, optionally linked to a client, property, quote or request.
Returns the new task's id, title, times and completion flag, plus userErrors when Jobber rejects the input.
Use it for to-dos that are not billable visits.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `title` (`string`, required): Title of the task. Example: Call supplier about mulch.
- `all_day` (`boolean`, optional): Set to true for an all-day task. Example: false.
- `assigned_to` (`array`, optional): Users assigned to the task (Jobber encoded user IDs). Example: ["Z2lkOi8vSm9iYmVyL1VzZXIvMTIzNDU2Nzg="].
- `client_id` (`string`, optional): Jobber encoded ID of the client to link the task to. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL0NsaWVudC8xMjM0NTY3OA==.
- `end_at` (`string`, optional): When the task ends, as an ISO 8601 timestamp. Example: 2026-11-03T15:00:00Z.
- `instructions` (`string`, optional): Details of the task. Example: Ask for bulk pricing.
- `property_id` (`string`, optional): Jobber encoded ID of the property to link the task to. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1Byb3BlcnR5LzEyMzQ1Njc4.
- `quote_id` (`string`, optional): Jobber encoded ID of the quote to link the task to. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1F1b3RlLzEyMzQ1Njc4.
- `request_id` (`string`, optional): Jobber encoded ID of the request to link the task to. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1JlcXVlc3QvMTIzNDU2Nzg=.
- `start_at` (`string`, optional): When the task starts, as an ISO 8601 timestamp. Example: 2026-11-03T14:00:00Z.

Example input: `{"title":"<title>"}`

### `jobber_visit_complete`

Complete Visit · Write

Mark a Jobber visit as complete.
Returns the visit's id, status and completion time, plus userErrors when the visit cannot be completed.
Use it when the crew finishes a visit. Use jobber_job_close to close the whole job.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `visit_id` (`string`, required): Jobber encoded ID of the visit to complete. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL1Zpc2l0LzEyMzQ1Njc4.
- `completed_at` (`string`, optional): When the visit was completed, as an ISO 8601 timestamp. Defaults to now. Example: 2026-11-02T15:30:00Z.

Example input: `{"visit_id":"<visit_id>"}`

### `jobber_client_archive`

Archive Client · Destructive

Archive a Jobber client so it no longer appears in active client lists.
Returns the client's id and archived flag, plus userErrors when the client cannot be archived.
Use it to retire a client. Use jobber_client_unarchive to restore it.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `client_id` (`string`, required): Jobber encoded ID of the client to archive. Jobber IDs are base64 strings returned in the id field of list and get tools. Example: Z2lkOi8vSm9iYmVyL0NsaWVudC8xMjM0NTY3OA==.

Example input: `{"client_id":"<client_id>"}`

## Related

Other CRM & Sales connectors ([all 97](/agentkit/connectors/?category=crm-sales)):

- [Insightly](/agentkit/connectors/insightly/): Scalekit connector, API key, 108 tools
- [HubSpot](/agentkit/connectors/hubspot/): Scalekit connector, OAuth, 457 tools
- [Salesforce](/agentkit/connectors/salesforce/): Scalekit connector, OAuth, 74 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
