> **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 JobNimbus

The JobNimbus connector lets your AI agent act in each user's JobNimbus account. Each user connects their own JobNimbus access token once, and Scalekit sends it with every call, so your agent never handles credentials. It comes with 34 tools.

**Authentication:** Bearer Token
**Categories:** CRM & Sales
**Tools:** 34: 23 read, 11 write, 0 destructive
**Users sign in with:** Access token
**Built by:** Scalekit connector
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=JOBNIMBUS)

## 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 JobNimbus connection

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

4. ### 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 = 'jobnimbus'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize JobNimbus:', 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: 'jobnimbus_get_account_settings',
     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 = "jobnimbus"
   identifier = "user_123"

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

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

   ```bash
   python quickstart.py
   ```

   Each user opens the link once and enters their JobNimbus credentials there. 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: 'jobnimbus_get_account_settings',
  toolInput: {},
  connector: 'jobnimbus',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="jobnimbus_get_account_settings",
    tool_input={},
    connection_name="jobnimbus",
    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.

### `jobnimbus_get_account_settings`

Get Account Settings · Read-only

Retrieve the JobNimbus account configuration, including contact, job, and work order workflows with their statuses, lead sources, task types, and custom fields.
Returns the settings object (or only the requested field).
Use before create_contact or create_job to find valid workflow, status, and lead source names.

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

Inputs:

- `field` (`string`, optional): Optional name of one settings section to return, for example groups. All settings are returned when omitted.

Example input: `{}`

### `jobnimbus_get_activity`

Get Activity · Read-only

Retrieve one JobNimbus activity entry (note or status change) by its jnid.
Returns the activity record with note text, activity type, primary record, related records, and creator.
Use when you have an activity jnid. Use list_activities to browse.

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

Inputs:

- `activity_id` (`string`, required): The jnid (JobNimbus unique ID) of the activity.

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

### `jobnimbus_get_contact`

Get Contact · Read-only

Retrieve one JobNimbus contact by its jnid.
Returns the full contact record including names, phone numbers, address, workflow type, status, lead source, sales rep, owners, and custom fields.
Use get_contact when you have a jnid. Use list_contacts to search or browse when you do not.

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

Inputs:

- `contact_id` (`string`, required): The jnid (JobNimbus unique ID) of the contact.

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

### `jobnimbus_get_estimate`

Get Estimate · Read-only

Retrieve one legacy JobNimbus estimate by its jnid.
Returns the estimate record with number, dates, line items, totals, status, and related job or contact.
Use when you have an estimate jnid. Use list_estimates to browse.

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

Inputs:

- `estimate_id` (`string`, required): The jnid (JobNimbus unique ID) of the estimate.

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

### `jobnimbus_get_invoice`

Get Invoice · Read-only

Retrieve one JobNimbus invoice by its jnid.
Returns the invoice record with number, dates, line items, totals, status, and related job or contact.
Use when you have an invoice jnid. Use list_invoices to browse.

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

Inputs:

- `invoice_id` (`string`, required): The jnid (JobNimbus unique ID) of the invoice.

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

### `jobnimbus_get_job`

Get Job · Read-only

Retrieve one JobNimbus job by its jnid.
Returns the full job record including name, number, workflow type, status, address, sales rep, owners, related contacts, and custom fields.
Use get_job when you have a jnid. Use list_jobs to search or browse when you do not.

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

Inputs:

- `job_id` (`string`, required): The jnid (JobNimbus unique ID) of the job.

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

### `jobnimbus_get_material_order`

Get Material Order · Read-only

Retrieve one JobNimbus material order by its jnid.
Returns the material order record with items, notes, owners, and related job or contact.
Use when you have a material order jnid. Use list_material_orders to browse.

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

Inputs:

- `material_order_id` (`string`, required): The jnid (JobNimbus unique ID) of the material order.

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

### `jobnimbus_get_product`

Get Product · Read-only

