Health & fitness
Trainerize
Clients, programs, check-ins and messages for your Trainerize business.
14 endpoints
Read SimplePractice schedules and administrative records through MCP or REST. Connect your authorized account to an agent or private reporting workflow.
13 tools Read and write
SimplePractice has no public API and no MCP server for practices (checked 27 Oct 2026). Cotlet runs 13 SimplePractice tools hosted, over MCP for agents and REST for scripts, in your own login.
| What you need | SimpleConnect | GitHub MCP server | Cotlet |
|---|---|---|---|
| Open to a practice | Health plans and EAPs only | Yes | Yes |
| Clinician side: requests, intake, claims | Appointment requests only | Client Portal view only | Yes |
| Writes: accept, share, message | No | Read-only | Yes, you approve each |
| Works from Claude or ChatGPT | No | Desktop apps only | Yes, hosted |
| Allowed by SimplePractice's terms | Yes, official | Uses the portal | Uses the web app |
Checked 27 Oct 2026. Sources: SimplePractice Help Center: Comparing features by plan (FAQ on API) · SimplePractice Enterprise launches API (press release) · Zapier app directory (no SimplePractice app)
Use your own account in its Cotlet Cloud Browser.
Connect your agent or create a Cotlet API key.
Ask your agent or send an HTTP request.
We never keep your SimplePractice password, and no tool reads progress notes. Who can see your session
Use MCP with your AI agent, or HTTP requests in n8n, Make, Zapier and scripts. Follow the MCP setup below or jump to the REST guide.
Sign in to SimplePractice. Create a Cotlet account, open SimplePractice in its Cloud Browser, sign in with your two-factor code and press Enable for agents.
Add the server address. Enter https://cotlet.dev/mcp/v1 where your agent takes an MCP server or a custom connector.
Approve the agent. Chat apps open a Cotlet sign-in page. Editors, n8n and scripts send an API key made in the console.
The shared address https://cotlet.dev/mcp/v1 carries SimplePractice next to your other apps. Turned SimplePractice on after connecting? Refresh the connector so its tools appear.
Settings > Connectors > Add custom connector
URL: https://cotlet.dev/mcp/v1/connect
Claude Code:
claude mcp add --transport http cotlet-simplepractice \
https://cotlet.dev/mcp/v1 \
--header "Authorization: Bearer $COTLET_API_KEY" Settings > Apps & Connectors > Create
MCP server URL: https://cotlet.dev/mcp/v1/connect
Authentication: OAuth // ~/.cursor/mcp.json
{
"mcpServers": {
"cotlet-simplepractice": {
"url": "https://cotlet.dev/mcp/v1",
"headers": { "Authorization": "Bearer ${env:COTLET_API_KEY}" }
}
}
} # ~/.codex/config.toml
[mcp_servers.cotlet-simplepractice]
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: simplepractice_read Make: MCP Client > Call a tool
Zapier: MCP Client by Zapier > Run Tool
Server URL: https://cotlet.dev/mcp/v1
Token: <your key>
Tool: simplepractice_read Create a Cotlet API key with access to SimplePractice and its read operations. Store it as COTLET_API_KEY in your environment or automation platform's credential store.
Sign in to SimplePractice in its Cotlet Cloud Browser and enable the app for agents. Your owner or team role must permit the calendar, client or billing records you request.
curl "https://cotlet.dev/api/v1/simplepractice/appointments?from=2026-10-28&to=2026-10-28" \
-H "Authorization: Bearer $COTLET_API_KEY" A successful REST call puts the tool output in result. This illustrative response excerpt omits call IDs, messages and credit details.
{
"status": "success",
"app": "simplepractice",
"tool": "list_appointments",
"result": {
"appointments": [
{
"appointment_id": "ap_5021",
"start": "2026-10-28T09:00:00-07:00",
"duration_minutes": 53,
"client": "Jordan Avery",
"client_id": "cl_3104",
"clinician": "Dr. Sam Lee",
"service": "90837",
"location": "Telehealth",
"status": "Show",
"first_session": false
}
]
}
} Replace the dates with your reporting range and read result.appointments. This operation has no cursor or page-size input; timestamps keep their offset and duration uses minutes.
Compare appointment times and status as well as IDs. Pending requests are separate and require list_appointment_requests.
These reads do not return progress notes or clinical documents. Keep administrative reports in a permitted private destination and retain the access and privacy limits described on this page.
| Tool | Connect through | Example workflow |
|---|---|---|
| n8n | HTTP Request | Read appointment records into a permitted private administrative schedule without changing appointments. |
| Make | HTTP > Make a request | Read pending appointment requests into a staff review queue without accepting or rejecting requests. |
| Python or Node.js | REST API | Read claims and claim details into a private denied-or-rejected administration queue without submitting claims. |
Send Authorization: Bearer <your Cotlet API key> in request headers. You configure the schedule, destination and record comparisons.
Cotlet reads SimplePractice; your workflow steps write to your chosen destination. These HTTP workflows do not require a native Cotlet connector or a prebuilt template.
Python and Node.js can use the same HTTP requests without an AI agent. Keep access keys in credentials, outside shared workflow exports.
The API and MCP reference lists operations and inputs. The REST API guide explains authentication, errors and approvals.
Requests from Therapy Finder and the Optum portal expire after 72 hours. A status change can create an invoice and an AutoPay charge.
Returns appointments in start order with client name, clinician, service, location, status (Show, No show, Canceled, Late canceled, Clinician canceled) and whether the appointment is a client's first. Pending requests are left out: use list_appointment_requests. Progress notes and other clinical documents are never returned.
MCP callsimplepractice_read → list_appointments
REST endpointGET https://cotlet.dev/api/v1/simplepractice/appointments
| Name | Type | Description |
|---|---|---|
| from date | date | Start of the range. Default: today. |
| to date | date | End of the range. Default: 7 days after from. |
| clinician string | string | Clinician name as SimplePractice shows it. Default: every clinician you can see. |
| status string | string | Show, No show, Canceled, Late canceled or Clinician canceled. Default: all. |
{
"appointments": [
{
"appointment_id": "ap_5021",
"start": "2026-10-28T09:00:00-07:00",
"duration_minutes": 53,
"client": "Jordan Avery",
"client_id": "cl_3104",
"clinician": "Dr. Sam Lee",
"service": "90837",
"location": "Telehealth",
"status": "Show",
"first_session": false
},
{
"appointment_id": "ap_5022",
"start": "2026-10-28T11:00:00-07:00",
"duration_minutes": 60,
"client": "Riley Chen",
"client_id": "cl_3188",
"clinician": "Dr. Sam Lee",
"service": "90791",
"location": "Main office",
"status": "Show",
"first_session": true
}
]
} Returns pending requests, oldest first, with the requested time, service, whether the person is a new or existing client, and the source: Therapy Finder, Client Portal, Professional Website or In-network referrals. SimplePractice expires requests from Therapy Finder and the Optum provider portal 72 hours after submission. Nothing is changed.
MCP callsimplepractice_read → list_appointment_requests
REST endpointGET https://cotlet.dev/api/v1/simplepractice/appointment-requests
| Name | Type | Description |
|---|---|---|
| source string | string | Therapy Finder, Client Portal, Professional Website or In-network referrals. Default: all. |
{
"requests": [
{
"request_id": "rq_8810",
"source": "Professional Website",
"requested_start": "2026-10-29T15:00:00-07:00",
"service": "90791",
"new_client": true,
"name": "Riley Chen",
"submitted_at": "2026-10-26T20:14:00-07:00"
},
{
"request_id": "rq_8812",
"source": "Client Portal",
"requested_start": "2026-10-30T10:00:00-07:00",
"service": "90837",
"new_client": false,
"name": "Jordan Avery",
"submitted_at": "2026-10-27T07:02:00-07:00"
}
]
} Accepts the request as SimplePractice's Accept button does: the appointment moves onto the calendar and the client gets the confirmation email, with the intake documents you name. By default you confirm each call; you can switch that off for this tool.
MCP callsimplepractice_write → accept_appointment_request
REST endpointPOST https://cotlet.dev/api/v1/simplepractice/requests/{request_id}/appointment-request/accept
| Name | Type | Description |
|---|---|---|
| request_id string required | string | Request ID from list_appointment_requests. |
| documents string[] | string[] | Names of shareable documents to send with the confirmation. Default: none. |
| message string | string | Text added to the confirmation email. |
{
"request_id": "rq_8810",
"documents": [
"Intake packet"
],
"message": "Looking forward to meeting you on Thursday."
} {
"request_id": "rq_8810",
"status": "accepted",
"appointment_id": "ap_5040",
"client_id": "cl_3188",
"start": "2026-10-29T15:00:00-07:00",
"documents_shared": [
"Intake packet"
],
"email_sent": true
} Declines the request. SimplePractice archives a new client's profile and emails them; an existing client gets an email with a Client Portal link to pick another time. The reason stays private to the practice. By default you confirm each call; you can switch that off for this tool.
MCP callsimplepractice_write → decline_appointment_request
REST endpointPOST https://cotlet.dev/api/v1/simplepractice/requests/{request_id}/appointment-request/decline
| Name | Type | Description |
|---|---|---|
| request_id string required | string | Request ID from list_appointment_requests. |
| reason string required | string | Reason for declining, kept in SimplePractice. |
{
"request_id": "request_8c41d2",
"reason": "reason"
} {
"request_id": "rq_8815",
"status": "declined",
"email_sent": true,
"client_archived": true
} Books the appointment with the client's clinician, service and location. SimplePractice then sends its usual reminders by the client's notification settings, and the client sees it in the Client Portal. By default you confirm each call; you can switch that off for this tool.
MCP callsimplepractice_write → create_appointment
REST endpointPOST https://cotlet.dev/api/v1/simplepractice/clients/{client_id}/appointments
| Name | Type | Description |
|---|---|---|
| client_id string required | string | Client ID from find_client. |
| start datetime required | datetime | Start time with time zone. |
| duration_minutes integer | integer | Length. Default: the service's duration. |
| service string | string | Service code as set up in SimplePractice. Default: the client's last service. |
| location string | string | Office name or Telehealth. Default: the last location. |
{
"client_id": "client_8c41d2",
"start": "2026-10-01T09:00:00Z"
} {
"appointment_id": "ap_5051",
"client_id": "cl_3104",
"start": "2026-11-03T16:00:00-08:00",
"duration_minutes": 53,
"service": "90837",
"location": "Telehealth",
"status": "Show"
} Changes the status the way the calendar does. With automatic invoices on, Show, No show and Late canceled create an invoice, and a client on AutoPay is charged the full fee overnight. No show and Late canceled are never billed to insurance. By default you confirm each call; you can switch that off for this tool.
MCP callsimplepractice_write → set_appointment_status
REST endpointPUT https://cotlet.dev/api/v1/simplepractice/appointments/{appointment_id}/status
| Name | Type | Description |
|---|---|---|
| appointment_id string required | string | Appointment ID from list_appointments. |
| status string required | string | Show, No show, Canceled, Late canceled or Clinician canceled. |
{
"appointment_id": "appointment_8c41d2",
"status": "status"
} {
"appointment_id": "ap_4987",
"status": "No show",
"invoice_created": true,
"invoice_amount": 150
} Intake goes from your shareable documents. A Secure Message reaches one client and holds up to 5,000 characters.
Searches the Clients and contacts list and returns matches with client_id, status, primary clinician, billing type and whether Client Portal and Secure Messaging are on. Progress notes and other clinical documents are never returned.
MCP callsimplepractice_read → find_client
REST endpointGET https://cotlet.dev/api/v1/simplepractice/clients/find
| Name | Type | Description |
|---|---|---|
| query string required | string | Name, email or phone number. |
{
"query": "query"
} {
"clients": [
{
"client_id": "cl_3104",
"name": "Jordan Avery",
"status": "Active",
"clinician": "Dr. Sam Lee",
"billing_type": "Insurance",
"client_portal": true,
"secure_messaging": true
}
]
} Sends up to 5,000 characters to one client with Secure Messaging on. The client gets an email with a Client Portal link. SimplePractice has no group Secure Message, so the agent sends one per client. By default you confirm each call; you can switch that off for this tool.
MCP callsimplepractice_write → send_secure_message
REST endpointPOST https://cotlet.dev/api/v1/simplepractice/clients/{client_id}/secure-messages
| Name | Type | Description |
|---|---|---|
| client_id string required | string | Client ID from find_client. |
| body string required | string | Message text, up to 5,000 characters. |
{
"client_id": "client_8c41d2",
"body": "body"
} {
"client_id": "cl_3207",
"message_id": "msg_66021",
"sent_at": "2026-10-27T10:05:00-07:00",
"email_notification": true
} Balances by aging bucket and claims by status. A claim without Payment Reports stops at Accepted.
Reads the Outstanding balances and Client invoice aging reports under Analytics > Reports. Returns each client with a balance, split into Current, 1 to 30, 31 to 60 and 61+ days past due, largest first. Insurance balances are returned separately. Nothing is changed.
MCP callsimplepractice_read → list_outstanding_balances
REST endpointGET https://cotlet.dev/api/v1/simplepractice/outstanding-balances
| Name | Type | Description |
|---|---|---|
| clinician string | string | Clinician name as SimplePractice shows it. Default: every clinician you can see. |
| min_days_past_due integer | integer | 0, 1, 31 or 61. Default: 0. |
{
"clients": [
{
"client_id": "cl_3207",
"name": "Morgan Diaz",
"current": 0,
"days_1_30": 0,
"days_31_60": 0,
"days_61_plus": 300,
"total": 300
},
{
"client_id": "cl_3166",
"name": "Taylor Brooks",
"current": 0,
"days_1_30": 0,
"days_31_60": 120,
"days_61_plus": 0,
"total": 120
}
],
"currency": "USD"
} Returns the billing summary: client balance (invoiced minus paid), uninvoiced amount, unallocated payments and each unpaid invoice with its date and amount. A credit shows as a negative balance. Nothing is changed.
MCP callsimplepractice_read → get_client_billing
REST endpointGET https://cotlet.dev/api/v1/simplepractice/clients/{client_id}/billing
| Name | Type | Description |
|---|---|---|
| client_id string required | string | Client ID from find_client. |
{
"client_id": "client_8c41d2"
} {
"client_id": "cl_3207",
"name": "Morgan Diaz",
"client_balance": 300,
"uninvoiced": 0,
"unallocated_payments": 0,
"currency": "USD",
"unpaid_invoices": [
{
"invoice_id": "inv_1101",
"date": "2026-08-12",
"amount": 150,
"status": "Past Due"
},
{
"invoice_id": "inv_1134",
"date": "2026-08-19",
"amount": 150,
"status": "Past Due"
}
]
} Returns claims, newest first, with payer, client, date of service, amount and status as SimplePractice shows it: Prepared, Submitted, Received, Accepted, Rejected, Denied, Paid Pending, Paid and others. Without Payment Reports from a payer, a claim stops at Accepted. Nothing is changed.
MCP callsimplepractice_read → list_claims
REST endpointGET https://cotlet.dev/api/v1/simplepractice/claims
| Name | Type | Description |
|---|---|---|
| from date | date | Start of the range. Default: today. |
| to date | date | End of the range. Default: 7 days after from. |
| status string | string | One claim status, e.g. Denied or Rejected. Default: all. |
{
"claims": [
{
"claim_id": "clm_7712",
"payer": "Aetna",
"client": "Jordan Avery",
"date_of_service": "2026-10-07",
"amount": 150,
"status": "Denied"
},
{
"claim_id": "clm_7719",
"payer": "Cigna",
"client": "Taylor Brooks",
"date_of_service": "2026-10-09",
"amount": 150,
"status": "Rejected"
}
]
} Returns Claim Details: service lines, billed and paid amounts, status history and, for a denied claim, the Remarks from its Payment Report. A rejected claim carries the rejection message instead. Fixing a claim means a corrected claim in SimplePractice; no tool submits one. Nothing is changed.
MCP callsimplepractice_read → get_claim
REST endpointGET https://cotlet.dev/api/v1/simplepractice/claims/{claim_id}
| Name | Type | Description |
|---|---|---|
| claim_id string required | string | Claim ID from list_claims. |
{
"claim_id": "claim_8c41d2"
} {
"claim_id": "clm_7712",
"payer": "Aetna",
"client": "Jordan Avery",
"date_of_service": "2026-10-07",
"status": "Denied",
"billed": 150,
"paid": 0,
"remarks": [
"CO-16: Claim lacks information needed for adjudication"
],
"history": [
{
"status": "Submitted",
"date": "2026-10-08"
},
{
"status": "Accepted",
"date": "2026-10-09"
},
{
"status": "Denied",
"date": "2026-10-21"
}
]
} Your signed-in SimplePractice profile, AES-256-GCM encrypted, in Finland. Never the password.
The 13 SimplePractice tools, never the cookie.
Whatever your own login sees, so use a team login with only the access the agent needs.
Progress notes, treatment plans, diagnoses, payment cards and settings.
SimplePractice asks for a code at sign-in. You type it, we never do.
Disable for agents, reset the browser, or sign out in SimplePractice.
SimplePractice's BAA covers data inside SimplePractice. Cotlet signs no BAA and makes no HIPAA claim, so whether client data may pass through an AI agent is your practice's decision. Our site scores A+ on Qualys SSL Labs, securityheaders.com and Mozilla Observatory (live results). There is no SOC 2 report or third-party pentest yet.
"Launch an automated program or script, including, but not limited to, web spiders, web crawlers, web robots, web ants, web indexers, bots, viruses, Trojan horses, or worms, or any program which may make multiple server requests per second"
Cotlet works in your SimplePractice web app the way you do, one page at a time, but SimplePractice could still read it as a bot. The same terms bar using the service "for any other purpose intended to benefit a party other than You". We found no public case of a SimplePractice account closed for an AI agent or a script (checked 27 Oct 2026).
If losing your SimplePractice account would hurt more than the time saved, do this work by hand.
SimplePractice changes under you: two-factor became required for new customers on 1 Oct 2026, and the billing reports article was rewritten on 7 Oct 2026. When a page moves, the fix is ours and your prompts keep working. status.cotlet.dev checks the site, console and API every 3 minutes.
| Action | Undo |
|---|---|
| Accept a request | Cancel the appointment; the confirmation email is already out |
| Decline a request | None: a new client is archived and emailed |
| Set No show or Late canceled | Delete the invoice, then set Canceled; an AutoPay charge needs a refund |
| Share intake documents | None: the email and portal access are out |
| Send a Secure Message | None: the client gets an email at once |
6 of 13 tools ask first: every write, because each one emails a client or can charge one. The 7 reads run at once. Switch the wait off per tool for a scheduled run.
An insurance client marked No show or Late canceled owes the full fee, and setting Show again does not undo that. Ask the agent to list first and change statuses after you look.
{
"name": "accept_appointment_request",
"arguments": {
"request_id": "rq_8810",
"documents": [
"Intake packet"
],
"message": "Looking forward to meeting you on Thursday."
}
} curl -X POST https://cotlet.dev/api/v1/simplepractice/requests/rq_8810/appointment-request/accept \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"documents":["Intake packet"],"message":"Looking forward to meeting you on Thursday."}' {
"request_id": "rq_8810",
"status": "accepted",
"appointment_id": "ap_5040",
"client_id": "cl_3188",
"start": "2026-10-29T15:00:00-07:00",
"documents_shared": [
"Intake packet"
],
"email_sent": true
} Scripts, cron jobs and n8n steps reach the same tools over REST at /api/v1/simplepractice, with the same key and price. A login without billing access gets an error on the billing tools, and a failed call is free. The tools table lists each REST path.
About $14 a monthfor a solo clinician with 20 sessions a week, 2,460 credits. Your SimplePractice plan stays billed by SimplePractice.
| Job | Calls | Credits |
|---|---|---|
| Check the Requests page, daily | 1 × 30 | 300 |
| Accept a request and send intake | 2 × 8 | 160 |
| Review yesterday's sessions, workdays | 1 × 22 | 220 |
| Mark a no-show or late cancel | 1 × 4 | 40 |
| Denied and rejected claims, weekly | 3 × 4 | 120 |
| Overdue balances and reminders, weekly | 3 × 4 | 120 |
| Cloud Browser, 30 days | 1,500 | |
| Total | 2,460 |
SimplePractice's own rate guide works with 20 clients a week. The counts of requests and no-shows are our example. Dollars at the $29 pack rate.
| 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 |
|---|---|---|
| chrischall/simplepractice-mcp | Reads a client's own Client Portal: appointments, billing items, documents. MIT, last push 26 Oct 2026. | Client side only and read-only. Runs on your computer. |
| SimpleConnect | SimplePractice's scheduling API for health plans and EAPs. | Not open to practices. |
| Unified API vendors | Some sell a SimplePractice API built from the web app. | Aimed at software companies, not one practice. |
| Zapier, n8n, Make | No SimplePractice app on Zapier or n8n (checked 27 Oct 2026). | Workflows run on calendar sync and email alerts, not the account. |
| By hand | Requests, Share, Billing and Analytics > Reports in the web app. | Free and within the terms, but it is your evening. |
No free server works on the clinician account today. Cotlet is for a practice owner who wants requests, intake and claim follow-up handled from Claude or ChatGPT with each client-facing step approved. It works in your web login, so it carries the terms risk above.
Take Group sp. z o.o. runs Cotlet. It is a software company registered in Poland, EU (VAT PL6342984273), working since 2019, founded by Bart Krawczyk (Co-founder, CTO) and Jake Slugocki (Co-founder, SEO, sales and marketing). Questions about the SimplePractice tools go to contact@cotlet.dev.
Yes. Call Cotlet's REST API from a script or an HTTP step in n8n, Make or Zapier with your Cotlet key. MCP is the alternative for AI agents; you do not need to connect an agent to use REST.
Create a free account at https://cotlet.dev, open SimplePractice under Integrations in the console and sign in to SimplePractice in its Cloud Browser. The trial starts with your first app, no card asked.
No. No tool reads, exports or writes progress notes or other clinical documents. The tools cover the calendar, requests, intake sharing, billing, claims and Secure Messaging.
Yes. SimplePractice requires two-factor authentication for new customers since 1 Oct 2026 (help center, checked 27 Oct 2026). You enter the code yourself when you sign in to your Cloud Browser; Cotlet never bypasses it.
SimplePractice's BAA covers data inside SimplePractice. Sending client data to an AI agent or to Cotlet is a separate decision for your practice under HIPAA. Cotlet does not sign a BAA.
Yes. SimplePractice gives each team member their own login and two-factor setup. The agent sees what that login sees, so a login without billing access cannot read balances or claims.
No. get_claim returns the payer's remarks; the corrected claim is filed in SimplePractice by you.
Only the door is different. Both expose the same 13 tools, inputs and answers, with one API key and one price. Agents use MCP; scripts and HTTP steps use REST.
No. Cotlet is independent and not affiliated with SimplePractice, LLC.
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