Service Fusion MCP by usefulapi
Read Service Fusion customers, jobs, estimates, invoices and schedule; create customers and jobs.
我該用這個嗎
品質與安全性
發現項目(8)
- LOW在 servicefusion_list_customer_equipment 中
- LOW在 servicefusion_get_customer_equipment 中
- LOW在 servicefusion_list_calendar_tasks 中
- LOW在 servicefusion_get_calendar_task 中
- LOW在 servicefusion_list_tech_departments 中
- LOW在 servicefusion_list_job_categories 中
- LOW在 servicefusion_list_job_statuses 中
- LOW在 servicefusion_list_payment_types 中
根據工具定義與協定合規性的自動化分析。
上下文成本
這是每次將伺服器的工具載入模型上下文時所消耗的約略 token 數量。數量越高,可用於其他工作的注意力就越少。
安裝
一鍵安裝
將以下內容加入你的 `claude_desktop_config.json` 檔案:
{
"mcpServers": {
"service-fusion": {
"url": "https://service-fusion.usefulapi.io/mcp"
}
}
}遠端端點
https://service-fusion.usefulapi.io/mcpstreamable-http它能做什麼
工具清單
工具(26)
🟢servicefusion_get_me
The Service Fusion user the API credentials belong to: id, name and email. Use it to check the connection. GET /me.
輸入結構描述
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢servicefusion_list_customers(name, contact_first_name, contact_last_name, address, city, ...)
List customers (newest id order unless sorted). Filter by name, contact, address, city, postal code, phone, email, tags or last-serviced date. Add expand=contacts,locations,custom_fields to include them. GET /customers.
輸入結構描述
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Customer name (partial match)."
},
"contact_first_name": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Contact first name (partial match)."
},
"contact_last_name": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Contact last name (partial match)."
},
"address": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Street address (partial match)."
},
"city": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "City (exact match)."
},
"postal_code": {
"description": "Postal/ZIP code (exact match).",
"type": "string",
"pattern": "^[A-Za-z0-9 -]{2,12}$"
},
"phone": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Phone (partial match)."
},
"email": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Email (exact match)."
},
"tags": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Tags, comma-separated (exact match)."
},
"last_serviced_from": {
"description": "Last serviced on or after this date, yyyy-mm-dd.",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"last_serviced_to": {
"description": "Last serviced on or before this date, yyyy-mm-dd.",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"expand": {
"description": "Extra data to include: contacts, contacts.phones, contacts.emails, locations, custom_fields.",
"maxItems": 5,
"type": "array",
"items": {
"type": "string",
"enum": [
"contacts",
"contacts.phones",
"contacts.emails",
"locations",
"custom_fields"
]
}
},
"sort": {
"description": "Sort fields, comma-separated; a leading - sorts descending (for example -updated_at,customer_name).",
"type": "string",
"maxLength": 300,
"pattern": "^-?[a-z][a-z0-9_]*(,-?[a-z][a-z0-9_]*)*$"
},
"fields": {
"description": "Only return these fields, comma-separated (for example id,customer_name). Default: all.",
"type": "string",
"maxLength": 500,
"pattern": "^[a-z][a-z0-9_]*(,[a-z][a-z0-9_]*)*$"
},
"page": {
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"per_page": {
"description": "Results per page, 1-50 (default 10).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 50
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢servicefusion_get_customer(customer_id, expand, fields)
One customer by id, optionally with contacts, phones, emails, locations and custom fields. GET /customers/{id}.
輸入結構描述
{
"type": "object",
"properties": {
"customer_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Service Fusion customer id."
},
"expand": {
"description": "Extra data to include: contacts, contacts.phones, contacts.emails, locations, custom_fields.",
"maxItems": 5,
"type": "array",
"items": {
"type": "string",
"enum": [
"contacts",
"contacts.phones",
"contacts.emails",
"locations",
"custom_fields"
]
}
},
"fields": {
"description": "Only return these fields, comma-separated (for example id,customer_name). Default: all.",
"type": "string",
"maxLength": 500,
"pattern": "^[a-z][a-z0-9_]*(,[a-z][a-z0-9_]*)*$"
}
},
"required": [
"customer_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢servicefusion_list_customer_equipment(customer_id, expand, sort, fields, page, ...)
List the equipment on file for a customer (type, make, model, serial number, warranty and install dates). GET /customers/{id}/equipment.
輸入結構描述
{
"type": "object",
"properties": {
"customer_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Service Fusion customer id."
},
"expand": {
"description": "Extra data to include: custom_fields.",
"maxItems": 1,
"type": "array",
"items": {
"type": "string",
"enum": [
"custom_fields"
]
}
},
"sort": {
"description": "Sort fields, comma-separated; a leading - sorts descending (for example -updated_at,customer_name).",
"type": "string",
"maxLength": 300,
"pattern": "^-?[a-z][a-z0-9_]*(,-?[a-z][a-z0-9_]*)*$"
},
"fields": {
"description": "Only return these fields, comma-separated (for example id,customer_name). Default: all.",
"type": "string",
"maxLength": 500,
"pattern": "^[a-z][a-z0-9_]*(,[a-z][a-z0-9_]*)*$"
},
"page": {
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"per_page": {
"description": "Results per page, 1-50 (default 10).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 50
}
},
"required": [
"customer_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢servicefusion_get_customer_equipment(customer_id, equipment_id, expand, fields)
One piece of equipment of a customer. GET /customers/{customer_id}/equipment/{equipment_id}.
輸入結構描述
{
"type": "object",
"properties": {
"customer_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Service Fusion customer id."
},
"equipment_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Equipment id (from servicefusion_list_customer_equipment)."
},
"expand": {
"description": "Extra data to include: custom_fields.",
"maxItems": 1,
"type": "array",
"items": {
"type": "string",
"enum": [
"custom_fields"
]
}
},
"fields": {
"description": "Only return these fields, comma-separated (for example id,customer_name). Default: all.",
"type": "string",
"maxLength": 500,
"pattern": "^[a-z][a-z0-9_]*(,[a-z][a-z0-9_]*)*$"
}
},
"required": [
"customer_id",
"equipment_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢servicefusion_list_jobs(status, number, po_number, invoice_number, customer_name, ...)
List jobs (work orders). Filter by status, number, PO or invoice number, customer, contact, address, phone, email, category, source and start/end/updated/closed dates. Add expand (techs_assigned, services, products, payments, invoices, visits, notes, ...) for detail. GET /jobs.
輸入結構描述
{
"type": "object",
"properties": {
"status": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Job status names, comma-separated (exact match; see servicefusion_list_job_statuses)."
},
"number": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Job number (partial match)."
},
"po_number": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "PO number (partial match)."
},
"invoice_number": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Invoice number (partial match)."
},
"customer_name": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Customer name (partial match)."
},
"parent_customer_name": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Parent customer name (partial match)."
},
"contact_first_name": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Contact first name (partial match)."
},
"contact_last_name": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Contact last name (partial match)."
},
"address": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Street address (partial match)."
},
"city": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "City (exact match)."
},
"zip_code": {
"description": "Postal/ZIP code (exact match).",
"type": "string",
"pattern": "^[A-Za-z0-9 -]{2,12}$"
},
"phone": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Phone (partial match)."
},
"email": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Email (exact match)."
},
"category": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Job categories, comma-separated (exact match)."
},
"source": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Sources, comma-separated (exact match)."
},
"start_date_from": {
"description": "Job start date on or after, yyyy-mm-dd.",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"start_date_to": {
"description": "Job start date on or before, yyyy-mm-dd.",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"end_date_from": {
"description": "Job end date on or after, yyyy-mm-dd.",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"end_date_to": {
"description": "Job end date on or before, yyyy-mm-dd.",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"updated_from": {
"description": "Updated at or after (RFC 3339 date-time with timezone).",
"type": "string"
},
"updated_to": {
"description": "Updated at or before (RFC 3339 date-time with timezone).",
"type": "string"
},
"closed_from": {
"description": "Closed at or after (RFC 3339 date-time with timezone).",
"type": "string"
},
"closed_to": {
"description": "Closed at or before (RFC 3339 date-time with timezone).",
"type": "string"
},
"expand": {
"description": "Extra data to include: agents, custom_fields, pictures, documents, equipment, equipment.custom_fields, techs_assigned, tasks, notes, products, services, other_charges, labor_charges, expenses, payments, invoices, signatures, printable_work_order, visits, visits.techs_assigned.",
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"enum": [
"agents",
"custom_fields",
"pictures",
"documents",
"equipment",
"equipment.custom_fields",
"techs_assigned",
"tasks",
"notes",
"products",
"services",
"other_charges",
"labor_charges",
"expenses",
"payments",
"invoices",
"signatures",
"printable_work_order",
"visits",
"visits.techs_assigned"
]
}
},
"sort": {
"description": "Sort fields, comma-separated; a leading - sorts descending (for example -updated_at,customer_name).",
"type": "string",
"maxLength": 300,
"pattern": "^-?[a-z][a-z0-9_]*(,-?[a-z][a-z0-9_]*)*$"
},
"fields": {
"description": "Only return these fields, comma-separated (for example id,customer_name). Default: all.",
"type": "string",
"maxLength": 500,
"pattern": "^[a-z][a-z0-9_]*(,[a-z][a-z0-9_]*)*$"
},
"page": {
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"per_page": {
"description": "Results per page, 1-50 (default 10).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 50
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢servicefusion_get_job(job_id, expand, fields)
One job by id, optionally with technicians, line items, labor, expenses, payments, invoices, notes, visits and more. GET /jobs/{id}.
輸入結構描述
{
"type": "object",
"properties": {
"job_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Service Fusion job id."
},
"expand": {
"description": "Extra data to include: agents, custom_fields, pictures, documents, equipment, equipment.custom_fields, techs_assigned, tasks, notes, products, services, other_charges, labor_charges, expenses, payments, invoices, signatures, printable_work_order, visits, visits.techs_assigned.",
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"enum": [
"agents",
"custom_fields",
"pictures",
"documents",
"equipment",
"equipment.custom_fields",
"techs_assigned",
"tasks",
"notes",
"products",
"services",
"other_charges",
"labor_charges",
"expenses",
"payments",
"invoices",
"signatures",
"printable_work_order",
"visits",
"visits.techs_assigned"
]
}
},
"fields": {
"description": "Only return these fields, comma-separated (for example id,customer_name). Default: all.",
"type": "string",
"maxLength": 500,
"pattern": "^[a-z][a-z0-9_]*(,[a-z][a-z0-9_]*)*$"
}
},
"required": [
"job_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢servicefusion_list_estimates(status, number, po_number, customer_name, parent_customer_name, ...)
List estimates (quotes). Filter by status, number, PO number, customer, contact, address, phone, email, category, source and start/end/requested dates. GET /estimates.
輸入結構描述
{
"type": "object",
"properties": {
"status": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Estimate status names, comma-separated (exact match)."
},
"number": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Estimate number (partial match)."
},
"po_number": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "PO number (partial match)."
},
"customer_name": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Customer name (partial match)."
},
"parent_customer_name": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Parent customer name (partial match)."
},
"contact_first_name": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Contact first name (partial match)."
},
"contact_last_name": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Contact last name (partial match)."
},
"address": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Street address (partial match)."
},
"city": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "City (exact match)."
},
"zip_code": {
"description": "Postal/ZIP code (exact match).",
"type": "string",
"pattern": "^[A-Za-z0-9 -]{2,12}$"
},
"phone": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Phone (partial match)."
},
"email": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Email (exact match)."
},
"category": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Categories, comma-separated (exact match)."
},
"source": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Sources, comma-separated (exact match)."
},
"start_date_from": {
"description": "Start date on or after, yyyy-mm-dd.",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"start_date_to": {
"description": "Start date on or before, yyyy-mm-dd.",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"end_date_from": {
"description": "End date on or after, yyyy-mm-dd.",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"end_date_to": {
"description": "End date on or before, yyyy-mm-dd.",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"requested_from": {
"description": "Requested at or after (RFC 3339 date-time with timezone).",
"type": "string"
},
"requested_to": {
"description": "Requested at or before (RFC 3339 date-time with timezone).",
"type": "string"
},
"expand": {
"description": "Extra data to include: agents, custom_fields, pictures, documents, equipment, equipment.custom_fields, techs_assigned, tasks, notes, products, services, other_charges, payments, signatures, printable_work_order, tags.",
"maxItems": 16,
"type": "array",
"items": {
"type": "string",
"enum": [
"agents",
"custom_fields",
"pictures",
"documents",
"equipment",
"equipment.custom_fields",
"techs_assigned",
"tasks",
"notes",
"products",
"services",
"other_charges",
"payments",
"signatures",
"printable_work_order",
"tags"
]
}
},
"sort": {
"description": "Sort fields, comma-separated; a leading - sorts descending (for example -updated_at,customer_name).",
"type": "string",
"maxLength": 300,
"pattern": "^-?[a-z][a-z0-9_]*(,-?[a-z][a-z0-9_]*)*$"
},
"fields": {
"description": "Only return these fields, comma-separated (for example id,customer_name). Default: all.",
"type": "string",
"maxLength": 500,
"pattern": "^[a-z][a-z0-9_]*(,[a-z][a-z0-9_]*)*$"
},
"page": {
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"per_page": {
"description": "Results per page, 1-50 (default 10).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 50
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢servicefusion_get_estimate(estimate_id, expand, fields)
One estimate by id, optionally with line items, technicians, notes, tags and more. GET /estimates/{id}.
輸入結構描述
{
"type": "object",
"properties": {
"estimate_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Service Fusion estimate id."
},
"expand": {
"description": "Extra data to include: agents, custom_fields, pictures, documents, equipment, equipment.custom_fields, techs_assigned, tasks, notes, products, services, other_charges, payments, signatures, printable_work_order, tags.",
"maxItems": 16,
"type": "array",
"items": {
"type": "string",
"enum": [
"agents",
"custom_fields",
"pictures",
"documents",
"equipment",
"equipment.custom_fields",
"techs_assigned",
"tasks",
"notes",
"products",
"services",
"other_charges",
"payments",
"signatures",
"printable_work_order",
"tags"
]
}
},
"fields": {
"description": "Only return these fields, comma-separated (for example id,customer_name). Default: all.",
"type": "string",
"maxLength": 500,
"pattern": "^[a-z][a-z0-9_]*(,[a-z][a-z0-9_]*)*$"
}
},
"required": [
"estimate_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢servicefusion_list_invoices(sort, fields, page, per_page)
List invoices with number, total, paid flag, dates and the customer. The API has no invoice filters: sort and page instead (for example sort=-date). GET /invoices.
輸入結構描述
{
"type": "object",
"properties": {
"sort": {
"description": "Sort fields, comma-separated; a leading - sorts descending (for example -updated_at,customer_name).",
"type": "string",
"maxLength": 300,
"pattern": "^-?[a-z][a-z0-9_]*(,-?[a-z][a-z0-9_]*)*$"
},
"fields": {
"description": "Only return these fields, comma-separated (for example id,customer_name). Default: all.",
"type": "string",
"maxLength": 500,
"pattern": "^[a-z][a-z0-9_]*(,[a-z][a-z0-9_]*)*$"
},
"page": {
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"per_page": {
"description": "Results per page, 1-50 (default 10).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 50
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢servicefusion_get_invoice(invoice_id, fields)
One invoice by id. GET /invoices/{id}.
輸入結構描述
{
"type": "object",
"properties": {
"invoice_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Service Fusion invoice id."
},
"fields": {
"description": "Only return these fields, comma-separated (for example id,customer_name). Default: all.",
"type": "string",
"maxLength": 500,
"pattern": "^[a-z][a-z0-9_]*(,[a-z][a-z0-9_]*)*$"
}
},
"required": [
"invoice_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢servicefusion_list_calendar_tasks(start_date, end_date, user_ids, expand, sort, ...)
List calendar tasks (appointments and to-dos on the schedule) for one day (start_date or end_date alone), a date range (both) and/or given users. A task is returned when it overlaps the range. GET /calendar-tasks.
輸入結構描述
{
"type": "object",
"properties": {
"start_date": {
"description": "Range start, yyyy-mm-dd. Give BOTH start_date and end_date for a range; with only one of them the API returns tasks on that single day.",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"end_date": {
"description": "Range end, yyyy-mm-dd. Give BOTH start_date and end_date for a range; with only one of them the API returns tasks on that single day.",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"user_ids": {
"description": "Only tasks assigned to these user (technician) ids.",
"minItems": 1,
"maxItems": 50,
"type": "array",
"items": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"expand": {
"description": "Extra data to include: repeat.",
"maxItems": 1,
"type": "array",
"items": {
"type": "string",
"enum": [
"repeat"
]
}
},
"sort": {
"description": "Sort fields, comma-separated; a leading - sorts descending (for example -updated_at,customer_name).",
"type": "string",
"maxLength": 300,
"pattern": "^-?[a-z][a-z0-9_]*(,-?[a-z][a-z0-9_]*)*$"
},
"fields": {
"description": "Only return these fields, comma-separated (for example id,customer_name). Default: all.",
"type": "string",
"maxLength": 500,
"pattern": "^[a-z][a-z0-9_]*(,[a-z][a-z0-9_]*)*$"
},
"page": {
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"per_page": {
"description": "Results per page, 1-50 (default 10).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 50
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢servicefusion_get_calendar_task(calendar_task_id, expand, fields)
One calendar task by id. GET /calendar-tasks/{id}.
輸入結構描述
{
"type": "object",
"properties": {
"calendar_task_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Calendar task id."
},
"expand": {
"description": "Extra data to include: repeat.",
"maxItems": 1,
"type": "array",
"items": {
"type": "string",
"enum": [
"repeat"
]
}
},
"fields": {
"description": "Only return these fields, comma-separated (for example id,customer_name). Default: all.",
"type": "string",
"maxLength": 500,
"pattern": "^[a-z][a-z0-9_]*(,[a-z][a-z0-9_]*)*$"
}
},
"required": [
"calendar_task_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢servicefusion_get_availability(start_date, end_date, scope, start_time, end_time, ...)
Open time slots for technicians and/or crews over up to 8 days (end_date at most 7 days after start_date). Filter by technician, crew, department, experience level and slot length. GET /availability.
輸入結構描述
{
"type": "object",
"properties": {
"start_date": {
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
"description": "First day (inclusive), yyyy-mm-dd."
},
"end_date": {
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
"description": "Last day (inclusive), yyyy-mm-dd; at most 7 days after start_date."
},
"scope": {
"description": "Individual technician slots, crew slots, or both (the API default is techs; pass all to include crews).",
"type": "string",
"enum": [
"techs",
"crews",
"all"
]
},
"start_time": {
"description": "Only slots starting at or after this time of day, HH:MM.",
"type": "string",
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$"
},
"end_time": {
"description": "Only slots ending at or before this time of day, HH:MM.",
"type": "string",
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$"
},
"tech_ids": {
"description": "Only these technician ids.",
"minItems": 1,
"maxItems": 100,
"type": "array",
"items": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"crew_ids": {
"description": "Only these crew ids.",
"minItems": 1,
"maxItems": 100,
"type": "array",
"items": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"departments": {
"description": "Technician departments (any may match).",
"minItems": 1,
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Department name (case-insensitive partial match)."
}
},
"experience_levels": {
"description": "Experience levels 0-10 (any may match).",
"minItems": 1,
"maxItems": 11,
"type": "array",
"items": {
"type": "integer",
"minimum": 0,
"maximum": 10
}
},
"min_duration": {
"description": "Minimum slot length in minutes.",
"type": "integer",
"minimum": 1,
"maximum": 100000
},
"max_duration": {
"description": "Maximum slot length in minutes.",
"type": "integer",
"minimum": 1,
"maximum": 100000
},
"sort": {
"description": "Sort by date and/or duration, e.g. date,-duration (API default: date).",
"type": "string",
"pattern": "^-?(date|duration)(,-?(date|duration))*$"
},
"ignore_work_schedule": {
"description": "Ignore each technician's work schedule; only the time window limits the slots.",
"type": "boolean"
},
"page": {
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"per_page": {
"description": "Slots per page, 1-100.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100
}
},
"required": [
"start_date",
"end_date"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢servicefusion_list_techs(first_name, last_name, email, nickname_on_workorder, nickname_on_dispatch, ...)
List technicians and sales reps (name, contact details, department, title, color, field-worker and sales-rep flags). GET /techs.
輸入結構描述
{
"type": "object",
"properties": {
"first_name": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "First name (partial match)."
},
"last_name": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Last name (partial match)."
},
"email": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Email (partial match)."
},
"nickname_on_workorder": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Nickname on work orders (partial match)."
},
"nickname_on_dispatch": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Nickname on the dispatch board (partial match)."
},
"sort": {
"description": "Sort fields, comma-separated; a leading - sorts descending (for example -updated_at,customer_name).",
"type": "string",
"maxLength": 300,
"pattern": "^-?[a-z][a-z0-9_]*(,-?[a-z][a-z0-9_]*)*$"
},
"fields": {
"description": "Only return these fields, comma-separated (for example id,customer_name). Default: all.",
"type": "string",
"maxLength": 500,
"pattern": "^[a-z][a-z0-9_]*(,[a-z][a-z0-9_]*)*$"
},
"page": {
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"per_page": {
"description": "Results per page, 1-50 (default 10).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 50
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢servicefusion_get_tech(tech_id, fields)
One technician by id. GET /techs/{id}.
輸入結構描述
{
"type": "object",
"properties": {
"tech_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Service Fusion technician id."
},
"fields": {
"description": "Only return these fields, comma-separated (for example id,customer_name). Default: all.",
"type": "string",
"maxLength": 500,
"pattern": "^[a-z][a-z0-9_]*(,[a-z][a-z0-9_]*)*$"
}
},
"required": [
"tech_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢servicefusion_list_tech_departments
The technician department names configured in the account (useful for availability filters). GET /techs/departments.
輸入結構描述
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢servicefusion_list_crews(expand, sort, fields, page, per_page)
List crews (named groups of technicians), optionally with their members. GET /crews.
輸入結構描述
{
"type": "object",
"properties": {
"expand": {
"description": "Extra data to include: techs.",
"maxItems": 1,
"type": "array",
"items": {
"type": "string",
"enum": [
"techs"
]
}
},
"sort": {
"description": "Sort fields, comma-separated; a leading - sorts descending (for example -updated_at,customer_name).",
"type": "string",
"maxLength": 300,
"pattern": "^-?[a-z][a-z0-9_]*(,-?[a-z][a-z0-9_]*)*$"
},
"fields": {
"description": "Only return these fields, comma-separated (for example id,customer_name). Default: all.",
"type": "string",
"maxLength": 500,
"pattern": "^[a-z][a-z0-9_]*(,[a-z][a-z0-9_]*)*$"
},
"page": {
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"per_page": {
"description": "Results per page, 1-50 (default 10).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 50
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢servicefusion_get_crew(crew_id, expand, fields)
One crew by id, optionally with its technicians. GET /crews/{id}.
輸入結構描述
{
"type": "object",
"properties": {
"crew_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Service Fusion crew id."
},
"expand": {
"description": "Extra data to include: techs.",
"maxItems": 1,
"type": "array",
"items": {
"type": "string",
"enum": [
"techs"
]
}
},
"fields": {
"description": "Only return these fields, comma-separated (for example id,customer_name). Default: all.",
"type": "string",
"maxLength": 500,
"pattern": "^[a-z][a-z0-9_]*(,[a-z][a-z0-9_]*)*$"
}
},
"required": [
"crew_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢servicefusion_list_job_categories(sort, fields, page, per_page)
The job category names to use when creating or filtering jobs. GET /job-categories.
輸入結構描述
{
"type": "object",
"properties": {
"sort": {
"description": "Sort fields, comma-separated; a leading - sorts descending (for example -updated_at,customer_name).",
"type": "string",
"maxLength": 300,
"pattern": "^-?[a-z][a-z0-9_]*(,-?[a-z][a-z0-9_]*)*$"
},
"fields": {
"description": "Only return these fields, comma-separated (for example id,customer_name). Default: all.",
"type": "string",
"maxLength": 500,
"pattern": "^[a-z][a-z0-9_]*(,[a-z][a-z0-9_]*)*$"
},
"page": {
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"per_page": {
"description": "Results per page, 1-50 (default 10).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 50
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢servicefusion_list_job_statuses(sort, fields, page, per_page)
The job status names (code, name, custom flag, category) to use when creating or filtering jobs. GET /job-statuses.
輸入結構描述
{
"type": "object",
"properties": {
"sort": {
"description": "Sort fields, comma-separated; a leading - sorts descending (for example -updated_at,customer_name).",
"type": "string",
"maxLength": 300,
"pattern": "^-?[a-z][a-z0-9_]*(,-?[a-z][a-z0-9_]*)*$"
},
"fields": {
"description": "Only return these fields, comma-separated (for example id,customer_name). Default: all.",
"type": "string",
"maxLength": 500,
"pattern": "^[a-z][a-z0-9_]*(,[a-z][a-z0-9_]*)*$"
},
"page": {
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"per_page": {
"description": "Results per page, 1-50 (default 10).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 50
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢servicefusion_list_payment_types(sort, fields, page, per_page)
The payment types configured in the account. GET /payment-types.
輸入結構描述
{
"type": "object",
"properties": {
"sort": {
"description": "Sort fields, comma-separated; a leading - sorts descending (for example -updated_at,customer_name).",
"type": "string",
"maxLength": 300,
"pattern": "^-?[a-z][a-z0-9_]*(,-?[a-z][a-z0-9_]*)*$"
},
"fields": {
"description": "Only return these fields, comma-separated (for example id,customer_name). Default: all.",
"type": "string",
"maxLength": 500,
"pattern": "^[a-z][a-z0-9_]*(,[a-z][a-z0-9_]*)*$"
},
"page": {
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"per_page": {
"description": "Results per page, 1-50 (default 10).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 50
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢servicefusion_list_sources(sort, fields, page, per_page)
The lead/referral sources (short and long names) to use when creating or filtering jobs and estimates. GET /sources.
輸入結構描述
{
"type": "object",
"properties": {
"sort": {
"description": "Sort fields, comma-separated; a leading - sorts descending (for example -updated_at,customer_name).",
"type": "string",
"maxLength": 300,
"pattern": "^-?[a-z][a-z0-9_]*(,-?[a-z][a-z0-9_]*)*$"
},
"fields": {
"description": "Only return these fields, comma-separated (for example id,customer_name). Default: all.",
"type": "string",
"maxLength": 500,
"pattern": "^[a-z][a-z0-9_]*(,[a-z][a-z0-9_]*)*$"
},
"page": {
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"per_page": {
"description": "Results per page, 1-50 (default 10).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 50
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴servicefusion_create_customer(customer_name, parent_customer, account_number, private_notes, public_notes, ...)
WRITE: create a customer in Service Fusion, optionally with contacts (phones, emails) and service locations. It is visible to the whole team and cannot be deleted through this API; creating the same name twice makes two customers, so search with servicefusion_list_customers first. POST /customers.
輸入結構描述
{
"type": "object",
"properties": {
"customer_name": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Customer (company or person) name."
},
"parent_customer": {
"description": "Name of an existing parent customer.",
"type": "string",
"maxLength": 200
},
"account_number": {
"type": "string",
"maxLength": 100
},
"private_notes": {
"description": "Internal notes.",
"type": "string",
"maxLength": 5000
},
"public_notes": {
"description": "Notes shown on customer-facing documents.",
"type": "string",
"maxLength": 5000
},
"credit_rating": {
"type": "string",
"enum": [
"A+",
"A",
"B+",
"B",
"C+",
"C",
"U"
]
},
"labor_charge_type": {
"type": "string",
"enum": [
"flat",
"hourly"
]
},
"labor_charge_default_rate": {
"type": "number",
"minimum": 0,
"maximum": 10000000
},
"is_bill_for_drive_time": {
"type": "boolean"
},
"is_vip": {
"type": "boolean"
},
"referral_source": {
"type": "string",
"maxLength": 200
},
"agent": {
"description": "Sales agent name.",
"type": "string",
"maxLength": 200
},
"discount": {
"type": "number",
"minimum": 0,
"maximum": 10000000
},
"discount_type": {
"type": "string",
"enum": [
"$",
"%"
]
},
"payment_type": {
"type": "string",
"maxLength": 100
},
"payment_terms": {
"type": "string",
"maxLength": 100
},
"assigned_contract": {
"type": "string",
"maxLength": 200
},
"industry": {
"type": "string",
"maxLength": 200
},
"is_taxable": {
"type": "boolean"
},
"tax_item_name": {
"type": "string",
"maxLength": 200
},
"contacts": {
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"fname": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"lname": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"prefix": {
"type": "string",
"maxLength": 20
},
"suffix": {
"type": "string",
"maxLength": 20
},
"contact_type": {
"description": "For example Billing.",
"type": "string",
"maxLength": 100
},
"job_title": {
"type": "string",
"maxLength": 100
},
"department": {
"type": "string",
"maxLength": 100
},
"is_primary": {
"type": "boolean"
},
"phones": {
"maxItems": 10,
"type": "array",
"items": {
"type": "object",
"properties": {
"phone": {
"type": "string",
"pattern": "^[0-9]{3}-[0-9]{3}-[0-9]{4}$"
},
"ext": {
"type": "integer",
"minimum": 0,
"maximum": 99999
},
"type": {
"type": "string",
"enum": [
"Mobile",
"Home",
"Work",
"Other"
]
}
},
"required": [
"phone"
]
}
},
"emails": {
"maxItems": 10,
"type": "array",
"items": {
"type": "object",
"properties": {
"email": {
"type": "string",
"minLength": 3,
"maxLength": 200
},
"class": {
"type": "string",
"enum": [
"Personal",
"Business",
"Other"
]
},
"types_accepted": {
"type": "string",
"pattern": "^(CONF|STATUS|PMT|INV)(,(CONF|STATUS|PMT|INV))*$"
}
},
"required": [
"email"
]
}
}
},
"required": [
"fname",
"lname"
]
}
},
"locations": {
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"street_1": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"street_2": {
"type": "string",
"maxLength": 200
},
"city": {
"type": "string",
"maxLength": 100
},
"state_prov": {
"type": "string",
"maxLength": 100
},
"postal_code": {
"type": "string",
"maxLength": 20
},
"country": {
"type": "string",
"maxLength": 100
},
"nickname": {
"type": "string",
"maxLength": 200
},
"gate_instructions": {
"type": "string",
"maxLength": 1000
},
"location_type": {
"type": "string",
"maxLength": 100
},
"is_primary": {
"type": "boolean"
},
"is_gated": {
"type": "boolean"
},
"is_bill_to": {
"type": "boolean"
},
"customer_contact": {
"description": "Name of the contact for this location.",
"type": "string",
"maxLength": 200
}
},
"required": [
"street_1"
]
}
},
"custom_fields": {
"description": "Custom fields: [{name, value}] with names as configured in Service Fusion.",
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"value": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "number"
},
{
"type": "boolean"
}
]
}
},
"required": [
"name",
"value"
]
}
}
},
"required": [
"customer_name"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴servicefusion_create_job(description, tech_notes, duration, time_frame_promised_start, time_frame_promised_end, ...)
WRITE: create a job (work order) for a customer, optionally with address, category, source, assigned technicians, tasks, notes, products, services and other charges. It appears on the team's schedule and cannot be deleted through this API; creating twice makes two jobs. Look up category, source and status names with the list tools first. POST /jobs.
輸入結構描述
{
"type": "object",
"properties": {
"description": {
"description": "Job/estimate description (max 500 characters).",
"type": "string",
"maxLength": 500
},
"tech_notes": {
"description": "Notes for the technician.",
"type": "string",
"maxLength": 5000
},
"duration": {
"description": "Duration in seconds, 0-86400 (3600 = 1 hour).",
"type": "integer",
"minimum": 0,
"maximum": 86400
},
"time_frame_promised_start": {
"description": "Promised arrival window start, HH:MM.",
"type": "string",
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$"
},
"time_frame_promised_end": {
"description": "Promised arrival window end, HH:MM.",
"type": "string",
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$"
},
"start_date": {
"description": "Start date, yyyy-mm-dd.",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"customer_name": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Customer name exactly as in Service Fusion (see servicefusion_list_customers); an unknown name is created as a new customer."
},
"status": {
"description": "Status name (see servicefusion_list_job_statuses).",
"type": "string",
"maxLength": 100
},
"contact_first_name": {
"type": "string",
"maxLength": 100
},
"contact_last_name": {
"type": "string",
"maxLength": 100
},
"street_1": {
"type": "string",
"maxLength": 200
},
"street_2": {
"type": "string",
"maxLength": 200
},
"city": {
"type": "string",
"maxLength": 100
},
"state_prov": {
"type": "string",
"maxLength": 100
},
"postal_code": {
"type": "string",
"maxLength": 20
},
"location_name": {
"type": "string",
"maxLength": 200
},
"is_gated": {
"type": "boolean"
},
"gate_instructions": {
"type": "string",
"maxLength": 1000
},
"category": {
"description": "Job category name (see servicefusion_list_job_categories).",
"type": "string",
"maxLength": 200
},
"source": {
"description": "Lead source name (see servicefusion_list_sources).",
"type": "string",
"maxLength": 200
},
"project": {
"type": "string",
"maxLength": 200
},
"phase": {
"type": "string",
"maxLength": 200
},
"po_number": {
"type": "string",
"maxLength": 100
},
"contract": {
"type": "string",
"maxLength": 200
},
"note_to_customer": {
"type": "string",
"maxLength": 2000
},
"custom_fields": {
"description": "Custom fields: [{name, value}] with names as configured in Service Fusion.",
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"value": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "number"
},
{
"type": "boolean"
}
]
}
},
"required": [
"name",
"value"
]
}
},
"techs_assigned": {
"description": "Technicians to assign: [{id}] or [{first_name, last_name}].",
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"first_name": {
"type": "string",
"maxLength": 100
},
"last_name": {
"type": "string",
"maxLength": 100
}
}
}
},
"tasks": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"description": {
"type": "string",
"minLength": 1,
"maxLength": 500
},
"is_completed": {
"type": "boolean"
}
},
"required": [
"description"
]
}
},
"notes": {
"description": "Internal notes: [{notes}].",
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"notes": {
"type": "string",
"minLength": 1,
"maxLength": 5000
}
},
"required": [
"notes"
]
}
},
"products": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"product": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "The product name as in your Service Fusion price list."
},
"name": {
"type": "string",
"maxLength": 200
},
"description": {
"type": "string",
"maxLength": 2000
},
"multiplier": {
"description": "Quantity.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"rate": {
"type": "number",
"minimum": 0,
"maximum": 10000000
},
"cost": {
"type": "number",
"minimum": 0,
"maximum": 10000000
},
"is_show_rate_items": {
"type": "boolean"
},
"tax": {
"type": "string",
"maxLength": 100
}
},
"required": [
"product"
]
}
},
"services": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"service": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "The service name as in your Service Fusion price list."
},
"name": {
"type": "string",
"maxLength": 200
},
"description": {
"type": "string",
"maxLength": 2000
},
"multiplier": {
"description": "Quantity.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"rate": {
"type": "number",
"minimum": 0,
"maximum": 10000000
},
"cost": {
"type": "number",
"minimum": 0,
"maximum": 10000000
},
"is_show_rate_items": {
"type": "boolean"
},
"tax": {
"type": "string",
"maxLength": 100
}
},
"required": [
"service"
]
}
},
"other_charges": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"other_charge": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"name": {
"type": "string",
"maxLength": 200
},
"rate": {
"type": "number",
"minimum": 0,
"maximum": 10000000
},
"is_percentage": {
"type": "boolean"
}
},
"required": [
"other_charge"
]
}
},
"check_number": {
"type": "string",
"maxLength": 100
},
"priority": {
"type": "string",
"enum": [
"Low",
"Normal",
"High"
]
},
"completion_notes": {
"type": "string",
"maxLength": 5000
},
"end_date": {
"description": "End date, yyyy-mm-dd.",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"payment_type": {
"type": "string",
"maxLength": 100
},
"customer_payment_terms": {
"type": "string",
"maxLength": 100
},
"called_in_by": {
"type": "string",
"maxLength": 200
},
"is_requires_follow_up": {
"type": "boolean"
}
},
"required": [
"customer_name"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴servicefusion_create_estimate(description, tech_notes, duration, time_frame_promised_start, time_frame_promised_end, ...)
WRITE: create an estimate (quote) for a customer, optionally with address, category, source, technicians, tasks, notes, products, services, other charges and tags. It cannot be deleted through this API; creating twice makes two estimates. POST /estimates.
輸入結構描述
{
"type": "object",
"properties": {
"description": {
"description": "Job/estimate description (max 500 characters).",
"type": "string",
"maxLength": 500
},
"tech_notes": {
"description": "Notes for the technician.",
"type": "string",
"maxLength": 5000
},
"duration": {
"description": "Duration in seconds, 0-86400 (3600 = 1 hour).",
"type": "integer",
"minimum": 0,
"maximum": 86400
},
"time_frame_promised_start": {
"description": "Promised arrival window start, HH:MM.",
"type": "string",
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$"
},
"time_frame_promised_end": {
"description": "Promised arrival window end, HH:MM.",
"type": "string",
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$"
},
"start_date": {
"description": "Start date, yyyy-mm-dd.",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"customer_name": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Customer name exactly as in Service Fusion (see servicefusion_list_customers); an unknown name is created as a new customer."
},
"status": {
"description": "Status name (see servicefusion_list_job_statuses).",
"type": "string",
"maxLength": 100
},
"contact_first_name": {
"type": "string",
"maxLength": 100
},
"contact_last_name": {
"type": "string",
"maxLength": 100
},
"street_1": {
"type": "string",
"maxLength": 200
},
"street_2": {
"type": "string",
"maxLength": 200
},
"city": {
"type": "string",
"maxLength": 100
},
"state_prov": {
"type": "string",
"maxLength": 100
},
"postal_code": {
"type": "string",
"maxLength": 20
},
"location_name": {
"type": "string",
"maxLength": 200
},
"is_gated": {
"type": "boolean"
},
"gate_instructions": {
"type": "string",
"maxLength": 1000
},
"category": {
"description": "Job category name (see servicefusion_list_job_categories).",
"type": "string",
"maxLength": 200
},
"source": {
"description": "Lead source name (see servicefusion_list_sources).",
"type": "string",
"maxLength": 200
},
"project": {
"type": "string",
"maxLength": 200
},
"phase": {
"type": "string",
"maxLength": 200
},
"po_number": {
"type": "string",
"maxLength": 100
},
"contract": {
"type": "string",
"maxLength": 200
},
"note_to_customer": {
"type": "string",
"maxLength": 2000
},
"custom_fields": {
"description": "Custom fields: [{name, value}] with names as configured in Service Fusion.",
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"value": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "number"
},
{
"type": "boolean"
}
]
}
},
"required": [
"name",
"value"
]
}
},
"techs_assigned": {
"description": "Technicians to assign: [{id}] or [{first_name, last_name}].",
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"first_name": {
"type": "string",
"maxLength": 100
},
"last_name": {
"type": "string",
"maxLength": 100
}
}
}
},
"tasks": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"description": {
"type": "string",
"minLength": 1,
"maxLength": 500
},
"is_completed": {
"type": "boolean"
}
},
"required": [
"description"
]
}
},
"notes": {
"description": "Internal notes: [{notes}].",
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"notes": {
"type": "string",
"minLength": 1,
"maxLength": 5000
}
},
"required": [
"notes"
]
}
},
"products": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"product": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "The product name as in your Service Fusion price list."
},
"name": {
"type": "string",
"maxLength": 200
},
"description": {
"type": "string",
"maxLength": 2000
},
"multiplier": {
"description": "Quantity.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"rate": {
"type": "number",
"minimum": 0,
"maximum": 10000000
},
"cost": {
"type": "number",
"minimum": 0,
"maximum": 10000000
},
"is_show_rate_items": {
"type": "boolean"
},
"tax": {
"type": "string",
"maxLength": 100
}
},
"required": [
"product"
]
}
},
"services": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"service": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "The service name as in your Service Fusion price list."
},
"name": {
"type": "string",
"maxLength": 200
},
"description": {
"type": "string",
"maxLength": 2000
},
"multiplier": {
"description": "Quantity.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"rate": {
"type": "number",
"minimum": 0,
"maximum": 10000000
},
"cost": {
"type": "number",
"minimum": 0,
"maximum": 10000000
},
"is_show_rate_items": {
"type": "boolean"
},
"tax": {
"type": "string",
"maxLength": 100
}
},
"required": [
"service"
]
}
},
"other_charges": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"other_charge": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"name": {
"type": "string",
"maxLength": 200
},
"rate": {
"type": "number",
"minimum": 0,
"maximum": 10000000
},
"is_percentage": {
"type": "boolean"
}
},
"required": [
"other_charge"
]
}
},
"opportunity_rating": {
"description": "Opportunity rating, 0-5.",
"type": "integer",
"minimum": 0,
"maximum": 5
},
"opportunity_owner": {
"description": "Name of the opportunity owner.",
"type": "string",
"maxLength": 200
},
"tags": {
"description": "Tags: [{tag}].",
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"tag": {
"type": "string",
"minLength": 1,
"maxLength": 100
}
},
"required": [
"tag"
]
}
}
},
"required": [
"customer_name"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}社群
證據