Retrieve one JobNimbus product by its jnid.
Returns the product record with name, item type, tax status, and units of measure with cost and price.
Use when you have a product jnid. Use list_products to browse.

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

Inputs:

- `product_id` (`string`, required): The jnid (JobNimbus unique ID) of the product.

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

### `jobnimbus_get_task`

Get Task · Read-only

Retrieve one JobNimbus task by its jnid.
Returns the task record with title, task type, dates, priority, completion state, owners, and related records.
Use get_task when you have a jnid. Use list_tasks to browse.

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

Inputs:

- `task_id` (`string`, required): The jnid (JobNimbus unique ID) of the task.

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

### `jobnimbus_get_work_order`

Get Work Order · Read-only

Retrieve one JobNimbus work order by its jnid.
Returns the work order record with number, status, line items, and related job or contact.
Use when you have a work order jnid. Use list_work_orders to browse.

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

Inputs:

- `work_order_id` (`string`, required): The jnid (JobNimbus unique ID) of the work order.

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

### `jobnimbus_list_activities`

List Activities · Read-only

List activity feed entries in JobNimbus such as notes and status changes, optionally filtered by a related contact or job.
Returns a count and an activity array with jnid, note text, activity type, primary record, related records, and creator.
Use to read the history of a contact or job. Use create_activity to add a note.

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

Inputs:

- `fields` (`string`, optional): Comma-separated list of record fields to include in each result, which keeps responses small. All fields are returned when omitted.
- `filter` (`string`, optional): JSON filter in Elasticsearch query syntax, passed as a string. Example: {"must":[{"term":{"status_name":"Lead"}}]}. Use range on date_updated to find recent changes, or term on related.id to find records linked to a contact or job jnid.
- `offset` (`integer`, optional): Zero-based index of the first record to return, used for paging. Pair with size, for example size 25 and offset 25 returns the second page.
- `size` (`integer`, optional): Maximum number of records to return (1-1000). The API returns up to 1000 records when omitted, so set a small value such as 25 to keep responses short.
- `sort_direction` (`string`, optional): Sort direction, asc or desc. The API uses desc when omitted. One of: `asc`, `desc`.
- `sort_field` (`string`, optional): Field to sort by, such as date_created or date_updated. The API sorts by date_created when omitted.

Example input: `{}`

### `jobnimbus_list_contacts`

List Contacts · Read-only

List contacts in JobNimbus, optionally filtered, sorted, or limited to chosen fields.
Returns a count and a results array of contact records with jnid, names, phone, email, address, workflow type, status, and sales rep.
Use list_contacts to browse or filter many contacts. Use get_contact when you already have one contact jnid.

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

Inputs:

- `fields` (`string`, optional): Comma-separated list of record fields to include in each result, which keeps responses small. All fields are returned when omitted.
- `filter` (`string`, optional): JSON filter in Elasticsearch query syntax, passed as a string. Example: {"must":[{"term":{"status_name":"Lead"}}]}. Use range on date_updated to find recent changes, or term on related.id to find records linked to a contact or job jnid.
- `offset` (`integer`, optional): Zero-based index of the first record to return, used for paging. Pair with size, for example size 25 and offset 25 returns the second page.
- `size` (`integer`, optional): Maximum number of records to return (1-1000). The API returns up to 1000 records when omitted, so set a small value such as 25 to keep responses short.
- `sort_direction` (`string`, optional): Sort direction, asc or desc. The API uses desc when omitted. One of: `asc`, `desc`.
- `sort_field` (`string`, optional): Field to sort by, such as date_created or date_updated. The API sorts by date_created when omitted.

Example input: `{}`

### `jobnimbus_list_estimates`

List Estimates · Read-only

List legacy estimates in JobNimbus.
Returns a count and a results array of estimates with jnid, number, dates, totals, status, and related job or contact.
Use list_estimates to browse estimates. Use get_estimate for one estimate jnid.

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

Inputs:

