SimplePractice API and MCP server Let your AI agent run your practice admin.

Read SimplePractice schedules and administrative records through MCP or REST. Connect your authorized account to an agent or private reporting workflow.

  • Free 7-day trial, no card
  • Unofficial, not affiliated with SimplePractice
SimplePractice logo SimplePractice Cloud Browser

13 tools Read and write

Requests to claims

What can you automate in SimplePractice? Use an AI agent, a workflow or a script.

  • Triage new appointment requests

  • Send intake before a first session

  • Book a client's next session

  • Mark no-shows and late cancels

  • Follow up on denied claims

  • Chase overdue client balances

No API for practices

Does SimplePractice have an MCP server or an API? No, not for practices.

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.

  • The help center says SimplePractice "doesn't currently offer a public-facing API for integrations with other software or platforms."
  • Its only API, launched in 2022 and now called SimpleConnect, lets health plans and EAPs request appointments with in-network clinicians. Practices cannot use it.
  • Zapier and n8n list no SimplePractice app, so automations today run on calendar sync, email alerts and report downloads.
SimpleConnect, a GitHub MCP server and Cotlet compared
What you need SimpleConnectGitHub MCP serverCotlet
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)

Set up once

How does Cotlet connect to SimplePractice? One account, two ways to connect.

  1. 1Sign in to SimplePractice

    Use your own account in its Cotlet Cloud Browser.

  2. 2Choose MCP or REST

    Connect your agent or create a Cotlet API key.

  3. 3Run your workflow

    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

Any MCP client

Connect SimplePractice to your agent or workflow

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.

  1. 1

    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.

  2. 2

    Add the server address. Enter https://cotlet.dev/mcp/v1 where your agent takes an MCP server or a custom connector.

  3. 3

    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.

Claude
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"
ChatGPT
Settings > Apps & Connectors > Create
MCP server URL: https://cotlet.dev/mcp/v1/connect
Authentication: OAuth
Cursor
// ~/.cursor/mcp.json
{
  "mcpServers": {
    "cotlet-simplepractice": {
      "url": "https://cotlet.dev/mcp/v1",
      "headers": { "Authorization": "Bearer ${env:COTLET_API_KEY}" }
    }
  }
}
Codex
# ~/.codex/config.toml
[mcp_servers.cotlet-simplepractice]
url = "https://cotlet.dev/mcp/v1"
bearer_token_env_var = "COTLET_API_KEY"
n8n
MCP Client Tool (inside an AI Agent)
Transport: HTTP Streamable
URL: https://cotlet.dev/mcp/v1
Auth: Bearer, <your key>
Tool: simplepractice_read
Make, Zapier
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
Scripts and HTTP

How to use the SimplePractice REST API

Create your Cotlet API key

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.

Make your first SimplePractice API request

REST
curl "https://cotlet.dev/api/v1/simplepractice/appointments?from=2026-10-28&to=2026-10-28" \
  -H "Authorization: Bearer $COTLET_API_KEY"

Read administrative schedule records

A successful REST call puts the tool output in result. This illustrative response excerpt omits call IDs, messages and credit details.

Illustrative response excerpt
{
  "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.

SimplePractice workflows for agents and automations

SimplePractice workflows you configure
ToolConnect throughExample workflow
n8nHTTP RequestRead appointment records into a permitted private administrative schedule without changing appointments.
MakeHTTP > Make a requestRead pending appointment requests into a staff review queue without accepting or rejecting requests.
Python or Node.jsREST APIRead 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.

7 read, 6 write

SimplePractice API endpoints and MCP tools

Calendar and requests6

Requests from Therapy Finder and the Optum portal expire after 72 hours. A status change can create an invoice and an AutoPay charge.

  • list_appointments Appointments on the calendar in a date range, with client, service and status. read

    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

    Parameters

    Parameters: list_appointments
    NameTypeDescription
    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.

    Example response

    {
      "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
        }
      ]
    }
  • list_appointment_requests Pending requests from the Requests page, with source and requested time. read

    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

    Parameters

    Parameters: list_appointment_requests
    NameTypeDescription
    source string string Therapy Finder, Client Portal, Professional Website or In-network referrals. Default: all.

    Example response

    {
      "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"
        }
      ]
    }
  • accept_appointment_request Accepts a pending request and sends the client the confirmation email. writeasks first

    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

    Parameters

    Parameters: accept_appointment_request
    NameTypeDescription
    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.

    Example input

    {
      "request_id": "rq_8810",
      "documents": [
        "Intake packet"
      ],
      "message": "Looking forward to meeting you on Thursday."
    }

    Example response

    {
      "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
    }
  • decline_appointment_request Declines a pending request with a reason and emails the client. writeasks first

    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

    Parameters

    Parameters: decline_appointment_request
    NameTypeDescription
    request_id string required string Request ID from list_appointment_requests.
    reason string required string Reason for declining, kept in SimplePractice.

    Example input

    {
      "request_id": "request_8c41d2",
      "reason": "reason"
    }

    Example response

    {
      "request_id": "rq_8815",
      "status": "declined",
      "email_sent": true,
      "client_archived": true
    }
  • create_appointment Books an appointment for an existing client on the calendar. writeasks first

    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

    Parameters

    Parameters: create_appointment
    NameTypeDescription
    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.

    Example input

    {
      "client_id": "client_8c41d2",
      "start": "2026-10-01T09:00:00Z"
    }

    Example response

    {
      "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"
    }
  • set_appointment_status Sets Show, No show, Canceled, Late canceled or Clinician canceled. writeasks first

    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

    Parameters

    Parameters: set_appointment_status
    NameTypeDescription
    appointment_id string required string Appointment ID from list_appointments.
    status string required string Show, No show, Canceled, Late canceled or Clinician canceled.

    Example input

    {
      "appointment_id": "appointment_8c41d2",
      "status": "status"
    }

    Example response

    {
      "appointment_id": "ap_4987",
      "status": "No show",
      "invoice_created": true,
      "invoice_amount": 150
    }

