# Service Autopilot API

> Every Service Autopilot endpoint on Cotlet: inputs, JSON Schema, cURL, Python and Node.js examples and an example response for each call.

Source: https://cotlet.dev/docs/api/service-autopilot

Docs sections: [Get started](https://cotlet.dev/docs.md) · [REST API](https://cotlet.dev/docs/api.md) · [MCP](https://cotlet.dev/docs/mcp.md) · [SDKs & CLI](https://cotlet.dev/docs/sdks.md) · [Integrations](https://cotlet.dev/docs/integrations.md)

14 endpoints for Service Autopilot. Each one is a POST with a JSON body, called with your API key.

- Base URL: `https://cotlet.dev/api/v1/service-autopilot`
- Connects with: Your own Service Autopilot office user account
- Integration page: https://cotlet.dev/integrations/service-autopilot-api-mcp-server

## Endpoints

| Endpoint | Access | Description |
|---|---|---|
| `search_clients` | read | Find clients and leads by name, address, email or phone. |
| `get_client` | read | Client account history: contact details, jobs, estimates, invoices and notes. |
| `list_jobs` | read | Scheduled and completed jobs in a date range, with client, address, crew and price. |
| `get_route` | read | A crew or technician route for one day: stops in route order with client and address. |
| `list_estimates` | read | Estimates with client, total, date sent and status. |
| `list_invoices` | read | Invoices with client, amount, due date, paid or unpaid and days past due. |
| `add_client` | write | New client or lead with contact details and a service address. |
| `create_job` | write | One-time or repeating job for a client, assigned to a crew. |
| `reschedule_job` | write | Move a scheduled visit to another day or crew. |
| `add_job_note` | write | Add a note to a job. |
| `create_estimate` | write | Estimate for a client from line items. Nothing is sent until you call send_estimate. |
| `send_estimate` | write | Email an estimate to the client. |
| `create_invoice` | write | Invoice a client for completed jobs, optionally emailing it right away. |
| `send_text` | write | Text message to a client with 2-Way Texting. |

## Search clients

`POST https://cotlet.dev/api/v1/service-autopilot/search_clients`

Access: read.

Returns matching clients and leads with ID, name, service address and type. Pass client_id to get_client, create_job or create_estimate. Results hold up to 100 clients.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `query` | string | yes | Name, street address, email or phone. |
| `type` | enum | no | client, lead or all. Default: all. |
| `limit` | integer | no | 1 to 100. Default: 25. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/service-autopilot/search_clients \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"query"}'
```

**Python**

```python
result = client.call("service-autopilot", "search_clients", {"query":"query"})
```

**Node.js**

```js
const result = await cotlet.call('service-autopilot', 'search_clients', {"query":"query"});
```

**CLI**

```bash
cotlet call service-autopilot search_clients --data '{"query":"query"}'
```

### Example response

```json
{
  "clients": [
    {
      "client_id": "4410382",
      "name": "Dana Henderson",
      "type": "client",
      "address": "12 Oak Lane",
      "phone": "555-0142"
    }
  ]
}
```

## Get client

`POST https://cotlet.dev/api/v1/service-autopilot/get_client`

Access: read.

Returns one client with contact details, service address, recent jobs, estimates, invoices and notes, the same history the account page shows. Use it before replying to a client or billing one.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `client_id` | string | yes | Client ID from search_clients. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/service-autopilot/get_client \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"client_id":"client_8c41d2"}'
```

**Python**

```python
result = client.call("service-autopilot", "get_client", {"client_id":"client_8c41d2"})
```

**Node.js**

```js
const result = await cotlet.call('service-autopilot', 'get_client', {"client_id":"client_8c41d2"});
```

**CLI**

```bash
cotlet call service-autopilot get_client --data '{"client_id":"client_8c41d2"}'
```

### Example response

```json
{
  "client_id": "4410382",
  "name": "Dana Henderson",
  "address": "12 Oak Lane",
  "email": "dana@example.com",
  "jobs": [
    {
      "job_id": "9827514",
      "service": "Mowing",
      "next_visit": "2026-10-13"
    }
  ],
  "estimates": [
    {
      "estimate_id": "E-20418",
      "total": "450.00",
      "status": "sent"
    }
  ],
  "invoices": [
    {
      "invoice_id": "I-70231",
      "amount": "45.00",
      "status": "paid"
    }
  ],
  "notes": [
    "Side gate code 1234"
  ]
}
```

## List jobs

`POST https://cotlet.dev/api/v1/service-autopilot/list_jobs`

Access: read.