- `offset` (`integer`, optional): Zero-based index of the first record to return, used for paging. Pair with size, for example size 25 and offset 25 returns the second page.
- `size` (`integer`, optional): Maximum number of records to return (1-1000). The API returns up to 1000 records when omitted, so set a small value such as 25 to keep responses short.

Example input: `{}`

### `jobnimbus_list_files`

List Files · Read-only

List file attachment metadata in JobNimbus such as photos and documents.
Returns a count and a files array with jnid, filename, content type, size, and the related contact or job. File contents are not returned.
Use to see which attachments exist on the account. File bytes cannot be downloaded with this tool.

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

Inputs:

- `offset` (`integer`, optional): Zero-based index of the first record to return, used for paging. Pair with size, for example size 25 and offset 25 returns the second page.
- `size` (`integer`, optional): Maximum number of records to return (1-1000). The API returns up to 1000 records when omitted, so set a small value such as 25 to keep responses short.

Example input: `{}`

### `jobnimbus_list_invoices`

List Invoices · Read-only

List invoices in JobNimbus.
Returns a count and a results array of invoices with jnid, number, dates, totals, status, and related job or contact.
Use list_invoices to browse billing. Use get_invoice for one invoice jnid.

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

Inputs:

- `offset` (`integer`, optional): Zero-based index of the first record to return, used for paging. Pair with size, for example size 25 and offset 25 returns the second page.
- `size` (`integer`, optional): Maximum number of records to return (1-1000). The API returns up to 1000 records when omitted, so set a small value such as 25 to keep responses short.

Example input: `{}`

### `jobnimbus_list_jobs`

List Jobs · Read-only

List jobs in JobNimbus, optionally filtered, sorted, or limited to chosen fields.
Returns a count and a results array of job records with jnid, name, number, workflow type, status, address, and sales rep.
Use list_jobs to browse or filter many jobs. Use get_job when you already have one job jnid.

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

Inputs:

- `fields` (`string`, optional): Comma-separated list of record fields to include in each result, which keeps responses small. All fields are returned when omitted.
- `filter` (`string`, optional): JSON filter in Elasticsearch query syntax, passed as a string. Example: {"must":[{"term":{"status_name":"Lead"}}]}. Use range on date_updated to find recent changes, or term on related.id to find records linked to a contact or job jnid.
- `offset` (`integer`, optional): Zero-based index of the first record to return, used for paging. Pair with size, for example size 25 and offset 25 returns the second page.
- `size` (`integer`, optional): Maximum number of records to return (1-1000). The API returns up to 1000 records when omitted, so set a small value such as 25 to keep responses short.
- `sort_direction` (`string`, optional): Sort direction, asc or desc. The API uses desc when omitted. One of: `asc`, `desc`.
- `sort_field` (`string`, optional): Field to sort by, such as date_created or date_updated. The API sorts by date_created when omitted.

Example input: `{}`

### `jobnimbus_list_material_orders`

List Material Orders · Read-only

List material orders in JobNimbus.
Returns the matching material order records with jnid, items, notes, and related job or contact.
Use list_material_orders to browse. Use get_material_order for one jnid.

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

Inputs:

- `offset` (`integer`, optional): Zero-based index of the first record to return, used for paging. Pair with size, for example size 25 and offset 25 returns the second page.
- `size` (`integer`, optional): Maximum number of records to return (1-1000). The API returns up to 1000 records when omitted, so set a small value such as 25 to keep responses short.

Example input: `{}`

### `jobnimbus_list_payments`

List Payments · Read-only

List payments recorded in JobNimbus.
Returns the matching payment records with amounts, dates, and related invoice, job, or contact.
Use list_payments to review money received. Use list_invoices for what was billed.

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

Inputs:

- `offset` (`integer`, optional): Zero-based index of the first record to return, used for paging. Pair with size, for example size 25 and offset 25 returns the second page.
- `size` (`integer`, optional): Maximum number of records to return (1-1000). The API returns up to 1000 records when omitted, so set a small value such as 25 to keep responses short.

Example input: `{}`

