Look up Kickserv customers, jobs, notes and time entries, and create jobs, tasks and charges.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
WRITE: add a note to a customer. Set `public` to true to make it visible to the customer. Kickserv: POST /{account}/customers/{customer_number}/notes.xml.
Note text.
Customer number.
True to make the note public (customer-visible).
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
WRITE: add a note to a customer. Set `public` to true to make it visible to the customer. Kickserv: POST /{account}/customers/{customer_number}/notes.xml.
| Argument | Type | Description |
|---|---|---|
| note* | string | Note text. |
| public | boolean | True to make the note public (customer-visible). |
| customer_number* | integer | Customer number. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"customer_number",
"note"
],
"properties": {
"note": {
"type": "string",
"maxLength": 20000,
"minLength": 1,
"description": "Note text."
},
"public": {
"type": "boolean",
"description": "True to make the note public (customer-visible)."
},
"customer_number": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Customer number.",
"exclusiveMinimum": 0
}
}
}WRITE: add a charge (line item — a product, service or part) to a job. This changes the job's estimate/invoice total; it does NOT charge the customer's card. Pick `item_id` from kickserv_list_items. Kickserv: POST /{account}/jobs/{job_number}/job_charges.xml.
| Argument | Type | Description |
|---|---|---|
| details | string | Line-item details. |
| item_id | integer | Item `id` from kickserv_list_items. |
| discount | number | Discount. |
| quantity | number | Quantity. |
| job_number* | integer | Job number. |
| description | string | Line-item description. |
| price_per_unit | number | Unit price. |
| job_charge_type_id* | integer | Job charge type id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"job_number",
"job_charge_type_id"
],
"properties": {
"details": {
"type": "string",
"maxLength": 5000,
"description": "Line-item details."
},
"item_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Item `id` from kickserv_list_items.",
"exclusiveMinimum": 0
},
"discount": {
"type": "number",
"maximum": 10000000,
"minimum": 0,
"description": "Discount."
},
"quantity": {
"type": "number",
"maximum": 1000000,
"minimum": 0,
"description": "Quantity."
},
"job_number": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Job number.",
"exclusiveMinimum": 0
},
"description": {
"type": "string",
"maxLength": 1000,
"description": "Line-item description."
},
"price_per_unit": {
"type": "number",
"maximum": 10000000,
"minimum": 0,
"description": "Unit price."
},
"job_charge_type_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Job charge type id.",
"exclusiveMinimum": 0
}
}
}WRITE: add a note to a job. Set `public` to true to make it visible to the customer. Kickserv: POST /{account}/jobs/{job_number}/notes.xml.
| Argument | Type | Description |
|---|---|---|
| note* | string | Note text. |
| public | boolean | True to make the note public (customer-visible). |
| job_number* | integer | Job number. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"job_number",
"note"
],
"properties": {
"note": {
"type": "string",
"maxLength": 20000,
"minLength": 1,
"description": "Note text."
},
"public": {
"type": "boolean",
"description": "True to make the note public (customer-visible)."
},
"job_number": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Job number.",
"exclusiveMinimum": 0
}
}
}WRITE: create a new customer. Kickserv assigns the customer number. Kickserv: POST /{account}/customers.xml.
| Argument | Type | Description |
|---|---|---|
| fax | string | Fax number. |
| name* | string | Customer name (required). |
| mobile | string | Mobile number. |
| company | boolean | True if the customer is a company rather than a person. |
| contact | string | Primary contact name. |
| is_active | boolean | False to mark the customer inactive (reversible). |
| last_name | string | Contact last name. |
| first_name | string | Contact first name. |
| alt_contact | string | Alternate contact name. |
| billing_city | string |
WRITE: create a job (work order) for a customer. `customer_id` is the customer's internal `id` (from kickserv_get_customer), not the customer number; `job_type_id` is the job category. Set `estimate` to create it as an estimate. Kickserv: POST /{account}/jobs.xml.
| Argument | Type | Description |
|---|---|---|
| name | string | Job name/title. |
| ends_at | string | When the job ends. A date/time string Kickserv can parse, e.g. `2026-10-02 09:30` or `10/2/2026 09:30am`. |
| duration | number | Job duration. |
| estimate | boolean | True to create the job as an estimate. |
| po_number | string | Customer purchase-order number. |
| customer_id* | integer | The customer's internal `id` (NOT the customer_number). |
| description | string | Job description / work to be done. |
| job_type_id* | integer | Job category (job type) id. |
WRITE: create a task (appointment / to-do) on a job and optionally assign employees. `job_id` is the job's internal `id` (from kickserv_get_job), not the job number. Kickserv: POST /{account}/tasks.xml.
| Argument | Type | Description |
|---|---|---|
| name* | string | Task name. |
| job_id* | integer | The job's internal `id` (NOT the job_number). |
| ends_at | string | When the task ends. A date/time string Kickserv can parse, e.g. `2026-10-02 09:30` or `10/2/2026 09:30am`. |
| duration | integer | Task duration. |
| customer_id | integer | The customer's internal `id`. |
| description | string | Task description. |
| employee_ids | array | Employee `id`s (from kickserv_list_employees) to assign. Replaces the current assignment. |
| scheduled_at | string | When the task is scheduled. A date/time string Kickserv can parse, e.g. `2026-10-02 09:30` or `10/2/2026 09:30am`. |
Fetch one customer by customer number, optionally with related contacts, jobs, tasks and notes. The result's `id` is what job/task create calls need as `customer_id`. Kickserv: GET /{account}/customers/{customer_number}.xml.
| Argument | Type | Description |
|---|---|---|
| include | array | Related data to embed: contacts, jobs, tasks, notes, tax_entity, custom_field_assignments. |
| customer_number* | integer | Customer number (as shown in Kickserv). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"customer_number"
],
"properties": {
"include": {
"type": "array",
"items": {
"enum": [
"contacts",
"jobs",
"tasks",
"notes",
"tax_entity",
"custom_field_assignments"
],
"type": "string"
},
"description": "Related data to embed: contacts, jobs, tasks, notes, tax_entity, custom_field_assignments."
},
"customer_number": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Customer number (as shown in Kickserv).",
"exclusiveMinimum": 0
}
}
}Fetch one job by job number, optionally with its customer, assigned employees, job charges (line items), time entries and notes. Kickserv: GET /{account}/jobs/{job_number}.xml.
| Argument | Type | Description |
|---|---|---|
| include | array | Related data to embed: customer, employees, job_charges, time_entries, notes, job_type, job_status, tax_entity, custom_field_assignments. |
| job_number* | integer | Job number (as shown in Kickserv). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"job_number"
],
"properties": {
"include": {
"type": "array",
"items": {
"enum": [
"customer",
"employees",
"job_charges",
"time_entries",
"notes",
"job_type",
"job_status",
"tax_entity",
"custom_field_assignments"
],
"type": "string"
},
"description": "Related data to embed: customer, employees, job_charges, time_entries, notes, job_type, job_status, tax_entity, custom_field_assignments."
},
"job_number": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Job number (as shown in Kickserv).",
"exclusiveMinimum": 0
}
}
}Fetch one task (appointment / to-do attached to a job) by id. Kickserv: GET /{account}/tasks/{task_id}.xml.
| Argument | Type | Description |
|---|---|---|
| task_id* | integer | Task id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"task_id"
],
"properties": {
"task_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Task id.",
"exclusiveMinimum": 0
}
}
}List the jobs for one customer, 30 per page. Kickserv: GET /{account}/customers/{customer_number}/jobs.xml.
| Argument | Type | Description |
|---|---|---|
| only | string | Comma-separated list of columns to return, e.g. `customer_number,name`. Kickserv recommends this: it makes responses much smaller and faster. |
| page | integer | Page number (Kickserv returns 30 records per page). Omit for page 1. |
| include | array | Related data to embed: customer, employees, job_charges, time_entries, notes, job_type, job_status, tax_entity, custom_field_assignments. |
| customer_number* | integer | Customer number. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"customer_number"
],
"properties": {
"only": {
"type": "string",
"pattern": "^[a-z0-9_]+(,[a-z0-9_]+)*$",
"description": "Comma-separated list of columns to return, e.g. `customer_number,name`. Kickserv recommends this: it makes responses much smaller and faster."
},
"page": {
"type": "integer",
"maximum": 10000,
"minimum": 1,
"description": "Page number (Kickserv returns 30 records per page). Omit for page 1."
},
"include": {
"type": "array",
"items": {
"enum": [
"customer",
"employees",
"job_charges",
"time_entries",
"notes",
"job_type",
"job_status",
"tax_entity",
"custom_field_assignments"
],
"type": "string"
},
"description": "Related data to embed: customer, employees, job_charges, time_entries, notes, job_type, job_status, tax_entity, custom_field_assignments."
},
"customer_number": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Customer number.",
"exclusiveMinimum": 0
}
}
}List the notes on one customer. Kickserv: GET /{account}/customers/{customer_number}/notes.xml.
| Argument | Type | Description |
|---|---|---|
| customer_number* | integer | Customer number. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"customer_number"
],
"properties": {
"customer_number": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Customer number.",
"exclusiveMinimum": 0
}
}
}List or search customers, 30 per page. Every filter is an exact match on that field. Use `only` to keep the response small. Kickserv: GET /{account}/customers.xml.
| Argument | Type | Description |
|---|---|---|
| name | string | Exact customer name. |
| only | string | Comma-separated list of columns to return, e.g. `customer_number,name`. Kickserv recommends this: it makes responses much smaller and faster. |
| page | integer | Page number (Kickserv returns 30 records per page). Omit for page 1. |
| include | array | Related data to embed: contacts, jobs, tasks, notes, tax_entity, custom_field_assignments. |
| billing_city | string | Billing city. |
| phone_number | string | Exact phone number, e.g. 800-555-1212. |
| service_city | string | Service city. |
| billing_state | string | Billing state. |
| email_address | string |
List all employees (technicians and office staff), active and inactive. Use their `id` for job/task assignment and time entries, and `employee_number` to filter jobs. Kickserv: GET /{account}/employees.xml.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}List products/services (the price list used for job charges), 30 per page. Active items only by default. Kickserv: GET /{account}/items.xml.
| Argument | Type | Description |
|---|---|---|
| name | string | Filter by item name. |
| page | integer | Page number (Kickserv returns 30 records per page). Omit for page 1. |
| which | string | Which items to return: active (default), inactive, or all. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"name": {
"type": "string",
"maxLength": 255,
"description": "Filter by item name."
},
"page": {
"type": "integer",
"maximum": 10000,
"minimum": 1,
"description": "Page number (Kickserv returns 30 records per page). Omit for page 1."
},
"which": {
"enum": [
"active",
"inactive",
"all"
],
"type": "string",
"description": "Which items to return: active (default), inactive, or all."
}
}
}List the notes on one job. Kickserv: GET /{account}/jobs/{job_number}/notes.xml.
| Argument | Type | Description |
|---|---|---|
| job_number* | integer | Job number. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"job_number"
],
"properties": {
"job_number": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Job number.",
"exclusiveMinimum": 0
}
}
}List the time entries (hours logged by technicians) on one job. Kickserv: GET /{account}/jobs/{job_number}/time_entries.xml.
| Argument | Type | Description |
|---|---|---|
| job_number* | integer | Job number. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"job_number"
],
"properties": {
"job_number": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Job number.",
"exclusiveMinimum": 0
}
}
}List jobs (work orders, estimates, invoices), 30 per page, filterable by schedule window, status, assigned employee, category (job type) or job status. Kickserv: GET /{account}/jobs.xml.
| Argument | Type | Description |
|---|---|---|
| only | string | Comma-separated list of columns to return, e.g. `customer_number,name`. Kickserv recommends this: it makes responses much smaller and faster. |
| page | integer | Page number (Kickserv returns 30 records per page). Omit for page 1. |
| status | string | Job status. |
| include | array | Related data to embed: customer, employees, job_charges, time_entries, notes, job_type, job_status, tax_entity, custom_field_assignments. |
| scheduled | string | Scheduled-date window, e.g. today or this_week. |
| job_type_id | integer | Only jobs in this category (job type id). |
| job_status_id | integer | Only jobs with this custom job status id. |
| employee_number | integer | Only jobs assigned to this employee number. |
WRITE: log hours worked by an employee on a job. `employee_id` is the employee's `id` from kickserv_list_employees. Kickserv: POST /{account}/jobs/{job_number}/time_entries.xml.
| Argument | Type | Description |
|---|---|---|
| note | string | Note about the work. |
| mileage | number | Mileage driven. |
| billable | boolean | Whether the time is billable. |
| ended_on | string | When the work ended. A date/time string Kickserv can parse, e.g. `2026-10-02 09:30` or `10/2/2026 09:30am`. |
| job_number* | integer | Job number. |
| started_on* | string | When the work started, e.g. `2026-10-02 13:00` or `10/02/2026 01:00pm`. |
| employee_id* | integer | The employee's `id`. |
| number_of_hours* | number | Hours worked, e.g. 1.25. |
| time_entry_type_id |
WRITE: update fields on an existing customer. Only the fields you pass change. Balances, credit limit and custom fields are not settable here. Kickserv: PATCH /{account}/customers/{customer_number}.xml.
| Argument | Type | Description |
|---|---|---|
| fax | string | Fax number. |
| name | string | New customer name. |
| mobile | string | Mobile number. |
| company | boolean | True if the customer is a company rather than a person. |
| contact | string | Primary contact name. |
| is_active | boolean | False to mark the customer inactive (reversible). |
| last_name | string | Contact last name. |
| first_name | string | Contact first name. |
| alt_contact | string | Alternate contact name. |
| billing_city |
WRITE: update an existing job — reschedule it, rename it, change its description, category or custom job status, or reassign employees (employee_ids replaces the assignment). Totals, tax and payment fields are not settable here. Kickserv: PATCH /{account}/jobs/{job_number}.xml.
| Argument | Type | Description |
|---|---|---|
| name | string | Job name/title. |
| ends_at | string | When the job ends. A date/time string Kickserv can parse, e.g. `2026-10-02 09:30` or `10/2/2026 09:30am`. |
| duration | number | Job duration. |
| po_number | string | Customer purchase-order number. |
| job_number* | integer | Job number to update. |
| description | string | Job description / work to be done. |
| job_type_id | integer | New job category (job type) id. |
| employee_ids | array | Employee `id`s (from kickserv_list_employees) to assign. Replaces the current assignment. |
| Billing city. |
| company_name | string | Company name. |
| phone_number | string | Phone number. |
| service_city | string | Service city. |
| billing_state | string | Billing state. |
| email_address | string | Email address. |
| service_state | string | Service state (2-letter abbreviation in the US). |
| account_number | string | Your own account number for the customer. |
| notify_via_sms | boolean | Send the customer SMS notifications. |
| billing_address | string | Billing address (where invoices go), line 1. |
| billing_country | string | Billing country. |
| service_address | string | Service address (where the work happens), line 1. |
| service_country | string | Service country (2-letter code). |
| alt_phone_number | string | Alternate phone number. |
| billing_zip_code | string | Billing ZIP/postal code. |
| customer_type_id | integer | Customer type id. |
| notify_via_email | boolean | Send the customer email notifications. |
| service_zip_code | string | Service ZIP/postal code. |
| billing_address_2 | string | Billing address line 2. |
| service_address_2 | string | Service address line 2. |
| customer_source_id | integer | Customer source (lead source) id. |
| special_instructions | string | Special instructions shown to technicians. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"name"
],
"properties": {
"fax": {
"type": "string",
"maxLength": 64,
"description": "Fax number."
},
"name": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "Customer name (required)."
},
"mobile": {
"type": "string",
"maxLength": 64,
"description": "Mobile number."
},
"company": {
"type": "boolean",
"description": "True if the customer is a company rather than a person."
},
"contact": {
"type": "string",
"maxLength": 255,
"description": "Primary contact name."
},
"is_active": {
"type": "boolean",
"description": "False to mark the customer inactive (reversible)."
},
"last_name": {
"type": "string",
"maxLength": 255,
"description": "Contact last name."
},
"first_name": {
"type": "string",
"maxLength": 255,
"description": "Contact first name."
},
"alt_contact": {
"type": "string",
"maxLength": 255,
"description": "Alternate contact name."
},
"billing_city": {
"type": "string",
"maxLength": 128,
"description": "Billing city."
},
"company_name": {
"type": "string",
"maxLength": 255,
"description": "Company name."
},
"phone_number": {
"type": "string",
"maxLength": 64,
"description": "Phone number."
},
"service_city": {
"type": "string",
"maxLength": 128,
"description": "Service city."
},
"billing_state": {
"type": "string",
"maxLength": 64,
"description": "Billing state."
},
"email_address": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"maxLength": 255,
"description": "Email address."
},
"service_state": {
"type": "string",
"maxLength": 64,
"description": "Service state (2-letter abbreviation in the US)."
},
"account_number": {
"type": "string",
"maxLength": 64,
"description": "Your own account number for the customer."
},
"notify_via_sms": {
"type": "boolean",
"description": "Send the customer SMS notifications."
},
"billing_address": {
"type": "string",
"maxLength": 255,
"description": "Billing address (where invoices go), line 1."
},
"billing_country": {
"type": "string",
"maxLength": 64,
"description": "Billing country."
},
"service_address": {
"type": "string",
"maxLength": 255,
"description": "Service address (where the work happens), line 1."
},
"service_country": {
"type": "string",
"maxLength": 64,
"description": "Service country (2-letter code)."
},
"alt_phone_number": {
"type": "string",
"maxLength": 64,
"description": "Alternate phone number."
},
"billing_zip_code": {
"type": "string",
"maxLength": 32,
"description": "Billing ZIP/postal code."
},
"customer_type_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Customer type id.",
"exclusiveMinimum": 0
},
"notify_via_email": {
"type": "boolean",
"description": "Send the customer email notifications."
},
"service_zip_code": {
"type": "string",
"maxLength": 32,
"description": "Service ZIP/postal code."
},
"billing_address_2": {
"type": "string",
"maxLength": 255,
"description": "Billing address line 2."
},
"service_address_2": {
"type": "string",
"maxLength": 255,
"description": "Service address line 2."
},
"customer_source_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Customer source (lead source) id.",
"exclusiveMinimum": 0
},
"special_instructions": {
"type": "string",
"maxLength": 5000,
"description": "Special instructions shown to technicians."
}
}
}| employee_ids |
| array |
| Employee `id`s (from kickserv_list_employees) to assign. Replaces the current assignment. |
| scheduled_on | string | When the job is scheduled. A date/time string Kickserv can parse, e.g. `2026-10-02 09:30` or `10/2/2026 09:30am`. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"customer_id",
"job_type_id"
],
"properties": {
"name": {
"type": "string",
"maxLength": 255,
"description": "Job name/title."
},
"ends_at": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "When the job ends. A date/time string Kickserv can parse, e.g. `2026-10-02 09:30` or `10/2/2026 09:30am`."
},
"duration": {
"type": "number",
"maximum": 100000,
"minimum": 0,
"description": "Job duration."
},
"estimate": {
"type": "boolean",
"description": "True to create the job as an estimate."
},
"po_number": {
"type": "string",
"maxLength": 64,
"description": "Customer purchase-order number."
},
"customer_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "The customer's internal `id` (NOT the customer_number).",
"exclusiveMinimum": 0
},
"description": {
"type": "string",
"maxLength": 10000,
"description": "Job description / work to be done."
},
"job_type_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Job category (job type) id.",
"exclusiveMinimum": 0
},
"employee_ids": {
"type": "array",
"items": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
"maxItems": 50,
"description": "Employee `id`s (from kickserv_list_employees) to assign. Replaces the current assignment."
},
"scheduled_on": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "When the job is scheduled. A date/time string Kickserv can parse, e.g. `2026-10-02 09:30` or `10/2/2026 09:30am`."
}
}
}| task_type_id* |
| integer |
| Task type id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"job_id",
"name",
"task_type_id"
],
"properties": {
"name": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "Task name."
},
"job_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "The job's internal `id` (NOT the job_number).",
"exclusiveMinimum": 0
},
"ends_at": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "When the task ends. A date/time string Kickserv can parse, e.g. `2026-10-02 09:30` or `10/2/2026 09:30am`."
},
"duration": {
"type": "integer",
"maximum": 100000,
"minimum": 0,
"description": "Task duration."
},
"customer_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "The customer's internal `id`.",
"exclusiveMinimum": 0
},
"description": {
"type": "string",
"maxLength": 10000,
"description": "Task description."
},
"employee_ids": {
"type": "array",
"items": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
"maxItems": 50,
"description": "Employee `id`s (from kickserv_list_employees) to assign. Replaces the current assignment."
},
"scheduled_at": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "When the task is scheduled. A date/time string Kickserv can parse, e.g. `2026-10-02 09:30` or `10/2/2026 09:30am`."
},
"task_type_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Task type id.",
"exclusiveMinimum": 0
}
}
}| Exact email address. |
| service_state | string | Service state (2-letter abbreviation). |
| customer_number | integer | Customer number. |
| service_zip_code | string | Service ZIP (full zip+4 if the record has one). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"name": {
"type": "string",
"maxLength": 255,
"description": "Exact customer name."
},
"only": {
"type": "string",
"pattern": "^[a-z0-9_]+(,[a-z0-9_]+)*$",
"description": "Comma-separated list of columns to return, e.g. `customer_number,name`. Kickserv recommends this: it makes responses much smaller and faster."
},
"page": {
"type": "integer",
"maximum": 10000,
"minimum": 1,
"description": "Page number (Kickserv returns 30 records per page). Omit for page 1."
},
"include": {
"type": "array",
"items": {
"enum": [
"contacts",
"jobs",
"tasks",
"notes",
"tax_entity",
"custom_field_assignments"
],
"type": "string"
},
"description": "Related data to embed: contacts, jobs, tasks, notes, tax_entity, custom_field_assignments."
},
"billing_city": {
"type": "string",
"maxLength": 128,
"description": "Billing city."
},
"phone_number": {
"type": "string",
"maxLength": 64,
"description": "Exact phone number, e.g. 800-555-1212."
},
"service_city": {
"type": "string",
"maxLength": 128,
"description": "Service city."
},
"billing_state": {
"type": "string",
"maxLength": 64,
"description": "Billing state."
},
"email_address": {
"type": "string",
"maxLength": 255,
"description": "Exact email address."
},
"service_state": {
"type": "string",
"maxLength": 64,
"description": "Service state (2-letter abbreviation)."
},
"customer_number": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Customer number.",
"exclusiveMinimum": 0
},
"service_zip_code": {
"type": "string",
"maxLength": 32,
"description": "Service ZIP (full zip+4 if the record has one)."
}
}
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"only": {
"type": "string",
"pattern": "^[a-z0-9_]+(,[a-z0-9_]+)*$",
"description": "Comma-separated list of columns to return, e.g. `customer_number,name`. Kickserv recommends this: it makes responses much smaller and faster."
},
"page": {
"type": "integer",
"maximum": 10000,
"minimum": 1,
"description": "Page number (Kickserv returns 30 records per page). Omit for page 1."
},
"status": {
"enum": [
"unscheduled",
"scheduled",
"in_progress",
"on_hold",
"canceled",
"complete"
],
"type": "string",
"description": "Job status."
},
"include": {
"type": "array",
"items": {
"enum": [
"customer",
"employees",
"job_charges",
"time_entries",
"notes",
"job_type",
"job_status",
"tax_entity",
"custom_field_assignments"
],
"type": "string"
},
"description": "Related data to embed: customer, employees, job_charges, time_entries, notes, job_type, job_status, tax_entity, custom_field_assignments."
},
"scheduled": {
"enum": [
"today",
"tomorrow",
"yesterday",
"this_week",
"next_week",
"last_week",
"this_month",
"next_month",
"last_month",
"this_year",
"last_year"
],
"type": "string",
"description": "Scheduled-date window, e.g. today or this_week."
},
"job_type_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Only jobs in this category (job type id).",
"exclusiveMinimum": 0
},
"job_status_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Only jobs with this custom job status id.",
"exclusiveMinimum": 0
},
"employee_number": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Only jobs assigned to this employee number.",
"exclusiveMinimum": 0
}
}
}| integer |
| Time entry type id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"job_number",
"employee_id",
"started_on",
"number_of_hours"
],
"properties": {
"note": {
"type": "string",
"maxLength": 5000,
"description": "Note about the work."
},
"mileage": {
"type": "number",
"maximum": 100000,
"minimum": 0,
"description": "Mileage driven."
},
"billable": {
"type": "boolean",
"description": "Whether the time is billable."
},
"ended_on": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "When the work ended. A date/time string Kickserv can parse, e.g. `2026-10-02 09:30` or `10/2/2026 09:30am`."
},
"job_number": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Job number.",
"exclusiveMinimum": 0
},
"started_on": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "When the work started, e.g. `2026-10-02 13:00` or `10/02/2026 01:00pm`."
},
"employee_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "The employee's `id`.",
"exclusiveMinimum": 0
},
"number_of_hours": {
"type": "number",
"maximum": 1000,
"description": "Hours worked, e.g. 1.25.",
"exclusiveMinimum": 0
},
"time_entry_type_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Time entry type id.",
"exclusiveMinimum": 0
}
}
}| string |
| Billing city. |
| company_name | string | Company name. |
| phone_number | string | Phone number. |
| service_city | string | Service city. |
| billing_state | string | Billing state. |
| email_address | string | Email address. |
| service_state | string | Service state (2-letter abbreviation in the US). |
| account_number | string | Your own account number for the customer. |
| notify_via_sms | boolean | Send the customer SMS notifications. |
| billing_address | string | Billing address (where invoices go), line 1. |
| billing_country | string | Billing country. |
| customer_number* | integer | Customer number to update. |
| service_address | string | Service address (where the work happens), line 1. |
| service_country | string | Service country (2-letter code). |
| alt_phone_number | string | Alternate phone number. |
| billing_zip_code | string | Billing ZIP/postal code. |
| customer_type_id | integer | Customer type id. |
| notify_via_email | boolean | Send the customer email notifications. |
| service_zip_code | string | Service ZIP/postal code. |
| billing_address_2 | string | Billing address line 2. |
| service_address_2 | string | Service address line 2. |
| customer_source_id | integer | Customer source (lead source) id. |
| special_instructions | string | Special instructions shown to technicians. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"customer_number"
],
"properties": {
"fax": {
"type": "string",
"maxLength": 64,
"description": "Fax number."
},
"name": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "New customer name."
},
"mobile": {
"type": "string",
"maxLength": 64,
"description": "Mobile number."
},
"company": {
"type": "boolean",
"description": "True if the customer is a company rather than a person."
},
"contact": {
"type": "string",
"maxLength": 255,
"description": "Primary contact name."
},
"is_active": {
"type": "boolean",
"description": "False to mark the customer inactive (reversible)."
},
"last_name": {
"type": "string",
"maxLength": 255,
"description": "Contact last name."
},
"first_name": {
"type": "string",
"maxLength": 255,
"description": "Contact first name."
},
"alt_contact": {
"type": "string",
"maxLength": 255,
"description": "Alternate contact name."
},
"billing_city": {
"type": "string",
"maxLength": 128,
"description": "Billing city."
},
"company_name": {
"type": "string",
"maxLength": 255,
"description": "Company name."
},
"phone_number": {
"type": "string",
"maxLength": 64,
"description": "Phone number."
},
"service_city": {
"type": "string",
"maxLength": 128,
"description": "Service city."
},
"billing_state": {
"type": "string",
"maxLength": 64,
"description": "Billing state."
},
"email_address": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"maxLength": 255,
"description": "Email address."
},
"service_state": {
"type": "string",
"maxLength": 64,
"description": "Service state (2-letter abbreviation in the US)."
},
"account_number": {
"type": "string",
"maxLength": 64,
"description": "Your own account number for the customer."
},
"notify_via_sms": {
"type": "boolean",
"description": "Send the customer SMS notifications."
},
"billing_address": {
"type": "string",
"maxLength": 255,
"description": "Billing address (where invoices go), line 1."
},
"billing_country": {
"type": "string",
"maxLength": 64,
"description": "Billing country."
},
"customer_number": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Customer number to update.",
"exclusiveMinimum": 0
},
"service_address": {
"type": "string",
"maxLength": 255,
"description": "Service address (where the work happens), line 1."
},
"service_country": {
"type": "string",
"maxLength": 64,
"description": "Service country (2-letter code)."
},
"alt_phone_number": {
"type": "string",
"maxLength": 64,
"description": "Alternate phone number."
},
"billing_zip_code": {
"type": "string",
"maxLength": 32,
"description": "Billing ZIP/postal code."
},
"customer_type_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Customer type id.",
"exclusiveMinimum": 0
},
"notify_via_email": {
"type": "boolean",
"description": "Send the customer email notifications."
},
"service_zip_code": {
"type": "string",
"maxLength": 32,
"description": "Service ZIP/postal code."
},
"billing_address_2": {
"type": "string",
"maxLength": 255,
"description": "Billing address line 2."
},
"service_address_2": {
"type": "string",
"maxLength": 255,
"description": "Service address line 2."
},
"customer_source_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Customer source (lead source) id.",
"exclusiveMinimum": 0
},
"special_instructions": {
"type": "string",
"maxLength": 5000,
"description": "Special instructions shown to technicians."
}
}
}| scheduled_on |
| string |
| When the job is scheduled. A date/time string Kickserv can parse, e.g. `2026-10-02 09:30` or `10/2/2026 09:30am`. |
| job_status_id | integer | New custom job status id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"job_number"
],
"properties": {
"name": {
"type": "string",
"maxLength": 255,
"description": "Job name/title."
},
"ends_at": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "When the job ends. A date/time string Kickserv can parse, e.g. `2026-10-02 09:30` or `10/2/2026 09:30am`."
},
"duration": {
"type": "number",
"maximum": 100000,
"minimum": 0,
"description": "Job duration."
},
"po_number": {
"type": "string",
"maxLength": 64,
"description": "Customer purchase-order number."
},
"job_number": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Job number to update.",
"exclusiveMinimum": 0
},
"description": {
"type": "string",
"maxLength": 10000,
"description": "Job description / work to be done."
},
"job_type_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "New job category (job type) id.",
"exclusiveMinimum": 0
},
"employee_ids": {
"type": "array",
"items": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
"maxItems": 50,
"description": "Employee `id`s (from kickserv_list_employees) to assign. Replaces the current assignment."
},
"scheduled_on": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "When the job is scheduled. A date/time string Kickserv can parse, e.g. `2026-10-02 09:30` or `10/2/2026 09:30am`."
},
"job_status_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "New custom job status id.",
"exclusiveMinimum": 0
}
}
}