# Meevo API and MCP server

> Meevo has a Public API, but only after you send the request form with your Meevo Tenant ID and Millennium Systems reaches out with credentials (checked 11 Oct 2026). It can create, update and delete appointments and client profiles, but memberships, packages and gift cards are read-only, there is no Register checkout and no reports.

Cloud business software for salons, spas and med spas by Millennium Systems International: Appointment Book, Online Booking, Wait List, Register, memberships, packages and 150+ reports.

## What is the Meevo API?

Cotlet's Meevo API exposes 14 endpoints for your own Meevo account: list locations, list services, list staff, list appointments, find open slots, find client, get client, list packages, get Register Summary, add visit note, book appointment, reschedule appointment, cancel appointment and sell package. The list_locations endpoint returns locations your login can reach, with address and time zone. Each endpoint takes simple JSON inputs like location_id, staff_id or client_id and works both as an MCP tool for agents and as a REST call for scripts.

- **Category:** [Local services & SaaS](https://cotlet.dev/integrations/category/local-services-saas)
- **Endpoints:** 14 (9 read, 5 write)
- **Updated:** 2026-10-11

Meevo has a Public API, but only after you send the request form with your Meevo Tenant ID and Millennium Systems reaches out with credentials (checked 11 Oct 2026). Cotlet is a hosted MCP server and REST API for Meevo with 14 endpoints (9 read, 5 write): your AI agent signs in as you and does the work.

## Does Meevo have an official API?

Meevo has a Public API, but only after you send the request form with your Meevo Tenant ID and Millennium Systems reaches out with credentials (checked 11 Oct 2026). It can create, update and delete appointments and client profiles, but memberships, packages and gift cards are read-only, there is no Register checkout and no reports.

| Task | Meevo official | Cotlet |
|---|---|---|
| List a day's appointments | Partly: Appointments are retrievable; the Daily Data Stream add-on sends changes from the last 7 days | Yes |
| Find open slots for a service | Partly: Not on the capability list of the developer tools page | Yes |
| Book an appointment | Yes: After API access is granted | Yes |
| Reschedule or cancel an appointment | Yes: Update and delete, after API access is granted | Yes |
| Find a client and read their profile | Yes: After API access is granted | Yes |
| See a client's memberships, packages and gift cards | Yes: Read-only (client liabilities) | Yes |
| Sell a package in the Register | No | Yes |
| Pull the Register Summary for a day | Partly: Raw sale changes via the Daily Data Stream, no reports | Yes |

Sources: [Meevo API Developer Tools and access request](https://www.meevo.com/developer-tools), [Meevo Public API documentation](https://docs.meevoapi.com/), [Meevo Help: Online Booking setup overview](https://docs.meevo.com/multi-location/OB/OB_Setup_Overview.htm), [Meevo Help: 2-Way SMS getting started](https://docs.meevo.com/multi-location/Integration/2-WaySMS/2WaySMS.htm)

## For AI agents

```text
Meevo has a Public API, but only after you send the request form with your Meevo Tenant ID and Millennium Systems reaches out with credentials (checked 11 Oct 2026). It can create, update and delete appointments and client profiles, but memberships, packages and gift cards are read-only, there is no Register checkout and no reports.
Cotlet provides a hosted MCP server and REST API for Meevo: 14 tools (9 read, 5 write).
Access       Request access at https://cotlet.dev/app/signup?app=meevo; we email the API key.

MCP server   https://cotlet.dev/mcp/v1
REST base    https://cotlet.dev/api/v1/meevo
Auth         Authorization: Bearer <COTLET_API_KEY>. Listing endpoints and schemas needs no key; calling an endpoint needs one.
Tools        list_locations, list_services, list_staff, list_appointments, find_open_slots, find_client, get_client, list_packages, get_register_summary, add_visit_note, book_appointment, reschedule_appointment, cancel_appointment, sell_package
Confirm      add_visit_note, book_appointment, reschedule_appointment, cancel_appointment, sell_package (by default the user approves each call; the user can switch this off per tool, e.g. for scheduled automations)
Markdown     https://cotlet.dev/integrations/meevo-api-mcp-server.md

How access works:
1. The user requests access at https://cotlet.dev/app/signup?app=meevo (Meevo is pre-selected). Each request is reviewed and the API key is sent by email.
2. The user signs in to Meevo once in a browser. An agent cannot do this step.
3. The API key goes into the MCP client or the REST call as a bearer token.

Fits: people who want a hosted Meevo server that someone else maintains, including non-developers.

Policy: Cotlet never stores passwords, never solves CAPTCHAs, never bypasses MFA.
Company: legal details in the Terms of service at https://cotlet.dev/terms. Contact contact@cotlet.dev.
Session: the user signs in to Meevo in a browser; Cotlet keeps only the session, AES-256 encrypted, revocable in the dashboard at any time.
Terms: the user stays responsible for following Meevo's terms; Cotlet is not affiliated with Meevo.
```

## What can an AI agent do in Meevo?

Cotlet is best for salon and spa owners and managers who want an AI agent to handle bookings, schedule changes, package sales and daily Register totals in Meevo without running or fixing a server.

- **Daily appointment schedule for each stylist** (runs: daily): "What does tomorrow look like for Alex? Flag any gap longer than an hour." → `list_staff`, `list_appointments`
- **[Book appointment requests from texts and emails](https://cotlet.dev/integrations/meevo-api-mcp-server/book-appointments-with-ai)**: "Jamie Doe texted last night asking for a balayage with toner on Saturday or Sunday, before noon, with anyone but Chris. Find her in Meevo, check what fits and book it, or give me two options to send back." → `find_client`, `get_client`, `list_services`, `find_open_slots`, `book_appointment`
- **[Move appointments when a stylist is out](https://cotlet.dev/integrations/meevo-api-mcp-server/reschedule-appointments-when-staff-is-out)**: "Alex called in sick for today and tomorrow. Move each of her clients to another stylist who does the same services at the same time, or the closest time that day, and show me the plan before you move anyone." → `list_staff`, `list_appointments`, `find_open_slots`, `reschedule_appointment`
- **Sell a package at the Register**: "Sell Jamie the 5 blowout package, paid in cash at the front desk." → `find_client`, `list_packages`, `sell_package`
- **[Register Summary for every location](https://cotlet.dev/integrations/meevo-api-mcp-server/daily-register-summary)** (runs: daily): "Every night at 9, send me the Register Summary for both salons in one message, with each location against the same weekday last week, and flag anything that does not add up." → `list_locations`, `get_register_summary`

## Can Meevo automations run on a schedule in n8n, Make or Zapier?

Yes. Cotlet does not replace your automation platform: it gives it a Meevo connection it does not have, with the same API key as your agent. Write actions ask for your OK by default; switch that off in your dashboard for the tools you choose, for example to daily appointment schedule for each stylist, and the schedule runs on its own. Cotlet runs in the cloud, so it keeps going while your computer is off.

| Where | How to connect | How to schedule |
|---|---|---|
| Your AI agent | Add https://cotlet.dev/mcp/v1 with your API key. | A scheduled agent run, for example a Claude Code routine. |
| n8n | MCP Client node with https://cotlet.dev/mcp/v1, or an HTTP Request node to https://cotlet.dev/api/v1/meevo/{tool}. | Schedule Trigger node. |
| Make | HTTP module: POST https://cotlet.dev/api/v1/meevo/{tool} with an Authorization: Bearer header and a JSON body. | Scenario schedule. |
| Zapier | Webhooks by Zapier: POST https://cotlet.dev/api/v1/meevo/{tool} with the same header and body. | Schedule by Zapier trigger. |
| Your own script | POST https://cotlet.dev/api/v1/meevo/{tool} with your API key. | cron or GitHub Actions. |

## Tools

**For AI agents:** Every endpoint and its schema is public. The 14 endpoints on this page, with parameters and example responses, can be listed without an account. Calling one returns 403 until the account has an API key with access to Meevo.

### list_locations

Locations your login can reach, with address and time zone. Access: read. REST: `POST /api/v1/meevo/list_locations`.

No parameters.

Returns every Meevo location your staff login can reach. Use location_id from each item as the location_id parameter of the other tools. Time zone is the one set on the location.

Example response:

```json
{
  "locations": [
    {
      "location_id": "201",
      "name": "Maple Street Salon",
      "address": "12 Maple St, Hoboken, NJ",
      "time_zone": "America/New_York"
    },
    {
      "location_id": "202",
      "name": "Harbor Spa",
      "address": "88 Harbor Rd, Jersey City, NJ",
      "time_zone": "America/New_York"
    }
  ]
}
```

### list_services

Service menu of a location by category, with duration, price and add-ons. Access: read. REST: `POST /api/v1/meevo/list_services`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `location_id` | string | no | Location ID from list_locations. Default: the location you signed in to. |
| `category` | string | no | Only this service category. |

Lists the service menu of one location grouped by category. Each service has its duration, price and add-ons. Use service_id with find_open_slots and book_appointment.

Example response:

```json
{
  "categories": [
    {
      "category": "Color",
      "services": [
        {
          "service_id": "9a8b7c6d-1e2f-4a3b-8c4d-5e6f7a8b9c0d",
          "name": "Balayage",
          "duration_minutes": 150,
          "price": 220,
          "add_ons": [
            "Toner"
          ]
        }
      ]
    }
  ]
}
```

### list_staff

Employees of a location with title and the services each one performs. Access: read. REST: `POST /api/v1/meevo/list_staff`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `location_id` | string | no | Location ID from list_locations. Default: the location you signed in to. |

Lists the employees of one location with their title and the services each performs. Use staff_id to narrow list_appointments and find_open_slots, or to book with a specific employee.

Example response:

```json
{
  "staff": [
    {
      "staff_id": "e1d2c3b4-a5f6-4e7d-9c8b-7a6f5e4d3c2b",
      "name": "Alex Rivera",
      "title": "Senior Stylist",
      "services": [
        "Balayage",
        "Haircut"
      ]
    },
    {
      "staff_id": "a7b8c9d0-e1f2-4a3b-8c4d-9e0f1a2b3c4d",
      "name": "Sam Patel",
      "title": "Stylist",
      "services": [
        "Balayage",
        "Blowout"
      ]
    }
  ]
}
```

### list_appointments

Appointments in the Appointment Book for a date range, with client, services, employee and confirmation status. Access: read. REST: `POST /api/v1/meevo/list_appointments`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `location_id` | string | no | Location ID from list_locations. Default: the location you signed in to. |
| `from` | date | yes | First day, inclusive. |
| `to` | date | no | Last day, inclusive. Default: same as from. |
| `staff_id` | string | no | Only this employee. |
| `include_canceled` | boolean | no | Also return canceled appointments. Default: false. |

Returns appointments from the Appointment Book for one location, oldest start first. Canceled appointments are left out unless include_canceled is true. Confirmation status is the one Meevo shows on the appointment. Use appointment_id with reschedule_appointment and cancel_appointment.

Example response:

```json
{
  "appointments": [
    {
      "appointment_id": "4b5c6d7e-8f90-4a1b-b2c3-d4e5f6a7b8c9",
      "start": "2026-10-12T09:00:00-04:00",
      "end": "2026-10-12T11:30:00-04:00",
      "client": {
        "id": "c3f1a2b4-5d6e-4f70-8a91-0b2c3d4e5f60",
        "name": "Jamie Doe"
      },
      "services": [
        "Balayage"
      ],
      "staff": "Alex Rivera",
      "confirmation_status": "confirmed"
    },
    {
      "appointment_id": "7c8d9e0f-1a2b-4c3d-8e4f-5a6b7c8d9e0f",
      "start": "2026-10-12T14:00:00-04:00",
      "end": "2026-10-12T14:45:00-04:00",
      "client": {
        "id": "d4e5f6a7-b8c9-4d0e-9f1a-2b3c4d5e6f7a",
        "name": "Sam Lee"
      },
      "services": [
        "Haircut"
      ],
      "staff": "Alex Rivera",
      "confirmation_status": "unconfirmed"
    }
  ]
}
```

### find_open_slots

Open times for a service in a date range, with the employees who can perform it. Access: read. REST: `POST /api/v1/meevo/find_open_slots`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `location_id` | string | no | Location ID from list_locations. Default: the location you signed in to. |
| `service_id` | string | yes | Service ID from list_services. |
| `from` | date | yes | First day to search. |
| `to` | date | yes | Last day to search. |
| `staff_id` | string | no | Only this employee. Default: anyone who performs the service. |

Returns open start times for one service in a date range, earliest first, each with the employees free at that time. Without staff_id it searches every employee who performs the service. Use a start and staff_id from the result with book_appointment.

Example response:

```json
{
  "slots": [
    {
      "start": "2026-10-17T10:00:00-04:00",
      "staff": [
        {
          "staff_id": "e1d2c3b4-a5f6-4e7d-9c8b-7a6f5e4d3c2b",
          "name": "Alex Rivera"
        }
      ]
    },
    {
      "start": "2026-10-17T11:30:00-04:00",
      "staff": [
        {
          "staff_id": "a7b8c9d0-e1f2-4a3b-8c4d-9e0f1a2b3c4d",
          "name": "Sam Patel"
        }
      ]
    }
  ]
}
```

### find_client

Search clients by name, email or phone; returns contact details and client type. Access: read. REST: `POST /api/v1/meevo/find_client`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `query` | string | yes | Name, email or phone number. |

Searches client profiles by name, email or phone and returns the matches with contact details and client type. Use client_id with get_client, book_appointment and sell_package. If several clients match, your agent should ask which one before it books.

Example response:

```json
{
  "clients": [
    {
      "client_id": "c3f1a2b4-5d6e-4f70-8a91-0b2c3d4e5f60",
      "name": "Jamie Doe",
      "email": "client@example.com",
      "phone": "+15555550123",
      "client_type": "Regular"
    }
  ]
}
```

### get_client

Client profile with upcoming appointments, visit notes, memberships, packages, gift cards and points. Access: read. REST: `POST /api/v1/meevo/get_client`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `client_id` | string | yes | Client ID from find_client. |

Returns one client profile with upcoming appointments, visit notes, memberships, packages, gift cards and points. Use it before booking or selling, so your agent sees what the client already owns.

Example response:

```json
{
  "client_id": "c3f1a2b4-5d6e-4f70-8a91-0b2c3d4e5f60",
  "name": "Jamie Doe",
  "upcoming_appointments": [
    {
      "appointment_id": "4b5c6d7e-8f90-4a1b-b2c3-d4e5f6a7b8c9",
      "start": "2026-10-12T09:00:00-04:00",
      "services": [
        "Balayage"
      ]
    }
  ],
  "visit_notes": [
    {
      "note_type": "Color formula",
      "text": "Formula 7N plus 20 vol.",
      "created_at": "2026-09-14T16:20:00-04:00"
    }
  ],
  "packages": [
    {
      "name": "5 Blowouts",
      "visits_left": 2
    }
  ],
  "memberships": [],
  "gift_cards": [],
  "points": 120
}
```

### list_packages

Package and membership definitions of a location with price and included services. Access: read. REST: `POST /api/v1/meevo/list_packages`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `location_id` | string | no | Location ID from list_locations. Default: the location you signed in to. |
| `kind` | enum | no | packages, memberships or all. Default: all. |

Lists the packages and memberships you sell at one location, with price and included services. kind narrows the list. Use package_id with sell_package.

Example response:

```json
{
  "packages": [
    {
      "package_id": "5f6a7b8c-9d0e-4f1a-8b2c-3d4e5f6a7b8c",
      "kind": "package",
      "name": "5 Blowouts",
      "price": 200,
      "includes": [
        "Blowout x5"
      ]
    }
  ]
}
```

### get_register_summary

The end-of-day Register Summary: sales by type, payment methods, membership sales, returns and deposits. Access: read. REST: `POST /api/v1/meevo/get_register_summary`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `location_id` | string | no | Location ID from list_locations. Default: the location you signed in to. |
| `date` | date | yes | Business day to read. |

Returns the Register Summary of one location for one business day: sales by type, payments by method, membership sales, returns and deposits. Sales by type add up to total_sales, and payments add up to the same total. Reads one location per call.

Example response:

```json
{
  "location_id": "201",
  "date": "2026-10-10",
  "currency": "USD",
  "sales_by_type": {
    "services": 2840,
    "products": 410,
    "packages": 600
  },
  "total_sales": 3850,
  "payments": {
    "card": 3120.5,
    "cash": 500,
    "gift_card": 229.5
  },
  "membership_sales": 0,
  "returns": 0,
  "deposits": 150
}
```

### add_visit_note

Add an internal visit note to a client profile. Access: write, asks the user first. REST: `POST /api/v1/meevo/add_visit_note`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `client_id` | string | yes | Client ID from find_client. |
| `text` | string | yes | Note text. |
| `note_type` | string | no | Visit note type as set up at your location. |

Adds an internal visit note to a client profile, for example a color formula. The note is visible to staff, not to the client. note_type must be one set up at your location. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "note_id": "n_20311",
  "client_id": "c3f1a2b4-5d6e-4f70-8a91-0b2c3d4e5f60",
  "note_type": "Color formula",
  "status": "saved"
}
```

### book_appointment

Book one or more services for a client with an employee; Meevo sends your usual confirmation. Access: write, asks the user first. REST: `POST /api/v1/meevo/book_appointment`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `client_id` | string | yes | Client ID from find_client. |
| `location_id` | string | no | Location ID from list_locations. Default: the location you signed in to. |
| `service_ids` | string[] | yes | Service IDs from list_services, in order. |
| `staff_id` | string | yes | Employee performing the services. |
| `start` | datetime | yes | ISO 8601 with time zone. |
| `note` | string | no | Appointment note. |

Books one or more services in order for a client with one employee, starting at the time you give. Meevo sends your usual confirmation to the client. The call fails if the time is no longer free. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "appointment_id": "4b5c6d7e-8f90-4a1b-b2c3-d4e5f6a7b8c9",
  "status": "booked",
  "client": {
    "id": "c3f1a2b4-5d6e-4f70-8a91-0b2c3d4e5f60",
    "name": "Jamie Doe",
    "email": "client@example.com"
  },
  "services": [
    {
      "id": "9a8b7c6d-1e2f-4a3b-8c4d-5e6f7a8b9c0d",
      "name": "Balayage",
      "duration_minutes": 150,
      "staff": "Alex Rivera"
    }
  ],
  "start": "2026-10-17T10:00:00-04:00",
  "end": "2026-10-17T12:30:00-04:00",
  "confirmation_status": "unconfirmed"
}
```

### reschedule_appointment

Move an appointment to a new time or employee. Access: write, asks the user first. REST: `POST /api/v1/meevo/reschedule_appointment`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `appointment_id` | string | yes | Appointment ID from list_appointments. |
| `start` | datetime | yes | New start, ISO 8601 with time zone. |
| `staff_id` | string | no | New employee. Default: unchanged. |

Moves one appointment to a new start time, a new employee, or both. The services stay the same. Meevo sends your usual confirmation for the changed appointment. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "appointment_id": "4b5c6d7e-8f90-4a1b-b2c3-d4e5f6a7b8c9",
  "status": "rescheduled",
  "start": "2026-10-17T10:00:00-04:00",
  "end": "2026-10-17T12:30:00-04:00",
  "staff": "Sam Patel"
}
```

### cancel_appointment

Cancel an appointment with one of your cancellation reasons. Access: write, asks the user first. REST: `POST /api/v1/meevo/cancel_appointment`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `appointment_id` | string | yes | Appointment ID from list_appointments. |
| `reason` | string | yes | Cancellation reason as set up at your location. |

Cancels one appointment and records the reason you give. reason must be one set up at your location. Canceling affects the client's booking, so confirm it. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "appointment_id": "7c8d9e0f-1a2b-4c3d-8e4f-5a6b7c8d9e0f",
  "status": "canceled",
  "reason": "Client request"
}
```

### sell_package

Ring up a package for a client in the Register and record the payment. Access: write, asks the user first. REST: `POST /api/v1/meevo/sell_package`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `client_id` | string | yes | Client ID from find_client. |
| `location_id` | string | no | Location ID from list_locations. Default: the location you signed in to. |
| `package_id` | string | yes | Package ID from list_packages. |
| `payment_type` | string | yes | Payment type as named in your Register, e.g. Cash or Visa. |

Rings up one package for a client in the Register and records the payment. payment_type must match a payment type named in your Register. It moves money, so confirm it. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "sale_id": "s_88421",
  "status": "paid",
  "client_id": "c3f1a2b4-5d6e-4f70-8a91-0b2c3d4e5f60",
  "package": "5 Blowouts",
  "amount": 200,
  "payment_type": "Cash"
}
```

## How do I connect Meevo to Claude Code, Codex or Cursor?

Connecting Meevo takes three steps: request access, sign in to Meevo once, then add one MCP server or call the REST API with the same key.

### Connect Meevo to your agent.

1. **Create an account** Sign up and add Meevo in the console. Your API key is there too.

2. **Sign in to Meevo once** Open the connect page from the console and sign in to Meevo the way you always do. We keep the session, never your password, and you can revoke it anytime.

3. **Add Cotlet to your agent** Paste the snippet for your client. The same server and key serve every app you connect, so you do this once.

   Claude Code:

```
claude mcp add --transport http cotlet \
  https://cotlet.dev/mcp/v1 \
  --header "Authorization: Bearer $COTLET_API_KEY"
```

   Cursor:

```
{
  "mcpServers": {
    "cotlet": {
      "url": "https://cotlet.dev/mcp/v1",
      "headers": {
        "Authorization": "Bearer ${COTLET_API_KEY}"
      }
    }
  }
}
```

   Codex:

```
# ~/.codex/config.toml
[mcp_servers.cotlet]
url = "https://cotlet.dev/mcp/v1"
bearer_token_env_var = "COTLET_API_KEY"
```

4. **Ask your agent** Ask in plain words. Your agent finds the Meevo tools on the server and calls them for you; anything that reaches other people waits for your OK unless you switch that off for a tool.

```
What does tomorrow look like for Alex? Flag any gap longer than an hour.
```

### Call Meevo from your scripts.

1. **Export your API key** Your scripts use the same API key as your agent. Keep it in an environment variable, never in your code.

```
export COTLET_API_KEY="cotlet_..."
```

2. **Call a tool** Every tool is a POST endpoint at /api/v1/meevo/{tool}. Send its parameters as JSON, exactly as listed in the endpoints above.

```
curl https://cotlet.dev/api/v1/meevo/book_appointment \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"client_id":"c3f1a2b4-5d6e-4f70-8a91-0b2c3d4e5f60","location_id":"201","service_ids":["9a8b7c6d-1e2f-4a3b-8c4d-5e6f7a8b9c0d"],"staff_id":"e1d2c3b4-a5f6-4e7d-9c8b-7a6f5e4d3c2b","start":"2026-10-17T10:00:00-04:00"}'
```

3. **Read the result** You get plain JSON back, ready for your script. A failed call costs nothing.

```
{
  "appointment_id": "4b5c6d7e-8f90-4a1b-b2c3-d4e5f6a7b8c9",
  "status": "booked",
  "client": {
    "id": "c3f1a2b4-5d6e-4f70-8a91-0b2c3d4e5f60",
    "name": "Jamie Doe",
    "email": "client@example.com"
  },
  "services": [
    {
      "id": "9a8b7c6d-1e2f-4a3b-8c4d-5e6f7a8b9c0d",
      "name": "Balayage",
      "duration_minutes": 150,
      "staff": "Alex Rivera"
    }
  ],
  "start": "2026-10-17T10:00:00-04:00",
  "end": "2026-10-17T12:30:00-04:00",
  "confirmation_status": "unconfirmed"
}
```

## Why use Cotlet for Meevo?

**Built for agents**

- One MCP server for every app you connect.
- The same tools as a REST API for scripts and cron jobs.
- Works with Claude Code, Codex and Cursor.

**Your login stays yours**

- You sign in to Meevo yourself. We keep only the session, encrypted with AES-256.
- The model never sees a login.
- No stored passwords, no CAPTCHA solving, no MFA bypass.

**You stay in control**

- Pick read only, or read and write.
- Anything that reaches other people waits for your OK, unless you switch it off per tool.
- Revoke access in one click.

**Kept working for you**

- We test every integration daily.
- When Meevo changes, the tool pauses until we fix it.
- Failed calls cost nothing.

## Is there a Meevo MCP server on GitHub?

No maintained community MCP server exists for Meevo; the alternative is requesting Meevo Public API access and building your own integration on it.

|  | Meevo Public API | Cotlet |
|---|---|---|
| Setup | Send the request form with your Tenant ID, wait for Millennium to reach out, then build against the docs | Request access, sign in to Meevo once in your browser |
| What it covers | Appointments and client profiles; memberships, packages and gift cards read-only | Calendar, clients, Register package sales and the Register Summary |
| Your Meevo session | App credentials you keep in your own code | Encrypted in an EU vault, limited to the actions you allow, revoked in one click |
| When the session expires | You renew credentials in your code | We keep it alive; if Meevo logs you out, your agent gets a link to sign in again |
| When Meevo changes | You update your code | Our team tests it daily and fixes it for you; failed calls are free |
| Where it runs | Your own server and code | Hosted: Claude Code, Codex, Cursor, n8n and scripts, also on a schedule |
| Price | Terms set by Millennium; overage charges above 1,000 calls a day per location | Free 7-day trial with 5,000 credits, then credits per call |

### Which one fits you

**Pick Cotlet if**

- you are not a developer, or you do not want to maintain a server
- you need it to keep working when Meevo changes, without checking it yourself
- your agent or a script should run it on a schedule, also while your computer is off

**Pick an open-source server if**

- you are comfortable installing, updating and fixing it yourself
- you want the session to stay on your own computer
- you only need it now and then, from one MCP client

## How much does the Meevo API cost?

Free 7-day trial with 5,000 credits, no card needed. After that, the Meevo API comes with the Cotlet plan, from $29 a month for 3,000 credits, with no limit on apps. Each month's credits stay valid for 3 months, so unused credits add up.

| Size | Price | Credits / month | Per credit |
|---|---|---|---|
| Solo | $29/mo | 3,000 | about $0.0097 |
| Pro | $99/mo | 12,000 | about $0.0083 |
| Agency | $299/mo | 40,000 | $0.0075 |

Each successful call uses credits for the work it takes; failed calls and timeouts cost nothing. A hard spend cap is on by default. Authenticate with the `Authorization: Bearer` header. [See full pricing](https://cotlet.dev/pricing)

## How Cotlet holds your access

Cotlet hosts MCP servers and REST APIs for apps with no usable API. Your agent works in your own Meevo account.

- **Company details:** The legal name, address and registration numbers of the company behind Cotlet are in the Terms of service. [Terms](https://cotlet.dev/terms)
- **Your session:** You sign in to Meevo yourself, in your browser. We keep only the session, never your password: encrypted with AES-256 in an EU vault, isolated to your account and used only when your agent calls a Meevo tool you allowed. When it expires, your agent gives you a link to sign in again. [Security](https://cotlet.dev/security)
- **Revoking access:** Disconnect Meevo in your dashboard: the session is deleted and access ends at once. Actions that reach other people wait for your OK unless you switch that off per tool.
- **What we never do:** Store passwords, solve CAPTCHAs or bypass MFA.
- **Meevo's terms:** You use your own Meevo account and stay responsible for following Meevo's terms. Cotlet is independent and not affiliated with Meevo. [Terms](https://cotlet.dev/terms)
- **Contact:** Questions about the company, security or an app: [contact@cotlet.dev](mailto:contact@cotlet.dev)

## Frequently asked questions

**How do I get access?**

Request access and pick Meevo. Cotlet reviews each request and emails you your API key.

**Do I need to be technical?**

No. You sign in to Meevo once in your browser and paste one command into your agent, or one URL into n8n. Your agent can walk you through it. There is no server to install, update or fix.

**Is a hosted server safe? My Meevo session would leave my computer.**

Cotlet keeps your Meevo session encrypted with AES-256 in an EU vault, isolated to your account and used only for the tools you allow: read only, or read and write. The AI model never sees it, and you revoke it in one click. A local server keeps the same session in a file on your computer, readable by any program you run, and needs a fresh sign-in whenever it expires.

**Do I need Meevo API access to use Cotlet?**

No. Cotlet works in your own Meevo account through your staff login, so you do not send the Meevo API request form or wait for Millennium. Your login needs security access to the areas your agent uses, for example the Register for package sales.

**Does Cotlet hit the Meevo API call limits?**

No. Cotlet does not use the Meevo Public API, so its per-location limit of 1,000 calls a day with overage charges and 60 calls a minute does not apply (checked 11 Oct 2026, docs.meevoapi.com).

**Can my agent post or send messages in Meevo without asking me?**

No. Every call to add_visit_note, book_appointment, reschedule_appointment, cancel_appointment or sell_package waits for your OK by default. For scheduled automations you can switch confirmation off per tool in your dashboard, for example only for approvals.

**Can I use the Meevo API in n8n?**

Yes. Add https://cotlet.dev/mcp/v1 with your API key in n8n's MCP Client node, or call https://cotlet.dev/api/v1/meevo/{tool} from the HTTP Request node.