Clients and the Client Portal3

Intake goes from your shareable documents. A Secure Message reaches one client and holds up to 5,000 characters.

  • find_client Clients and contacts by name, email or phone, with status and portal access. read

    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

    Parameters

    Parameters: find_client
    NameTypeDescription
    query string required string Name, email or phone number.

    Example input

    {
      "query": "query"
    }

    Example response

    {
      "clients": [
        {
          "client_id": "cl_3104",
          "name": "Jordan Avery",
          "status": "Active",
          "clinician": "Dr. Sam Lee",
          "billing_type": "Insurance",
          "client_portal": true,
          "secure_messaging": true
        }
      ]
    }
  • share_intake_documents Shares intake forms through the Client Portal and emails the client. writeasks first

    Shares the named documents from Settings > Documentation > Shareable documents. The client gets an email with a Client Portal link, and gets portal access if they had none. An incomplete intake cannot be sent again. By default you confirm each call; you can switch that off for this tool.

    MCP callsimplepractice_write → share_intake_documents

    REST endpointPOST https://cotlet.dev/api/v1/simplepractice/clients/{client_id}/intake-documents/share

    Parameters

    Parameters: share_intake_documents
    NameTypeDescription
    client_id string required string Client ID from find_client.
    documents string[] required string[] Names of shareable documents.

    Example input

    {
      "client_id": "client_8c41d2",
      "documents": [
        "documents"
      ]
    }

    Example response

    {
      "client_id": "cl_3188",
      "shared": [
        "Intake packet",
        "Informed consent"
      ],
      "email_sent": true,
      "portal_access_granted": true
    }
  • send_secure_message Sends a Secure Message to one client through the Client Portal. writeasks first

    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

    Parameters

    Parameters: send_secure_message
    NameTypeDescription
    client_id string required string Client ID from find_client.
    body string required string Message text, up to 5,000 characters.

    Example input

    {
      "client_id": "client_8c41d2",
      "body": "body"
    }

    Example response

    {
      "client_id": "cl_3207",
      "message_id": "msg_66021",
      "sent_at": "2026-10-27T10:05:00-07:00",
      "email_notification": true
    }

Billing and insurance claims4

Balances by aging bucket and claims by status. A claim without Payment Reports stops at Accepted.

  • list_outstanding_balances Clients who owe money, grouped by age as the client invoice aging report shows. read

    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

    Parameters

    Parameters: list_outstanding_balances
    NameTypeDescription
    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.

    Example response

    {
      "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"
    }
  • get_client_billing A client's balance and unpaid invoices from their Billing page. read

    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

    Parameters

    Parameters: get_client_billing
    NameTypeDescription
    client_id string required string Client ID from find_client.

    Example input

    {
      "client_id": "client_8c41d2"
    }

    Example response

    {
      "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"
        }
      ]
    }
  • list_claims Insurance claims with payer, date of service and claim status. read

    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

    Parameters

    Parameters: list_claims
    NameTypeDescription
    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.

    Example response

    {
      "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"
        }
      ]
    }
  • get_claim One claim's details, status history and the payer's remarks. read

    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}

    Parameters

    Parameters: get_claim
    NameTypeDescription
    claim_id string required string Claim ID from list_claims.

    Example input

    {
      "claim_id": "claim_8c41d2"
    }

    Example response

    {
      "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"
        }
      ]
    }
Encrypted, revocable