Lists visits in a date range, ordered by date, with client, address, crew and price. Filter by crew or by status. Pass job_id to reschedule_job or add_job_note.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `from` | date | yes | First day. |
| `to` | date | no | Last day. Default: same as from. |
| `crew` | string | no | Crew or technician name. |
| `status` | enum | no | scheduled, completed or all. Default: all. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/service-autopilot/list_jobs \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"from":"2026-10-01"}'
```

**Python**

```python
result = client.call("service-autopilot", "list_jobs", {"from":"2026-10-01"})
```

**Node.js**

```js
const result = await cotlet.call('service-autopilot', 'list_jobs', {"from":"2026-10-01"});
```

**CLI**

```bash
cotlet call service-autopilot list_jobs --data '{"from":"2026-10-01"}'
```

### Example response

```json
{
  "jobs": [
    {
      "job_id": "9827514",
      "date": "2026-10-13",
      "client": "Dana Henderson",
      "address": "12 Oak Lane",
      "service": "Mowing",
      "crew": "Crew 2",
      "price": "45.00",
      "status": "scheduled"
    }
  ]
}
```

## Get route

`POST https://cotlet.dev/api/v1/service-autopilot/get_route`

Access: read.

Returns the stops of one crew on one day in the order the route is set, each with client, address, service and price. It reads the route as Service Autopilot shows it and does not change it.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `crew` | string | yes | Crew or technician name. |
| `date` | date | yes | Route day. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/service-autopilot/get_route \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"crew":"crew","date":"2026-10-01"}'
```

**Python**

```python
result = client.call("service-autopilot", "get_route", {"crew":"crew","date":"2026-10-01"})
```

**Node.js**

```js
const result = await cotlet.call('service-autopilot', 'get_route', {"crew":"crew","date":"2026-10-01"});
```

**CLI**

```bash
cotlet call service-autopilot get_route --data '{"crew":"crew","date":"2026-10-01"}'
```

### Example response

```json
{
  "crew": "Crew 1",
  "date": "2026-10-13",
  "stops": [
    {
      "order": 1,
      "client": "Dana Henderson",
      "address": "12 Oak Lane",
      "service": "Mowing",
      "price": "45.00"
    },
    {
      "order": 2,
      "client": "Lee Park",
      "address": "40 Elm Street",
      "service": "Mowing",
      "price": "60.00"
    }
  ]
}
```

## List estimates

`POST https://cotlet.dev/api/v1/service-autopilot/list_estimates`

Access: read.

Lists estimates, newest first, with client, total and whether the estimate was sent. Filter by client or creation date. Pass estimate_id to send_estimate.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `client_id` | string | no | Only this client. |
| `since` | date | no | Only estimates created on or after this date. |
| `limit` | integer | no | 1 to 100. Default: 25. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/service-autopilot/list_estimates \
  -H "Authorization: Bearer $COTLET_API_KEY"
```

**Python**

```python
result = client.call("service-autopilot", "list_estimates")
```

**Node.js**

```js
const result = await cotlet.call('service-autopilot', 'list_estimates');
```

**CLI**

```bash
cotlet call service-autopilot list_estimates
```

### Example response

```json
{
  "estimates": [
    {
      "estimate_id": "E-20418",
      "client": "Dana Henderson",
      "total": "450.00",
      "status": "sent",
      "sent_at": "2026-10-08"
    }
  ]
}
```

## List invoices

`POST https://cotlet.dev/api/v1/service-autopilot/list_invoices`

Access: read.

Lists invoices with client, amount, due date and status. Unpaid invoices come first by default, oldest due date first. Filter by client or date. Amounts are in your account currency.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `status` | enum | no | unpaid, paid or all. Default: unpaid. |
| `client_id` | string | no | Only this client. |
| `since` | date | no | Only invoices dated on or after this date. |
| `limit` | integer | no | 1 to 200. Default: 50. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/service-autopilot/list_invoices \
  -H "Authorization: Bearer $COTLET_API_KEY"
```

**Python**

```python
result = client.call("service-autopilot", "list_invoices")
```

**Node.js**

```js
const result = await cotlet.call('service-autopilot', 'list_invoices');
```

**CLI**

```bash
cotlet call service-autopilot list_invoices
```

### Example response

```json
{
  "invoices": [
    {
      "invoice_id": "I-70198",
      "client": "Lee Park",
      "amount": "120.00",
      "due_date": "2026-09-05",
      "status": "unpaid",
      "days_past_due": 36
    }
  ]
}
```

## Add client

`POST https://cotlet.dev/api/v1/service-autopilot/add_client`

Access: write.