### `jobnimbus_list_products`

List Products · Read-only

List the product catalog items in JobNimbus.
Returns a count and a results array of products with jnid, name, item type, and units of measure with cost and price.
Use list_products to browse the catalog. Use get_product for one product jnid.

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

Inputs:

- `offset` (`integer`, optional): Zero-based index of the first record to return, used for paging. Pair with size, for example size 25 and offset 25 returns the second page.
- `size` (`integer`, optional): Maximum number of records to return (1-1000). The API returns up to 1000 records when omitted, so set a small value such as 25 to keep responses short.

Example input: `{}`

### `jobnimbus_list_tasks`

List Tasks · Read-only

List tasks and calendar appointments in JobNimbus, optionally filtered or sorted.
Returns a count and a results array of task records with jnid, title, task type, start and end dates, completion state, owners, and related contacts or jobs.
Use list_tasks to browse. Use get_task for a single task jnid.

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

Inputs:

- `fields` (`string`, optional): Comma-separated list of record fields to include in each result, which keeps responses small. All fields are returned when omitted.
- `filter` (`string`, optional): JSON filter in Elasticsearch query syntax, passed as a string. Example: {"must":[{"term":{"status_name":"Lead"}}]}. Use range on date_updated to find recent changes, or term on related.id to find records linked to a contact or job jnid.
- `offset` (`integer`, optional): Zero-based index of the first record to return, used for paging. Pair with size, for example size 25 and offset 25 returns the second page.
- `size` (`integer`, optional): Maximum number of records to return (1-1000). The API returns up to 1000 records when omitted, so set a small value such as 25 to keep responses short.
- `sort_direction` (`string`, optional): Sort direction, asc or desc. The API uses desc when omitted. One of: `asc`, `desc`.
- `sort_field` (`string`, optional): Field to sort by, such as date_created or date_updated. The API sorts by date_created when omitted.

Example input: `{}`

### `jobnimbus_list_uoms`

List Units of Measure · Read-only

List the units of measure configured in the JobNimbus account.
Returns an array of unit codes such as SQ.
Use to find valid uom values when creating products, invoices, or line items.

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

Inputs: none.

Example input: `{}`

### `jobnimbus_list_users`

List Users · Read-only

List the users (team members) of the JobNimbus account.
Returns a users array with id (the user jnid), name, email, calendar color, and active flag.
Use to find user jnids for sales_rep, owner_ids, or task assignment.

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

Inputs: none.

Example input: `{}`

### `jobnimbus_list_work_orders`

List Work Orders · Read-only

List work orders in JobNimbus.
Returns the matching work order records with jnid, number, status, line items, and related job or contact.
Use list_work_orders to browse. Use get_work_order for one work order jnid.

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

Inputs:

- `offset` (`integer`, optional): Zero-based index of the first record to return, used for paging. Pair with size, for example size 25 and offset 25 returns the second page.
- `size` (`integer`, optional): Maximum number of records to return (1-1000). The API returns up to 1000 records when omitted, so set a small value such as 25 to keep responses short.

Example input: `{}`

### `jobnimbus_create_activity`

Create Activity · Write

Add a note activity to a JobNimbus contact or job.
Returns the created activity record including its jnid.
Use to log a note against a contact or job. Use list_activities to read existing notes.

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

Inputs:

- `note` (`string`, required): Text of the note.
- `primary_id` (`string`, required): The jnid of the contact or job the note is attached to. Sent as primary.id.
- `record_type_name` (`string`, required): Activity type name, usually Note.
- `date_created` (`integer`, optional): Optional creation time as a Unix timestamp in seconds. Defaults to the current time.

Example input: `{"note":"<note>","primary_id":"<primary_id>","record_type_name":"<record_type_name>"}`

### `jobnimbus_create_contact`

Create Contact · Write

Create a new contact in JobNimbus.
Returns the created contact record including its new jnid.
Use to add a customer or lead. Use update_contact to change an existing contact. Look up valid workflow and status names with get_account_settings first.

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

