REST API reference
Service Autopilot API
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
- Service Autopilot
| 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
readPOST https://cotlet.dev/api/v1/service-autopilot/search_clients
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 | Description |
|---|---|---|
| query required | string | Name, street address, email or phone. |
| type | enum | client, lead or all. Default: all. |
| limit | integer | 1 to 100. Default: 25. |
Request
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"}' result = client.call("service-autopilot", "search_clients", {"query":"query"}) const result = await cotlet.call('service-autopilot', 'search_clients', {"query":"query"}); cotlet call service-autopilot search_clients --data '{"query":"query"}' Example response
{
"clients": [
{
"client_id": "4410382",
"name": "Dana Henderson",
"type": "client",
"address": "12 Oak Lane",
"phone": "555-0142"
}
]
} Get client
readPOST https://cotlet.dev/api/v1/service-autopilot/get_client
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 | Description |
|---|---|---|
| client_id required | string | Client ID from search_clients. |
Request
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"}' result = client.call("service-autopilot", "get_client", {"client_id":"client_8c41d2"}) const result = await cotlet.call('service-autopilot', 'get_client', {"client_id":"client_8c41d2"}); cotlet call service-autopilot get_client --data '{"client_id":"client_8c41d2"}' Example response
{
"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
readPOST https://cotlet.dev/api/v1/service-autopilot/list_jobs
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 | Description |
|---|---|---|
| from required | date | First day. |
| to | date | Last day. Default: same as from. |
| crew | string | Crew or technician name. |
| status | enum | scheduled, completed or all. Default: all. |
Request
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"}' result = client.call("service-autopilot", "list_jobs", {"from":"2026-10-01"}) const result = await cotlet.call('service-autopilot', 'list_jobs', {"from":"2026-10-01"}); cotlet call service-autopilot list_jobs --data '{"from":"2026-10-01"}' Example response
{
"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
readPOST https://cotlet.dev/api/v1/service-autopilot/get_route
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 | Description |
|---|---|---|
| crew required | string | Crew or technician name. |
| date required | date | Route day. |
Request
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"}' result = client.call("service-autopilot", "get_route", {"crew":"crew","date":"2026-10-01"}) const result = await cotlet.call('service-autopilot', 'get_route', {"crew":"crew","date":"2026-10-01"}); cotlet call service-autopilot get_route --data '{"crew":"crew","date":"2026-10-01"}' Example response
{
"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
readPOST https://cotlet.dev/api/v1/service-autopilot/list_estimates
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 | Description |
|---|---|---|
| client_id | string | Only this client. |
| since | date | Only estimates created on or after this date. |
| limit | integer | 1 to 100. Default: 25. |
Request
curl -X POST https://cotlet.dev/api/v1/service-autopilot/list_estimates \
-H "Authorization: Bearer $COTLET_API_KEY" result = client.call("service-autopilot", "list_estimates") const result = await cotlet.call('service-autopilot', 'list_estimates'); cotlet call service-autopilot list_estimates Example response
{
"estimates": [
{
"estimate_id": "E-20418",
"client": "Dana Henderson",
"total": "450.00",
"status": "sent",
"sent_at": "2026-10-08"
}
]
} List invoices
readPOST https://cotlet.dev/api/v1/service-autopilot/list_invoices
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 | Description |
|---|---|---|
| status | enum | unpaid, paid or all. Default: unpaid. |
| client_id | string | Only this client. |
| since | date | Only invoices dated on or after this date. |
| limit | integer | 1 to 200. Default: 50. |
Request
curl -X POST https://cotlet.dev/api/v1/service-autopilot/list_invoices \
-H "Authorization: Bearer $COTLET_API_KEY" result = client.call("service-autopilot", "list_invoices") const result = await cotlet.call('service-autopilot', 'list_invoices'); cotlet call service-autopilot list_invoices Example response
{
"invoices": [
{
"invoice_id": "I-70198",
"client": "Lee Park",
"amount": "120.00",
"due_date": "2026-09-05",
"status": "unpaid",
"days_past_due": 36
}
]
} Add client
writePOST https://cotlet.dev/api/v1/service-autopilot/add_client
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 | Description |
|---|---|---|
| name required | string | Person or company name. |
| address required | string | Service address. |
| string | Client email. | |
| phone | string | Mobile number. |
| type | enum | client or lead. Default: client. |
| notes | string | Gate codes, pets, special instructions. |
Request
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"}' result = client.call("service-autopilot", "add_client", {"name":"Jane Doe","address":"address"}) const result = await cotlet.call('service-autopilot', 'add_client', {"name":"Jane Doe","address":"address"}); cotlet call service-autopilot add_client --data '{"name":"Jane Doe","address":"address"}' Example response
{
"client_id": "4410382",
"name": "Dana Henderson",
"type": "client",
"address": "12 Oak Lane"
} Create job
writePOST https://cotlet.dev/api/v1/service-autopilot/create_job
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 | Description |
|---|---|---|
| client_id required | string | Client ID from search_clients. |
| service required | string | Service name as set up in your account, e.g. Mowing. |
| start_date required | date | First visit. |
| recurrence | enum | one_time, weekly, every_other_week or monthly. Default: one_time. |
| crew | string | Crew or technician name. |
| price | string | Price per visit, e.g. 45.00. |
| instructions | string | Special instructions for the visit. |
Request
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."}' 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."}) 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."}); 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
{
"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
writePOST https://cotlet.dev/api/v1/service-autopilot/reschedule_job
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 | Description |
|---|---|---|
| job_id required | string | Job ID from list_jobs. |
| date required | date | New day. |
| crew | string | New crew or technician. Default: unchanged. |
Request
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"}' result = client.call("service-autopilot", "reschedule_job", {"job_id":"9827514","date":"2026-10-16"}) const result = await cotlet.call('service-autopilot', 'reschedule_job', {"job_id":"9827514","date":"2026-10-16"}); cotlet call service-autopilot reschedule_job --data '{"job_id":"9827514","date":"2026-10-16"}' Example response
{
"job_id": "9827514",
"date": "2026-10-16",
"crew": "Crew 2",
"status": "scheduled"
} Add job note
writePOST https://cotlet.dev/api/v1/service-autopilot/add_job_note
Adds a text note to one job. It reaches no client and runs without asking first.
Parameters
| Name | Type | Description |
|---|---|---|
| job_id required | string | Job ID from list_jobs. |
| note required | string | Note text. |
Request
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"}' result = client.call("service-autopilot", "add_job_note", {"job_id":"job_8c41d2","note":"note"}) const result = await cotlet.call('service-autopilot', 'add_job_note', {"job_id":"job_8c41d2","note":"note"}); cotlet call service-autopilot add_job_note --data '{"job_id":"job_8c41d2","note":"note"}' Example response
{
"job_id": "9827514",
"note_id": "n_3301",
"status": "added"
} Create estimate
writePOST https://cotlet.dev/api/v1/service-autopilot/create_estimate
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 | Description |
|---|---|---|
| client_id required | string | Client ID from search_clients. |
| items required | object[] | Line items, each with service, quantity and price. |
| notes | string | Message shown on the estimate. |
Request
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."}' 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."}) 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."}); 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
{
"estimate_id": "E-20418",
"client_id": "4410382",
"total": "450.00",
"status": "created"
} POST https://cotlet.dev/api/v1/service-autopilot/send_estimate
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 | Description |
|---|---|---|
| estimate_id required | string | Estimate ID from list_estimates or create_estimate. |
Request
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"}' result = client.call("service-autopilot", "send_estimate", {"estimate_id":"estimate_8c41d2"}) const result = await cotlet.call('service-autopilot', 'send_estimate', {"estimate_id":"estimate_8c41d2"}); cotlet call service-autopilot send_estimate --data '{"estimate_id":"estimate_8c41d2"}' Example response
{
"estimate_id": "E-20418",
"status": "sent",
"sent_to": "dana@example.com"
} POST https://cotlet.dev/api/v1/service-autopilot/create_invoice
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 | Description |
|---|---|---|
| client_id required | string | Client ID from search_clients. |
| job_ids | string[] | Completed jobs to bill. Default: all unbilled completed jobs. |
| send | boolean | Email the invoice to the client. Default: false. |
Request
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"}' result = client.call("service-autopilot", "create_invoice", {"client_id":"client_8c41d2"}) const result = await cotlet.call('service-autopilot', 'create_invoice', {"client_id":"client_8c41d2"}); cotlet call service-autopilot create_invoice --data '{"client_id":"client_8c41d2"}' Example response
{
"invoice_id": "I-70231",
"client_id": "4410382",
"jobs": 4,
"amount": "180.00",
"sent": true
} POST https://cotlet.dev/api/v1/service-autopilot/send_text
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 | Description |
|---|---|---|
| client_id required | string | Client ID from search_clients. |
| message required | string | Text message body. |
Request
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"}' result = client.call("service-autopilot", "send_text", {"client_id":"client_8c41d2","message":"message"}) const result = await cotlet.call('service-autopilot', 'send_text', {"client_id":"client_8c41d2","message":"message"}); cotlet call service-autopilot send_text --data '{"client_id":"client_8c41d2","message":"message"}' Example response
{
"client_id": "4410382",
"status": "sent",
"sent_at": "2026-10-12T17:30:00-04:00"
}