Creates a client or a lead with a service address and optional contact details and notes. It sends nothing to the client, so it runs without asking first and the record can be edited or removed in the app.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `name` | string | yes | Person or company name. |
| `address` | string | yes | Service address. |
| `email` | string | no | Client email. |
| `phone` | string | no | Mobile number. |
| `type` | enum | no | client or lead. Default: client. |
| `notes` | string | no | Gate codes, pets, special instructions. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/service-autopilot/add_client \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Jane Doe","address":"address"}'
```

**Python**

```python
result = client.call("service-autopilot", "add_client", {"name":"Jane Doe","address":"address"})
```

**Node.js**

```js
const result = await cotlet.call('service-autopilot', 'add_client', {"name":"Jane Doe","address":"address"});
```

**CLI**

```bash
cotlet call service-autopilot add_client --data '{"name":"Jane Doe","address":"address"}'
```

### Example response

```json
{
  "client_id": "4410382",
  "name": "Dana Henderson",
  "type": "client",
  "address": "12 Oak Lane"
}
```

## Create job

`POST https://cotlet.dev/api/v1/service-autopilot/create_job`

Access: write.

Puts a job on the calendar for a client, one time or repeating weekly, every other week or monthly. The service name must match one set up in your account. It sends nothing to the client, so it runs without asking first; reschedule_job fixes a wrong date.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `client_id` | string | yes | Client ID from search_clients. |
| `service` | string | yes | Service name as set up in your account, e.g. Mowing. |
| `start_date` | date | yes | First visit. |
| `recurrence` | enum | no | one_time, weekly, every_other_week or monthly. Default: one_time. |
| `crew` | string | no | Crew or technician name. |
| `price` | string | no | Price per visit, e.g. 45.00. |
| `instructions` | string | no | Special instructions for the visit. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/service-autopilot/create_job \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"client_id":"4410382","service":"Mowing","start_date":"2026-10-13","recurrence":"weekly","crew":"Crew 2","price":"45.00","instructions":"Side gate code 1234, back yard first."}'
```

**Python**

```python
result = client.call("service-autopilot", "create_job", {"client_id":"4410382","service":"Mowing","start_date":"2026-10-13","recurrence":"weekly","crew":"Crew 2","price":"45.00","instructions":"Side gate code 1234, back yard first."})
```

**Node.js**

```js
const result = await cotlet.call('service-autopilot', 'create_job', {"client_id":"4410382","service":"Mowing","start_date":"2026-10-13","recurrence":"weekly","crew":"Crew 2","price":"45.00","instructions":"Side gate code 1234, back yard first."});
```

**CLI**

```bash
cotlet call service-autopilot create_job --data '{"client_id":"4410382","service":"Mowing","start_date":"2026-10-13","recurrence":"weekly","crew":"Crew 2","price":"45.00","instructions":"Side gate code 1234, back yard first."}'
```

### Example response

```json
{
  "job_id": "9827514",
  "client_id": "4410382",
  "service": "Mowing",
  "recurrence": "weekly",
  "next_visit": "2026-10-13",
  "crew": "Crew 2",
  "price": "45.00",
  "status": "scheduled"
}
```

## Reschedule job

`POST https://cotlet.dev/api/v1/service-autopilot/reschedule_job`

Access: write.

Moves one scheduled visit to a new date, and to another crew if you name one. It changes the calendar only and one more call moves it back, so it runs without asking first.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `job_id` | string | yes | Job ID from list_jobs. |
| `date` | date | yes | New day. |
| `crew` | string | no | New crew or technician. Default: unchanged. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/service-autopilot/reschedule_job \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"job_id":"9827514","date":"2026-10-16"}'
```

**Python**

```python
result = client.call("service-autopilot", "reschedule_job", {"job_id":"9827514","date":"2026-10-16"})
```

**Node.js**

```js
const result = await cotlet.call('service-autopilot', 'reschedule_job', {"job_id":"9827514","date":"2026-10-16"});
```

**CLI**

```bash
cotlet call service-autopilot reschedule_job --data '{"job_id":"9827514","date":"2026-10-16"}'
```

### Example response

```json
{
  "job_id": "9827514",
  "date": "2026-10-16",
  "crew": "Crew 2",
  "status": "scheduled"
}
```

## Add job note

`POST https://cotlet.dev/api/v1/service-autopilot/add_job_note`

Access: write.

Adds a text note to one job. It reaches no client and runs without asking first.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `job_id` | string | yes | Job ID from list_jobs. |
| `note` | string | yes | Note text. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/service-autopilot/add_job_note \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"job_id":"job_8c41d2","note":"note"}'
```

**Python**

```python
result = client.call("service-autopilot", "add_job_note", {"job_id":"job_8c41d2","note":"note"})
```

**Node.js**

```js
const result = await cotlet.call('service-autopilot', 'add_job_note', {"job_id":"job_8c41d2","note":"note"});
```

**CLI**

```bash
cotlet call service-autopilot add_job_note --data '{"job_id":"job_8c41d2","note":"note"}'
```

### Example response

```json
{
  "job_id": "9827514",
  "note_id": "n_3301",
  "status": "added"
}
```

## Create estimate

`POST https://cotlet.dev/api/v1/service-autopilot/create_estimate`

Access: write.

