DevelopersDashboard →

Appty for assistants

An assistant can read a public booking page, find open times, and hand someone a link to confirm and pay on Appty. To work with your own bookings, add the MCP URL and sign in. An API key still works. Money moves only when a client pays on Appty, or when you confirm an action that your dashboard would already take.

Endpoints

Public tools

No API key. Pass any provider's booking-link slug. The reply is only what that booking page already shows: name, headline, time zone, currency, services, and upcoming group sessions. A service does not include a meeting address or link, because the booking page does not show one. A group session includes where you meet when the page shows it (the type, not an address). Hidden or inactive services stay hidden. A retired slug follows the same history as the booking page. Client names and other providers' private fields are never included.

get_provider

Input: { "slug": "ada" }

{
  "slug": "ada",
  "name": "Ada Cole",
  "role_title": "Coach",
  "headline": "Strength sessions",
  "timezone": "America/Vancouver",
  "currency": "CAD",
  "booking_url": "https://getappty.com/ada",
  "services": [
    {
      "id": "00000000-0000-4000-8000-000000000001",
      "name": "Private session",
      "duration_minutes": 60,
      "price_amount": 8000,
      "currency": "CAD",
      "price": "CA$80.00"
    }
  ],
  "group_sessions": []
}

Example shape only. Prices are minor units plus a formatted label. A service with more than one length also includes durations.

find_open_slots

Same slot rules as the booking page, for the service's default length. from_date and to_date are YYYY-MM-DD, inclusive, at most 31 days. Optional timezone is the zone those dates are read in. Labels stay in the provider's zone.

{
  "slug": "ada",
  "service_id": "00000000-0000-4000-8000-000000000001",
  "from_date": "2026-04-01",
  "to_date": "2026-04-07"
}

Each slot has start (ISO 8601 with the provider's offset), start_utc (the instant the booking page matches), and label (provider-local). If you passed another time zone, viewer_label is included too.

get_booking_link

Checks the start is still open, then returns a link with that service and time selected (?service= and ?start=). The client confirms and pays on the page. Nothing is booked by this tool.

{
  "slug": "ada",
  "service_id": "00000000-0000-4000-8000-000000000001",
  "start": "2026-04-02T16:00:00.000Z"
}
{
  "url": "https://getappty.com/ada?service=00000000-0000-4000-8000-000000000001&start=2026-04-02T16%3A00%3A00.000Z",
  "note": "The client confirms and pays on this page. No payment happens in the assistant."
}

Provider tools

These run as you, after you sign in from the assistant or send Authorization: Bearer appty_sk_…. Either way, every query is limited to your account.

Sign in

The recommended way to connect is to add the MCP URL in your assistant and sign in when it asks. Appty shows the app name and the host it will return to. Approve it, and the assistant can use your account. Disconnect it later from Dashboard > Settings > AI assistants.

Scopes are appty.read (bookings, clients, balances) and appty.write (prepare a booking, cancellation, pay link, or invoice). A write still returns a preview and only happens after you confirm in the chat. An API key includes both scopes. A token issued for one MCP URL does not work on the other.

Discovery documents are at /.well-known/oauth-authorization-server and /.well-known/oauth-protected-resource. A request with no Authorization header still answers initialize, the tool list, and the public tools. Calling a provider tool with no token is HTTP 401 with WWW-Authenticate: Bearer resource_metadata="https://getappty.com/.well-known/oauth-protected-resource/api/mcp". A malformed or invalid token uses the same header plus error="invalid_token". A token that lacks the scope for that tool is HTTP 403 with error="insufficient_scope". The directory URL uses …/oauth-protected-resource/api/mcp/directory.

API key

An API key still works if you would rather paste one. In the dashboard, open Profile settings and find AI assistants (MCP). Name the key and create it. The full key is shown once. After that you only see the name, the last 4 characters, and when it was last used. Revoking a key stops it immediately. Send it as a Bearer token. Do not put the key in a booking-page link.

Authorization: Bearer appty_sk_…

Confirmation

book_session, reschedule_booking, cancel_booking, send_pay_link, and send_invoice return a preview first and only act when confirm is the boolean true. The string "true" is not enough. The preview describes who is emailed, the amount, and any refund or cancellation fee, and does nothing. With confirm: true, Appty runs the same action as the dashboard, including the emails that action sends. No money moves through the assistant. A pay link or invoice only sends a request the client pays on Appty. On the directory endpoint, book_session for a paid service skips that step and returns the booking link instead. Every provider tool call made with a key or a signed-in connection is listed under Recent actions on the same settings card.

Add it to an MCP client

Point the client at one of the two endpoints and sign in when it asks. That is the recommended way. An API key in the Authorization header still works. Public tools work with the header left out. Use the directory URL when the assistant should not send pay links or invoices.

{
  "url": "https://getappty.com/api/mcp"
}

Or paste a key:

{
  "url": "https://getappty.com/api/mcp",
  "headers": {
    "Authorization": "Bearer appty_sk_…"
  }
}

A client that wraps remote servers in a named map often looks like this. The field names vary. The URL is the MCP endpoint. A pasted key goes in the Authorization header.

{
  "mcpServers": {
    "appty": {
      "url": "https://getappty.com/api/mcp",
      "headers": {
        "Authorization": "Bearer appty_sk_…"
      }
    }
  }
}