Inputs:

- `record_type_name` (`string`, required): Name of the contact workflow the contact belongs to, such as Customer. It must match a contact workflow defined in the JobNimbus account (see get_account_settings).
- `status_name` (`string`, required): Status within the chosen workflow, such as Lead. It must exist in that workflow (see get_account_settings).
- `additional_fields` (`object`, optional): Extra fields to send on the contact, as a JSON object of field name to value. Use this for custom fields (by their label in JobNimbus, for example Claim Number) and for any other field the JobNimbus API accepts that is not listed above. Example: {"Claim Number": "124523-f"}.
- `address_line1` (`string`, optional): Street address, first line.
- `address_line2` (`string`, optional): Street address, second line such as an apartment or suite.
- `city` (`string`, optional): City.
- `company` (`string`, optional): Company name of the contact. A first name, last name, display name, or company is required on create.
- `country_name` (`string`, optional): Country name.
- `description` (`string`, optional): Free-text description or notes for the contact.
- `display_name` (`string`, optional): Display name shown in JobNimbus. Use when you do not have separate first and last names.
- `email` (`string`, optional): Email address of the contact.
- `first_name` (`string`, optional): Contact first name.
- `home_phone` (`string`, optional): Home phone number.
- `last_name` (`string`, optional): Contact last name.
- `mobile_phone` (`string`, optional): Mobile phone number.
- `sales_rep` (`string`, optional): The jnid of the JobNimbus user assigned as sales rep. Use jobnimbus_list_users to find user IDs.
- `source_name` (`string`, optional): Lead source name. It must match a lead source defined in the JobNimbus account settings, for example Referral.
- `state_text` (`string`, optional): State or province, usually the two-letter code.
- `website` (`string`, optional): Website of the contact or company.
- `work_phone` (`string`, optional): Work phone number.
- `zip` (`string`, optional): Postal or ZIP code.

Example input: `{"record_type_name":"<record_type_name>","status_name":"<status_name>"}`

### `jobnimbus_create_invoice`

Create Invoice · Write

Create an invoice on a JobNimbus job.
Returns the created invoice record including its jnid.
Use to bill a job. Use update_invoice to change an existing invoice.

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

Inputs:

- `items` (`array`, required): Line items on the document. Each item has a name, description, uom (unit of measure such as Items), item_type (material or labor), quantity, and price. Example: [{"name": "Services", "description": "Shake siding", "uom": "Items", "item_type": "material", "quantity": 1, "price": 1303}].
- `job_id` (`string`, required): The jnid of the job the invoice belongs to. Sent as related[0] with type job.
- `additional_fields` (`object`, optional): Extra fields to send on the invoice, as a JSON object of field name to value. Use this for custom fields (by their label in JobNimbus, for example Claim Number) and for any other field the JobNimbus API accepts that is not listed above. Example: {"external_id": "993479"}.
- `date_due` (`integer`, optional): Due date as a Unix timestamp in seconds.
- `date_invoice` (`integer`, optional): Invoice date as a Unix timestamp in seconds.
- `internal_note` (`string`, optional): Internal note, not shown to the customer.
- `is_active` (`boolean`, optional): Set to false to archive (soft delete) the invoice.
- `number` (`string`, optional): Invoice number shown to the customer.
- `status` (`integer`, optional): Numeric invoice status code as used by JobNimbus, for example 1.

Example input: `{"items":[{"name":"Services","description":"Shake siding","uom":"Items","item_type":"material","quantity":1,"price":1303}],"job_id":"<job_id>"}`

### `jobnimbus_create_job`

Create Job · Write

Create a new job in JobNimbus, usually linked to a contact.
Returns the created job record including its new jnid.
Use to start a project for a customer. Use update_job to change an existing job. Look up valid workflow and status names with get_account_settings first.

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

Inputs:

- `name` (`string`, required): Name of the job.
- `record_type_name` (`string`, required): Name of the job workflow the job belongs to. It must match a job workflow defined in the JobNimbus account (see get_account_settings).
- `status_name` (`string`, required): Status within the chosen workflow, such as Lead. It must exist in that workflow.
- `additional_fields` (`object`, optional): Extra fields to send on the job, as a JSON object of field name to value. Use this for custom fields (by their label in JobNimbus, for example Claim Number) and for any other field the JobNimbus API accepts that is not listed above. Example: {"Date of Loss": 1550692800}.
- `address_line1` (`string`, optional): Job site street address, first line.
- `address_line2` (`string`, optional): Job site street address, second line.
- `city` (`string`, optional): Job site city.
- `country_name` (`string`, optional): Job site country name.
- `description` (`string`, optional): Free-text description of the job.
- `primary_contact_id` (`string`, optional): The jnid of the contact this job belongs to. It is sent as primary.id.
- `sales_rep` (`string`, optional): The jnid of the JobNimbus user assigned as sales rep. Use list_users to find user IDs.
- `source_name` (`string`, optional): Lead source name. Must match a lead source defined in the account.
- `state_text` (`string`, optional): Job site state or province.
- `zip` (`string`, optional): Job site postal code.

Example input: `{"name":"<name>","record_type_name":"<record_type_name>","status_name":"<status_name>"}`

### `jobnimbus_create_product`

Create Product · Write

Create a product in the JobNimbus catalog.
Returns the created product record including its jnid.
Use to add a catalog item used on estimates and invoices. Use update_product to change an existing one.

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

Inputs:

- `name` (`string`, required): Product name. Keep it under 32 characters if the account syncs with QuickBooks.
- `description` (`string`, optional): Product description.
- `is_active` (`boolean`, optional): Whether the product is active. Set to false to archive it.
- `item_type` (`string`, optional): Whether the product is material, labor, or both. It is always material unless labor and material is enabled in the account. One of: `material`, `labor`, `labor+material`.
- `location_id` (`integer`, optional): ID of the account location the product belongs to.
- `tax_exempt` (`boolean`, optional): Whether the product is exempt from tax.
- `uoms` (`array`, optional): List of units of measure the product is sold in. Each entry has a uom code (for example SQ, see list_uoms), and a material and/or labor object that each hold a cost and a price. Example: [{"uom": "SQ", "material": {"cost": 10, "price": 20}, "labor": {"cost": 5, "price": 10}}].

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

### `jobnimbus_create_task`

Create Task · Write

Create a task or calendar appointment in JobNimbus.
Returns the created task record including its new jnid.
Use to schedule follow-ups or appointments against a contact or job. Use update_task to reschedule or complete an existing task.

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

Inputs:

- `date_start` (`integer`, required): Start time as a Unix timestamp in seconds.
- `record_type_name` (`string`, required): Name of the task type, such as Appointment or Task. It must match a task type defined in the JobNimbus account.
- `title` (`string`, required): Title of the task.
- `additional_fields` (`object`, optional): Extra fields to send on the task, as a JSON object of field name to value. Use this for custom fields (by their label in JobNimbus, for example Claim Number) and for any other field the JobNimbus API accepts that is not listed above. Example: {"hide_from_tasklist": false}.
- `date_end` (`integer`, optional): End time as a Unix timestamp in seconds. Use 0 or omit for no end time.
- `description` (`string`, optional): Longer description or notes for the task.
- `owner_ids` (`array`, optional): List of user jnids assigned to the task. Each is sent as owners[].id. Use list_users to find IDs.
- `priority` (`integer`, optional): Task priority. 0 is the default priority.
- `related_ids` (`array`, optional): List of jnids of the contacts or jobs this task relates to. Each is sent as related[].id.

Example input: `{"date_start":1,"record_type_name":"<record_type_name>","title":"<title>"}`

### `jobnimbus_update_contact`

Update Contact · Write

Update fields on an existing JobNimbus contact, or archive it.
Returns the updated contact record.
Use to change contact details, move it to another status, or set is_active to false to archive it. Use create_contact for new contacts.

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

