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
Service Autopilot 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.

POST 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

Parameters: search_clients
NameTypeDescription
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
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
result = client.call("service-autopilot", "search_clients", {"query":"query"})
Node.js
const result = await cotlet.call('service-autopilot', 'search_clients', {"query":"query"});
CLI
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

read

POST 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

Parameters: get_client
NameTypeDescription
client_id required string Client ID from search_clients.

Request

cURL
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
result = client.call("service-autopilot", "get_client", {"client_id":"client_8c41d2"})
Node.js
const result = await cotlet.call('service-autopilot', 'get_client', {"client_id":"client_8c41d2"});
CLI
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

read

POST 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

Parameters: list_jobs
NameTypeDescription
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
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
result = client.call("service-autopilot", "list_jobs", {"from":"2026-10-01"})
Node.js
const result = await cotlet.call('service-autopilot', 'list_jobs', {"from":"2026-10-01"});
CLI
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

read

POST 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

Parameters: get_route
NameTypeDescription
crew required string Crew or technician name.
date required date Route day.

Request

cURL
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
result = client.call("service-autopilot", "get_route", {"crew":"crew","date":"2026-10-01"})
Node.js
const result = await cotlet.call('service-autopilot', 'get_route', {"crew":"crew","date":"2026-10-01"});
CLI
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"
    }
  ]
}

POST 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

Parameters: list_estimates
NameTypeDescription
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
curl -X POST https://cotlet.dev/api/v1/service-autopilot/list_estimates \
  -H "Authorization: Bearer $COTLET_API_KEY"
Python
result = client.call("service-autopilot", "list_estimates")
Node.js
const result = await cotlet.call('service-autopilot', 'list_estimates');
CLI
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"
    }
  ]
}

POST 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

Parameters: list_invoices
NameTypeDescription
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
curl -X POST https://cotlet.dev/api/v1/service-autopilot/list_invoices \
  -H "Authorization: Bearer $COTLET_API_KEY"
Python
result = client.call("service-autopilot", "list_invoices")
Node.js
const result = await cotlet.call('service-autopilot', 'list_invoices');
CLI
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

write

POST 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

Parameters: add_client
NameTypeDescription
name required string Person or company name.
address required string Service address.
email string Client email.
phone string Mobile number.
type enum client or lead. Default: client.
notes string Gate codes, pets, special instructions.

Request

cURL
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
result = client.call("service-autopilot", "add_client", {"name":"Jane Doe","address":"address"})
Node.js
const result = await cotlet.call('service-autopilot', 'add_client', {"name":"Jane Doe","address":"address"});
CLI
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

write

POST 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

Parameters: create_job
NameTypeDescription
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
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
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
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
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"
}

POST 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

Parameters: reschedule_job
NameTypeDescription
job_id required string Job ID from list_jobs.
date required date New day.
crew string New crew or technician. Default: unchanged.

Request

cURL
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
result = client.call("service-autopilot", "reschedule_job", {"job_id":"9827514","date":"2026-10-16"})
Node.js
const result = await cotlet.call('service-autopilot', 'reschedule_job', {"job_id":"9827514","date":"2026-10-16"});
CLI
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

write

POST 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

Parameters: add_job_note
NameTypeDescription
job_id required string Job ID from list_jobs.
note required string Note text.

Request

cURL
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
result = client.call("service-autopilot", "add_job_note", {"job_id":"job_8c41d2","note":"note"})
Node.js
const result = await cotlet.call('service-autopilot', 'add_job_note', {"job_id":"job_8c41d2","note":"note"});
CLI
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"
}

POST 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

Parameters: create_estimate
NameTypeDescription
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
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
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
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
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"
}

Send estimate

write Confirm

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

Parameters: send_estimate
NameTypeDescription
estimate_id required string Estimate ID from list_estimates or create_estimate.

Request

cURL
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
result = client.call("service-autopilot", "send_estimate", {"estimate_id":"estimate_8c41d2"})
Node.js
const result = await cotlet.call('service-autopilot', 'send_estimate', {"estimate_id":"estimate_8c41d2"});
CLI
cotlet call service-autopilot send_estimate --data '{"estimate_id":"estimate_8c41d2"}'

Example response

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

Create invoice

write Confirm

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

Parameters: create_invoice
NameTypeDescription
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
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
result = client.call("service-autopilot", "create_invoice", {"client_id":"client_8c41d2"})
Node.js
const result = await cotlet.call('service-autopilot', 'create_invoice', {"client_id":"client_8c41d2"});
CLI
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
}

Send text

write Confirm

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

Parameters: send_text
NameTypeDescription
client_id required string Client ID from search_clients.
message required string Text message body.

Request

cURL
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
result = client.call("service-autopilot", "send_text", {"client_id":"client_8c41d2","message":"message"})
Node.js
const result = await cotlet.call('service-autopilot', 'send_text', {"client_id":"client_8c41d2","message":"message"});
CLI
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"
}