Creates an estimate for a client from line items and returns its total. The line items add up to the total. It sends nothing to the client, so it runs without asking first; send_estimate delivers it.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `client_id` | string | yes | Client ID from search_clients. |
| `items` | object[] | yes | Line items, each with service, quantity and price. |
| `notes` | string | no | Message shown on the estimate. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/service-autopilot/create_estimate \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"client_id":"4410382","items":[{"service":"Spring cleanup","quantity":1,"price":"250.00"},{"service":"Mulch","quantity":6,"price":"35.00"}],"notes":"Optional: edging along the front beds, $60.00."}'
```

**Python**

```python
result = client.call("service-autopilot", "create_estimate", {"client_id":"4410382","items":[{"service":"Spring cleanup","quantity":1,"price":"250.00"},{"service":"Mulch","quantity":6,"price":"35.00"}],"notes":"Optional: edging along the front beds, $60.00."})
```

**Node.js**

```js
const result = await cotlet.call('service-autopilot', 'create_estimate', {"client_id":"4410382","items":[{"service":"Spring cleanup","quantity":1,"price":"250.00"},{"service":"Mulch","quantity":6,"price":"35.00"}],"notes":"Optional: edging along the front beds, $60.00."});
```

**CLI**

```bash
cotlet call service-autopilot create_estimate --data '{"client_id":"4410382","items":[{"service":"Spring cleanup","quantity":1,"price":"250.00"},{"service":"Mulch","quantity":6,"price":"35.00"}],"notes":"Optional: edging along the front beds, $60.00."}'
```

### Example response

```json
{
  "estimate_id": "E-20418",
  "client_id": "4410382",
  "total": "450.00",
  "status": "created"
}
```

## Send estimate

`POST https://cotlet.dev/api/v1/service-autopilot/send_estimate`

Access: write. Confirm: waits for the user's OK before it runs.

Emails one estimate to the client on file. Service Autopilot lists estimates and proposals on the Pro plan. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `estimate_id` | string | yes | Estimate ID from list_estimates or create_estimate. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/service-autopilot/send_estimate \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"estimate_id":"estimate_8c41d2"}'
```

**Python**

```python
result = client.call("service-autopilot", "send_estimate", {"estimate_id":"estimate_8c41d2"})
```

**Node.js**

```js
const result = await cotlet.call('service-autopilot', 'send_estimate', {"estimate_id":"estimate_8c41d2"});
```

**CLI**

```bash
cotlet call service-autopilot send_estimate --data '{"estimate_id":"estimate_8c41d2"}'
```

### Example response

```json
{
  "estimate_id": "E-20418",
  "status": "sent",
  "sent_to": "dana@example.com"
}
```

## Create invoice

`POST https://cotlet.dev/api/v1/service-autopilot/create_invoice`

Access: write. Confirm: waits for the user's OK before it runs.

Bills a client for completed jobs, all unbilled ones by default, and returns the invoice total. Set send to email it to the client. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `client_id` | string | yes | Client ID from search_clients. |
| `job_ids` | string[] | no | Completed jobs to bill. Default: all unbilled completed jobs. |
| `send` | boolean | no | Email the invoice to the client. Default: false. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/service-autopilot/create_invoice \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"client_id":"client_8c41d2"}'
```

**Python**

```python
result = client.call("service-autopilot", "create_invoice", {"client_id":"client_8c41d2"})
```

**Node.js**

```js
const result = await cotlet.call('service-autopilot', 'create_invoice', {"client_id":"client_8c41d2"});
```

**CLI**

```bash
cotlet call service-autopilot create_invoice --data '{"client_id":"client_8c41d2"}'
```

### Example response

```json
{
  "invoice_id": "I-70231",
  "client_id": "4410382",
  "jobs": 4,
  "amount": "180.00",
  "sent": true
}
```

## Send text

`POST https://cotlet.dev/api/v1/service-autopilot/send_text`

Access: write. Confirm: waits for the user's OK before it runs.

Sends a text to one client through Two-Way Texting, a paid add-on for Pro and Pro Plus members that the pricing page includes in Elite, so the call fails on accounts without it. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `client_id` | string | yes | Client ID from search_clients. |
| `message` | string | yes | Text message body. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/service-autopilot/send_text \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"client_id":"client_8c41d2","message":"message"}'
```

**Python**

```python
result = client.call("service-autopilot", "send_text", {"client_id":"client_8c41d2","message":"message"})
```

**Node.js**

```js
const result = await cotlet.call('service-autopilot', 'send_text', {"client_id":"client_8c41d2","message":"message"});
```

**CLI**

```bash
cotlet call service-autopilot send_text --data '{"client_id":"client_8c41d2","message":"message"}'
```

### Example response

```json
{
  "client_id": "4410382",
  "status": "sent",
  "sent_at": "2026-10-12T17:30:00-04:00"
}
```