Inputs:

- `contact_id` (`string`, required): The jnid (JobNimbus unique ID) of the contact to update.
- `additional_fields` (`object`, optional): Extra fields to send on the contact, as a JSON object of field name to value. Use this for custom fields (by their label in JobNimbus, for example Claim Number) and for any other field the JobNimbus API accepts that is not listed above. Example: {"Claim Number": "124523-f"}.
- `address_line1` (`string`, optional): Street address, first line.
- `address_line2` (`string`, optional): Street address, second line such as an apartment or suite.
- `city` (`string`, optional): City.
- `company` (`string`, optional): Company name of the contact. A first name, last name, display name, or company is required on create.
- `country_name` (`string`, optional): Country name.
- `description` (`string`, optional): Free-text description or notes for the contact.
- `display_name` (`string`, optional): Display name shown in JobNimbus. Use when you do not have separate first and last names.
- `email` (`string`, optional): Email address of the contact.
- `first_name` (`string`, optional): Contact first name.
- `home_phone` (`string`, optional): Home phone number.
- `is_active` (`boolean`, optional): Set to false to archive (soft delete) the contact. Set to true to restore it.
- `last_name` (`string`, optional): Contact last name.
- `mobile_phone` (`string`, optional): Mobile phone number.
- `record_type_name` (`string`, optional): Contact workflow name to move the contact to. Must match an existing contact workflow.
- `sales_rep` (`string`, optional): The jnid of the JobNimbus user assigned as sales rep. Use jobnimbus_list_users to find user IDs.
- `source_name` (`string`, optional): Lead source name. It must match a lead source defined in the JobNimbus account settings, for example Referral.
- `state_text` (`string`, optional): State or province, usually the two-letter code.
- `status_name` (`string`, optional): New status within the contact workflow, such as Estimating.
- `website` (`string`, optional): Website of the contact or company.
- `work_phone` (`string`, optional): Work phone number.
- `zip` (`string`, optional): Postal or ZIP code.

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

### `jobnimbus_update_invoice`

Update Invoice · Write

Update an existing JobNimbus invoice, or archive it.
Returns the updated invoice record.
Use to change dates, notes, status, or line items on an invoice you already have. Use create_invoice for new invoices.

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

Inputs:

- `invoice_id` (`string`, required): The jnid (JobNimbus unique ID) of the invoice to update.
- `additional_fields` (`object`, optional): Extra fields to send on the invoice, as a JSON object of field name to value. Use this for custom fields (by their label in JobNimbus, for example Claim Number) and for any other field the JobNimbus API accepts that is not listed above. Example: {"external_id": "993479"}.
- `date_due` (`integer`, optional): Due date as a Unix timestamp in seconds.
- `date_invoice` (`integer`, optional): Invoice date as a Unix timestamp in seconds.
- `internal_note` (`string`, optional): Internal note, not shown to the customer.
- `is_active` (`boolean`, optional): Set to false to archive (soft delete) the invoice.
- `items` (`array`, optional): Line items on the document. Each item has a name, description, uom (unit of measure such as Items), item_type (material or labor), quantity, and price. Example: [{"name": "Services", "description": "Shake siding", "uom": "Items", "item_type": "material", "quantity": 1, "price": 1303}].
- `number` (`string`, optional): Invoice number shown to the customer.
- `status` (`integer`, optional): Numeric invoice status code as used by JobNimbus, for example 1.

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

### `jobnimbus_update_job`

Update Job · Write

Update fields on an existing JobNimbus job, or archive it.
Returns the updated job record.
Use to rename a job, change its status, reassign the sales rep, or set is_active to false to archive it. Use create_job for new jobs.

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

Inputs:

