| GET /customers | Search with q; filter with filter=members|owing|commercial; page with limit and page. |
| POST /customers | A customer and their first address. A likely duplicate comes back as duplicates unless you send force. |
| GET /customer/{id} | Everything about them: addresses, contacts, jobs, invoices, estimates, memberships, equipment. |
| PUT /customer/{id} | Change details. |
| POST /customer/{id}/merge | Move everything into another customer: {"into": id}. |
| GET /by-phone | Who a phone number belongs to. |
| POST /jobs | Book a job: customer, location, job_type, start_at, techs, arrive_from, arrive_to. |
| GET /jobs | Filter by status, tech, customer, from, to, q. |
| GET /job/{id} | The whole job, with visits, invoice, estimates, forms, costs and history. |
| POST /job/{id}/do/{action} | complete, hold, unhold, cancel, uncancel, reopen. |
| POST /appt/{id}/do/{action} | dispatch, arrive, done, confirm, hold, reopen. |
| POST /appt/{id}/assign | Who's going: {"techs": [ids]}. Warns about clashes. |
| GET /availability | Open arrival windows for a job_type at a location or zip. |
| GET /board | The dispatch board for a day. |
| POST /assist | Who should go where. Shows you unless you send apply. |
| POST /optimize | A shorter route for a tech on a day. |
| GET /pricebook | Filter by kind and q. |
| POST /estimates | job or customer, name, tier, proposal, items. |
| POST /estimate/{id}/sell | Sold: how is now or later. |
| GET /invoices | filter=review|unpaid|overdue|unsent. |
| GET /invoice/{id} | Lines, payments and totals. |
| POST /invoice/{id}/items | Add a line: a pricebook item, or your own name and price. |
| POST /payments | customer, kind, amount, and apply or auto. |
| POST /payment/{id}/refund | Money going back. |
| GET /aging | Who owes what, and for how long. |