Who can see my SimplePractice session, and how do I revoke it?

  • What we store

    Your signed-in SimplePractice profile, AES-256-GCM encrypted, in Finland. Never the password.

  • What your agent gets

    The 13 SimplePractice tools, never the cookie.

  • What the session sees

    Whatever your own login sees, so use a team login with only the access the agent needs.

  • What no tool touches

    Progress notes, treatment plans, diagnoses, payment cards and settings.

  • Two-factor codes

    SimplePractice asks for a code at sign-in. You type it, we never do.

  • How to cut access

    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.

Account risk

Is it against SimplePractice's terms? Account safety Their terms ban bots and scripts.

"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"
SimplePractice Terms of Service, last updated 2 Aug 2023

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).

How we keep your account looking like you

  • Your own SimplePractice login, signed in by you with your code
  • One Cloud Browser with its own IP and cookies, so SimplePractice can remember the device for 30 days
  • No tool opens progress notes or clinical documents
  • Every message, share, booking and status change waits for your OK
  • If SimplePractice objects, we pause the SimplePractice tools for everyone within 24 h

If losing your SimplePractice account would hurt more than the time saved, do this work by hand.

Tested every 12 h

What happens when SimplePractice changes? We repair the tool; your prompts stay the same.

between tests of the SimplePractice reads
12 h
for a call to a SimplePractice tool paused for repair
$0

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.

6 tools ask first

Approvals, undo and mistakes Clients hear nothing until you approve.

  1. 01 Reads the request Time, service, source, and whether the person is a new client.
  2. 02 Checks your calendar The requested slot against what is already booked.
  3. 03 Waits for your OK Accept and the intake packet show up in your Cotlet console first.
  4. 04 Reports back Appointment ID, start time, documents shared and email sent.
Which SimplePractice actions can be undone
ActionUndo
Accept a requestCancel the appointment; the confirmation email is already out
Decline a requestNone: a new client is archived and emailed
Set No show or Late canceledDelete the invoice, then set Canceled; an AutoPay charge needs a refund
Share intake documentsNone: the email and portal access are out
Send a Secure MessageNone: 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.

MCP call
{
  "name": "accept_appointment_request",
  "arguments": {
    "request_id": "rq_8810",
    "documents": [
      "Intake packet"
    ],
    "message": "Looking forward to meeting you on Thursday."
  }
}
REST
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."}'
Tool output
{
  "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.

Pay per call

How much does the SimplePractice MCP server cost?

About $14 a monthfor a solo clinician with 20 sessions a week, 2,460 credits. Your SimplePractice plan stays billed by SimplePractice.

A month of SimplePractice admin for one clinician, in credits
JobCallsCredits
Check the Requests page, daily1 × 30300
Accept a request and send intake2 × 8160
Review yesterday's sessions, workdays1 × 22220
Mark a no-show or late cancel1 × 440
Denied and rejected claims, weekly3 × 4120
Overdue balances and reminders, weekly3 × 4120
Cloud Browser, 30 days1,500
Total2,460
  • Free 7-day trial, no card
  • 10 credits per successful call, MCP or REST
  • 50 credits a day for the Cloud Browser
  • Works on Starter, Essential and Plus

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.

Cotlet credit packs: price, credits and calls at 10 credits each
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.

Other options

SimplePractice MCP server on GitHub, hosted or by hand: which to use Nothing open covers the clinician side.

Other SimplePractice options, checked 27 Oct 2026
OptionWhat it doesWhere it stops
chrischall/simplepractice-mcpReads 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.
SimpleConnectSimplePractice's scheduling API for health plans and EAPs.Not open to practices.
Unified API vendorsSome sell a SimplePractice API built from the web app.Aimed at software companies, not one practice.
Zapier, n8n, MakeNo SimplePractice app on Zapier or n8n (checked 27 Oct 2026).Workflows run on calendar sync and email alerts, not the account.
By handRequests, 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.

EU company, since 2019

Who runs Cotlet A company you can look up.

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.

SimplePractice API and MCP: questions

Can I use the SimplePractice API without an AI agent?

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.

How do I get access?

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.

Can the agent read progress notes?

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.

Does SimplePractice two-factor authentication still work?

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.

Is client data covered by my SimplePractice BAA?

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.

Can a team member's login be used?

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.

Can the agent fix and resubmit a denied claim?

No. get_claim returns the payer's remarks; the corrected claim is filed in SimplePractice by you.

Is the MCP server different from the REST API?

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.

Is Cotlet affiliated with SimplePractice?

No. Cotlet is independent and not affiliated with SimplePractice, LLC.

Give your agent the SimplePractice admin.

Free 7-day trial with 2,000 credits, no card needed.