Local services & SaaS
Jobber
Quotes, jobs, invoices and clients in your Jobber account.
14 endpoints
Trusso has no public API and no Trusso MCP server (checked 13 Nov 2026). Cotlet runs a hosted Trusso MCP server with 11 tools that ChatGPT and Claude use in your own Trusso account. Lead replies, estimates, crew invites and sub bids wait for your OK.
11 tools Read and write
Trusso publishes no public API. Its site and Help Center document no API keys, endpoints or webhooks, and no Trusso MCP server or official ChatGPT or Claude connector was found.
| What you need | Official route | By hand | Cotlet |
|---|---|---|---|
| Ask ChatGPT or Claude to do the work | No API or MCP server | Copy and paste | Hosted MCP server |
| Leads from marketplaces into one inbox | Built-in lead capture | Leads inbox | Reads and replies after your OK |
| Estimates, jobs, invoices and sub bids | No outside access | One screen at a time | 11 tools, writes after your OK |
| Run from n8n or a script | Nothing to call | Manual only | REST, same key |
Checked 13 Nov 2026. Sources: Trusso · Trusso Help Center · Help: Getting started with Trusso · Help: Connecting your lead sources · Help: Replying to Angi & Thumbtack customers · Help: Importing customers from another CRM · Help: Business vs residential customers · Help: Customer SMS consent & opt-out · Help: Estimates & online approval · Help: Scheduling jobs & assigning crew · Help: Recurring jobs · Help: Invoices & getting paid · Help: Adding crew members & seat limits · Help: The crew mobile experience · Help: Automatic clock-in & out · Help: Bidding out work to subs
Once, in a browser we host for you.
One address in its settings.
Record the check, then check the balance.
Your agent works in your own signed-in Cloud Browser. Anything that reaches a customer, a crew member or a sub waits for your OK. Who can see your session
Sign in to Trusso in a Cloud Browser. Open dashboard.trussoapp.com in your Cotlet Cloud Browser and sign in with your own owner or manager login.
Add the Cotlet address. Enter https://cotlet.dev/mcp/v1 as the MCP server or connector URL in your agent.
Let the agent in. Chat apps open a Cotlet sign-in page. Editors, n8n and scripts send an API key made in the console.
Trusso is served from the shared address https://cotlet.dev/mcp/v1, like every other app you switch on, so you add one connector for all of them. Turned on Trusso after connecting? Refresh the connector and the 11 Trusso tools load.
Settings > Apps & Connectors > Create
MCP server URL: https://cotlet.dev/mcp/v1/connect
Authentication: OAuth Settings > Connectors > Add custom connector
URL: https://cotlet.dev/mcp/v1/connect
Claude Code:
claude mcp add --transport http cotlet \
https://cotlet.dev/mcp/v1 \
--header "Authorization: Bearer $COTLET_API_KEY" // ~/.cursor/mcp.json
{
"mcpServers": {
"cotlet": {
"url": "https://cotlet.dev/mcp/v1",
"headers": { "Authorization": "Bearer ${env:COTLET_API_KEY}" }
}
}
} # ~/.codex/config.toml
[mcp_servers.cotlet]
url = "https://cotlet.dev/mcp/v1"
bearer_token_env_var = "COTLET_API_KEY" MCP Client Tool (inside an AI Agent)
Transport: HTTP Streamable
URL: https://cotlet.dev/mcp/v1
Auth: Bearer, <your key>
Tool: trusso_read One tool per owner workflow in the Trusso Help Center. Tools with an `action` only read with `list` and `get`; every other action writes and asks first.
The Leads inbox, marketplace replies and the customer list, including CSV imports from another CRM.
Trusso turns lead emails from the sources you connected into structured leads. A reply to an Angi or Thumbtack lead goes back through the marketplace relay, so the customer sees a normal answer, and their next message lands on the lead's timeline. The reply reaches the customer, so it waits for your OK. By default you confirm each call; you can switch that off for this tool.
MCP calltrusso_write → manage_leads
REST endpointPOST https://cotlet.dev/api/v1/trusso/leads/manage
| Name | Type | Description |
|---|---|---|
| action string required | string | One of `list`, `get`, `reply`. `list` and `get` only read. |
| lead string | string | Lead name, for `get` and `reply`. |
| source string | string | For `list`: Angi, Thumbtack, Yelp, Google Local Services, HomeAdvisor or your website form. |
| message string | string | For `reply`: the text to send. |
{
"action": "action"
} {
"leads": [
{
"lead": "Example Homeowner",
"source": "Angi",
"request": "Interior repaint, 3 rooms",
"received": "2026-11-13T08:41"
},
{
"lead": "Sample Owner",
"source": "Website form",
"request": "Deck staining quote",
"received": "2026-11-12T19:05"
}
]
} Customers are residential unless `business` is true. Set `sms_consent` only when the customer agreed to texts: Trusso sends estimate links, reminders and invoice updates by SMS only to customers with confirmed consent, and marks anyone who replies STOP as opted out. By default you confirm each call; you can switch that off for this tool.
MCP calltrusso_write → manage_customers
REST endpointPOST https://cotlet.dev/api/v1/trusso/customers/manage
| Name | Type | Description |
|---|---|---|
| action string required | string | One of `list`, `get`, `create`, `update`. `list` and `get` only read. |
| customer string | string | Customer name, as manage_customers `list` returns it. |
| fields object | object | For `create` and `update`: first and last name, email, mobile and landline, service address, tags, `business` (true or false), organization name and `sms_consent`. |
{
"action": "action"
} {
"customer": "Example Dental",
"business": true,
"contact": "Office Manager",
"email": "office@example.com",
"sms_consent": false,
"saved": true
} This is Customers > Import CSV in the web dashboard, for owners, co-owners and managers. Exports from Jobber, ServiceTitan, ServiceM8 and Housecall Pro are recognised. Rows without a name are skipped; imported customers start with SMS consent off. The agent shows you the preview before the real import. By default you confirm each call; you can switch that off for this tool.
MCP calltrusso_write → import_customers_from_another_crm
REST endpointPOST https://cotlet.dev/api/v1/trusso/customers-from-another-crms
| Name | Type | Description |
|---|---|---|
| csv_url string required | string | A link to the CSV file. The first row holds the column names. |
| mapping object | object | Column to field, where Trusso's automatic match needs a change. Use `skip` for a column you do not want. |
| skip_duplicates boolean | boolean | Default true: rows matching an existing customer's email or phone are skipped. |
| preview_only boolean | boolean | Default true: return the preview and import nothing. |
{
"csv_url": "https://example.com"
} {
"rows": 214,
"ready": 201,
"duplicates": 11,
"no_name": 2,
"business": 37,
"imported": false
} An approved estimate becomes a job; jobs get a date, a time window, crew and, if needed, a repeat.
Every sent estimate has an online approval page the customer opens on their phone. An approved estimate flows into a job, and later into an invoice, with the same line items. `send` reaches the customer, so it waits for your OK. By default you confirm each call; you can switch that off for this tool.
MCP calltrusso_write → manage_estimates
REST endpointPOST https://cotlet.dev/api/v1/trusso/estimates/manage
| Name | Type | Description |
|---|---|---|
| action string required | string | One of `list`, `get`, `create`, `send`. `list` and `get` only read. |
| estimate string | string | Estimate title, for `get` and `send`. |
| customer string | string | For `create`: a customer or a lead. |
| lines array | array | For `create`: price book items or free-form lines, each with description, quantity and price. |
{
"action": "action"
} {
"estimate": "Interior repaint, 3 rooms",
"customer": "Example Homeowner",
"lines": [
{
"description": "Walls and ceilings, 3 rooms",
"quantity": 1,
"price": 2100
},
{
"description": "Trim and doors",
"quantity": 1,
"price": 300
}
],
"total": 2400,
"status": "draft"
} Jobs move through scheduled, in progress and completed. A recurring series is one entry in the jobs list but one job per scheduled day on the calendar; this returns the days inside the range. Read only, it runs without asking.
MCP calltrusso_read → list_jobs
REST endpointGET https://cotlet.dev/api/v1/trusso/jobs
| Name | Type | Description |
|---|---|---|
| status string | string | `scheduled`, `in_progress` or `completed`. Leave empty for all. |
| from string | string | ISO date, start of the range. |
| to string | string | ISO date, end of the range. |
{
"jobs": [
{
"job": "Kitchen repaint",
"customer": "Example Homeowner",
"date": "2026-11-16",
"window": "8:00 to 12:00",
"crew": [
"Lead A",
"Helper B"
],
"status": "scheduled"
},
{
"job": "Office cleaning, Example Dental",
"date": "2026-11-16",
"series": "Mon, Wed",
"status": "scheduled"
}
]
} The customer's service address carries over to the job. Assigned crew see it in the mobile app with the address, scope and contact details their role allows. A new date or crew changes someone's day, so it waits for your OK. By default you confirm each call; you can switch that off for this tool.
MCP calltrusso_write → schedule_jobs
REST endpointPOST https://cotlet.dev/api/v1/trusso/jobs/schedule
| Name | Type | Description |
|---|---|---|
| action string required | string | One of `create`, `update`. `list` and `get` only read. |
| customer string | string | Customer name, as manage_customers `list` returns it. |
| job string | string | Job title, as list_jobs returns it. |
| date string | string | ISO date. |
| window string | string | Time window, for example 8:00 to 12:00. |
| crew array | array | Crew members to assign. |
{
"action": "action"
} {
"job": "Kitchen repaint",
"customer": "Example Homeowner",
"date": "2026-11-16",
"window": "8:00 to 12:00",
"crew": [
"Lead A",
"Helper B"
],
"status": "scheduled"
} Trusso creates each day's job about two weeks ahead, starts and completes it at its own times, and pays assigned crew per completed day. `end` removes the repeat: future days are cancelled and past days keep their history. By default you confirm each call; you can switch that off for this tool.
MCP calltrusso_write → manage_recurring_jobs
REST endpointPOST https://cotlet.dev/api/v1/trusso/recurring-jobs/manage
| Name | Type | Description |
|---|---|---|
| action string required | string | One of `repeat`, `update`, `end`. `list` and `get` only read. |
| job string | string | Job title, as list_jobs returns it. |
| frequency string | string | For `repeat`: `daily` or `weekly`. |
| weekdays array | array | For weekly series: the days, for example Mon and Wed. |
| end_date string | string | Optional ISO end date. |
| changes object | object | For `update`: title, times, notes or crew. Future days take the change; worked days stay as they were. |
{
"action": "action"
} {
"job": "Office cleaning, Example Dental",
"frequency": "weekly",
"weekdays": [
"Mon",
"Wed"
],
"end_date": "2027-03-31",
"next_days": [
"2026-11-16",
"2026-11-18"
],
"saved": true
} Card payments reconcile by themselves; cash, check, Venmo and Zelle are recorded here.
Customers pay online by card through the Stripe or Square account you use, and those payments reconcile by themselves. `record_payment` is for the rest: Trusso keeps partial payments, a running balance and the customer's lifetime total. Invoices past their due date come back flagged overdue. By default you confirm each call; you can switch that off for this tool.
MCP calltrusso_write → send_invoices_and_collect_payments
REST endpointPOST https://cotlet.dev/api/v1/trusso/invoices-and-collect-payments
| Name | Type | Description |
|---|---|---|
| action string required | string | One of `list`, `get`, `create`, `send`, `record_payment`. `list` and `get` only read. |
| invoice string | string | Invoice title or number, for every action except `list` and `create`. |
| customer string | string | Customer name, as manage_customers `list` returns it. |
| lines array | array | For `create`: line items, with tax and a due date. |
| payment object | object | For `record_payment`: amount, method (`cash`, `check`, `venmo` or `zelle`) and date. |
{
"action": "record_payment",
"invoice": "Interior repaint, 3 rooms",
"payment": {
"amount": 1000,
"method": "check",
"date": "2026-11-13"
}
} {
"invoice": "Interior repaint, 3 rooms",
"customer": "Example Homeowner",
"total": 2400,
"paid": 1000,
"balance": 1400,
"method": "check",
"overdue": false
} Crew records and logins, who clocked in where, and sealed bids from your subs.
This is Crew > Add Crew Member. Crew without an email can still be scheduled. Starter includes the owner plus 2 crew logins, Pro the owner plus 10 and Unlimited has no cap; at the limit Trusso asks you to upgrade. An invite reaches a person, so it waits for your OK. By default you confirm each call; you can switch that off for this tool.
MCP calltrusso_write → add_crew_members
REST endpointPOST https://cotlet.dev/api/v1/trusso/crew-members
| Name | Type | Description |
|---|---|---|
| action string required | string | One of `list`, `add`. `list` and `get` only read. |
| name string | string | For `add`: the crew member's name. |
| role string | string | `lead`, `technician`, `apprentice` or `helper`. |
| hourly_rate number | number | Hourly rate. |
| skills array | array | Skills, for example painting. |
| email string | string | Optional. With an email Trusso sends an invite to set a password for the mobile app. |
{
"action": "action"
} {
"name": "Helper C",
"role": "helper",
"hourly_rate": 22,
"skills": [
"painting",
"prep"
],
"invited": true,
"seats_used": "2 of 2"
} Each punch says whether it was automatic (geofence, about 100 meters around the job address by default), a manual tap, or closed by the system when a shift was left open, plus the distance from the site when GPS was available. Read only.
MCP calltrusso_read → read_clock_history
REST endpointGET https://cotlet.dev/api/v1/trusso/clock-histories/read
| Name | Type | Description |
|---|---|---|
| job string | string | Job title, as list_jobs returns it. |
| crew_member string | string | Crew member name. Give a job, a crew member or both. |
| date string | string | ISO date. Defaults to today. |
{
"job": "Kitchen repaint",
"date": "2026-11-13",
"punches": [
{
"crew_member": "Lead A",
"in": "07:58",
"out": "12:06",
"kind": "automatic",
"distance_m": 12
},
{
"crew_member": "Helper B",
"in": "08:10",
"out": "12:00",
"kind": "manual"
}
]
} Bids are sealed and can only go down until bidding closes. Awarding creates a confirmed work order at the bid price and updates the job's cost; the other subs get a close-out that names neither the winner nor the amount. A broadcast and an award both reach your subs, so they wait for your OK. By default you confirm each call; you can switch that off for this tool.
MCP calltrusso_write → bid_out_jobs_to_subs
REST endpointPOST https://cotlet.dev/api/v1/trusso/out-jobs-to-subs/bid
| Name | Type | Description |
|---|---|---|
| action string required | string | One of `broadcast`, `list_bids`, `extend`, `award`. `list` and `get` only read. |
| job string | string | Job title, as list_jobs returns it. |
| subs array | array | For `broadcast`: subs from your rolodex. Trade-matched subs are pre-selected. |
| tasks array | array | For `broadcast`: the job tasks to bid out. Empty bids out the whole job. |
| max_price number | number | Optional hard cap no bid can exceed. |
| closes string | string | Optional ISO date and time bidding closes. |
| bid string | string | For `award`: the sub whose bid wins. |
{
"action": "action"
} {
"job": "Exterior repaint",
"tasks": [
"Pressure wash",
"Paint siding"
],
"bids": [
{
"sub": "Example Painting Co",
"price": 3800
},
{
"sub": "Sample Coatings",
"price": 4150
}
],
"max_price": 4500,
"closes": "2026-11-18T17:00"
} Your signed-in Trusso browser profile, AES-256-GCM encrypted, in Finland. Never your password.
The 11 Trusso tools. The session cookie stays in the Cloud Browser.
What your owner or manager login sees on the web dashboard, and nothing more.
Your Trusso plan and billing, account preferences, the lead source connections and your Stripe or Square account.
You sign in again yourself, in the same Cloud Browser.
Disable Trusso for agents, reset the browser, or change your Trusso password.
You type your Trusso password yourself; the agent only uses the session that sign-in leaves behind. Our site scores A+ on Qualys SSL Labs, securityheaders.com and Mozilla Observatory (live results).
Trusso is adding to its product: its lead article lists Houzz, Bark, Porch, Facebook Lead Ads and Google Lead Forms as next. Cotlet watches the apps it serves and updates the Trusso server when the dashboard changes, so your agent keeps working without a change on your side.
Leads from a new source show up in the same Leads inbox, so the agent reads them once Trusso captures them.
If Trusso signs you out, one click in the Cotlet console reopens the Cloud Browser so you can sign in again.
| Action | How to put it right |
|---|---|
| Job date, window or crew | Call schedule_jobs again with the earlier values |
| Recurring series | End it with manage_recurring_jobs; past days keep their history |
| Customer details or SMS consent | Update the customer again with manage_customers |
| Sent estimate, lead reply or awarded bid | Already with the customer or sub: follow up with them directly |
All 9 write tools ask first: by default you confirm each call, and you can switch that off per tool. The 2 read tools, jobs and clock history, run at once.
{
"name": "send_invoices_and_collect_payments",
"arguments": {
"action": "record_payment",
"invoice": "Interior repaint, 3 rooms",
"payment": {
"amount": 1000,
"method": "check",
"date": "2026-11-13"
}
}
} curl -X POST https://cotlet.dev/api/v1/trusso/invoices-and-collect-payments \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"action":"record_payment","invoice":"Interior repaint, 3 rooms","payment":{"amount":1000,"method":"check","date":"2026-11-13"}}' {
"invoice": "Interior repaint, 3 rooms",
"customer": "Example Homeowner",
"total": 2400,
"paid": 1000,
"balance": 1400,
"method": "check",
"overdue": false
} The example records a $1,000 check on a $2,400 repaint invoice, leaving $1,400; Trusso keeps the running balance and the customer's lifetime total. A cron job or n8n flow can make the same call over REST at /api/v1/trusso with the same key and price, in JSON. Failed calls are free.
About $21 a monthfor a painting contractor with a small crew, 3,580 credits. Your Trusso plan stays as it is.
| Job | Calls | Credits |
|---|---|---|
| Morning look at new leads and today's jobs | 2 × 22 | 440 |
| Marketplace replies | 1 × 30 | 300 |
| Estimates drafted and sent | 3 × 12 | 360 |
| Approved jobs scheduled with crew | 2 × 10 | 200 |
| Clock history check | 2 × 22 | 440 |
| Invoices sent and payments recorded | 2 × 12 | 240 |
| Monday overdue invoice list | 1 × 4 | 40 |
| Sub bids broadcast and awarded | 3 × 2 | 60 |
| Cloud Browser, 30 days | 1,500 | |
| Total | 208 calls | 3,580 |
The smallest pack, 5,000 credits for $29, covers this month. A busy season with more leads and jobs uses more calls.
Credit packs are one-time purchases, not a subscription. The month above is an example built from our own assumptions, not measured customer usage.
| Credits | Price, one time | Calls at 10 credits | Per 1,000 credits |
|---|---|---|---|
| 5,000 | $29 | 500 | $5.80 |
| 15,000 | $79 | 1,500 | $5.27 |
| 32,000 | $149 | 3,200 | $4.66 |
| 60,000 | $249 | 6,000 | $4.15 |
Only successful calls use credits; failed calls and timeouts cost nothing. At a balance of 0 calls pause, never a surprise charge. Authenticate with the Authorization: Bearer header.
| Option | What it does | Where it stops |
|---|---|---|
| Trusso lead capture | Turns marketplace and website lead emails into leads, from a linked inbox or a forwarding address. | Brings leads in; it does not quote, schedule or bill. |
| Trusso AI assistant and AI Receptionist | Trusso's own AI, inside the app. | ChatGPT, Claude or a script cannot call it. |
| By hand | Open each lead, job and invoice on the phone or the dashboard. | One screen at a time, between jobs. |
If Trusso's own AI already covers the job, use it: it is the vendor's own tool. Cotlet fits when you want ChatGPT, Claude or a script working in Trusso from your own login, with nothing to host.
Take Group sp. z o.o. is the company behind Cotlet: software, registered in Poland, EU (VAT PL6342984273), in business since 2019, with founders Bart Krawczyk (Co-founder, CTO) and Jake Slugocki (Co-founder, SEO, sales and marketing). Send questions about the Trusso tools to contact@cotlet.dev.
Sign up free at https://cotlet.dev/signup?app=trusso, turn on Trusso under Integrations in the console and sign in at https://dashboard.trussoapp.com/ in your Cloud Browser. Then connect your AI agent and ask it about today's jobs. The trial needs no card.
Trusso publishes no public API (checked 13 Nov 2026). Its site and Help Center document no API keys, endpoints or webhooks; its own connections are lead capture from inboxes and marketplaces, and Stripe or Square for card payments. No Trusso MCP server or official ChatGPT or Claude connector was found. Cotlet works in your own signed-in Trusso account instead.
An owner or manager login on the web dashboard. Trusso points crew members who sign in on the web to the mobile app, and crew do not see your customer list, pricing or financials, so a crew login gives the agent nothing to work on. Customer imports need an owner, co-owner or manager.
Trusso's AI assistant and AI Receptionist run inside Trusso; its Help Center shows the assistant setting up recurring jobs from a sentence. Cotlet is separate: it lets ChatGPT, Claude or a script you choose use Trusso through the same tools over MCP or REST.
Only through tools that ask first, and only where Trusso allows it: Trusso sends SMS only to customers with confirmed consent and stops texting anyone who replied STOP. Imported customers start opted out.
Only in how it is called. Both carry the same 11 tools, inputs, answers, API key and price. Agents use MCP; scripts and n8n HTTP steps use REST.
No. Cotlet is independent and not affiliated with Trusso.
Free 7-day trial with 2,000 credits, no card needed.
May we use Google Analytics to see which pages help people? It sets cookies only if you accept. No ads, and we never sell data. Cookie policy