- `job_id` (`string`, required): The jnid (JobNimbus unique ID) of the job to update.
- `additional_fields` (`object`, optional): Extra fields to send on the job, as a JSON object of field name to value. Use this for custom fields (by their label in JobNimbus, for example Claim Number) and for any other field the JobNimbus API accepts that is not listed above. Example: {"Date of Loss": 1550692800}.
- `address_line1` (`string`, optional): Job site street address, first line.
- `address_line2` (`string`, optional): Job site street address, second line.
- `city` (`string`, optional): Job site city.
- `country_name` (`string`, optional): Job site country name.
- `description` (`string`, optional): Free-text description of the job.
- `is_active` (`boolean`, optional): Set to false to archive (soft delete) the job. Set to true to restore it.
- `name` (`string`, optional): Name of the job.
- `primary_contact_id` (`string`, optional): The jnid of the contact this job belongs to. It is sent as primary.id.
- `record_type_name` (`string`, optional): Job workflow name to move the job to. Must match an existing job workflow.
- `sales_rep` (`string`, optional): The jnid of the JobNimbus user assigned as sales rep. Use list_users to find user IDs.
- `source_name` (`string`, optional): Lead source name. Must match a lead source defined in the account.
- `state_text` (`string`, optional): Job site state or province.
- `status_name` (`string`, optional): New status within the job workflow, such as Estimating.
- `zip` (`string`, optional): Job site postal code.

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

### `jobnimbus_update_product`

Update Product · Write

Update an existing product in the JobNimbus catalog, or archive it.
Returns the updated product record.
Use to change price, units of measure, or other details, or set is_active to false to archive. Use create_product for new products.

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

Inputs:

- `product_id` (`string`, required): The jnid (JobNimbus unique ID) of the product to update.
- `description` (`string`, optional): Product description.
- `is_active` (`boolean`, optional): Whether the product is active. Set to false to archive it.
- `item_type` (`string`, optional): Whether the product is material, labor, or both. It is always material unless labor and material is enabled in the account. One of: `material`, `labor`, `labor+material`.
- `location_id` (`integer`, optional): ID of the account location the product belongs to.
- `name` (`string`, optional): Product name. Keep it under 32 characters if the account syncs with QuickBooks.
- `tax_exempt` (`boolean`, optional): Whether the product is exempt from tax.
- `uoms` (`array`, optional): List of units of measure the product is sold in. Each entry has a uom code (for example SQ, see list_uoms), and a material and/or labor object that each hold a cost and a price. Example: [{"uom": "SQ", "material": {"cost": 10, "price": 20}, "labor": {"cost": 5, "price": 10}}].

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

### `jobnimbus_update_task`

Update Task · Write

Update an existing JobNimbus task, for example to reschedule, reassign, complete, or archive it.
Returns the updated task record.
Use to change fields on a task you already have. Use create_task for new tasks.

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

Inputs:

- `task_id` (`string`, required): The jnid (JobNimbus unique ID) of the task to update.
- `additional_fields` (`object`, optional): Extra fields to send on the task, as a JSON object of field name to value. Use this for custom fields (by their label in JobNimbus, for example Claim Number) and for any other field the JobNimbus API accepts that is not listed above. Example: {"hide_from_tasklist": false}.
- `date_end` (`integer`, optional): End time as a Unix timestamp in seconds. Use 0 or omit for no end time.
- `date_start` (`integer`, optional): New start time as a Unix timestamp in seconds.
- `description` (`string`, optional): Longer description or notes for the task.
- `is_active` (`boolean`, optional): Set to false to archive (soft delete) the task.
- `is_completed` (`boolean`, optional): Set to true to mark the task completed.
- `owner_ids` (`array`, optional): List of user jnids assigned to the task. Each is sent as owners[].id. Use list_users to find IDs.
- `priority` (`integer`, optional): Task priority. 0 is the default priority.
- `record_type_name` (`string`, optional): Task type name to change to. Must match an existing task type.
- `related_ids` (`array`, optional): List of jnids of the contacts or jobs this task relates to. Each is sent as related[].id.
- `title` (`string`, optional): New title of the task.

Example input: `{"task_id":"<task_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 |
