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
- Full:
https://getappty.com/api/mcp. Every tool below, includingsend_pay_linkandsend_invoice. - Directory:
https://getappty.com/api/mcp/directory. The same tools exceptsend_pay_linkandsend_invoice. For a paid service,book_sessionreturns a booking link (the same link asget_booking_link) and does not create a booking, a charge, or a pay request. The client confirms and pays on Appty. A free service (price 0) books the same way as on the full endpoint.
- Transport: Model Context Protocol, Streamable HTTP, stateless. One JSON response per request. There is no session to resume.
- Send POST.
Content-Type: application/json.Acceptmust include bothapplication/jsonandtext/event-stream. - GET and DELETE return 405. Initialize, list tools, and call tools are all POST.
- Public tools share a limit of 60 calls a minute per IP. Over the limit, the tool returns an error.
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.
list_bookings—from,to,status,limit(max 100). Omit both dates for upcoming sessions. No pay or manage tokens.list_clients— optionalqueryon name or email,limit(max 100).who_owes— unpaid balances per client, the same figures as the dashboard.book_session—client_id,service_id,start,confirm. Uses the client's default pay mode and the service price. A past start is saved as completed, with no email. On the directory endpoint a paid service returns a booking link instead, and nothing is booked.reschedule_booking—booking_id,new_start,confirm. The new time must be an open slot. The client is not emailed.cancel_booking—booking_id, optionalreason,confirm. Uses the cancellation policy, including any refund or late fee, and emails the client.send_pay_link—booking_idorclient_id, not both, plusconfirm. A client id emails each unpaid session and invoice. Group spots, packages, and fees are listed and not emailed.send_invoice—client_idplus eitherbooking_idsorperiod(YYYY-MMin your time zone), plusconfirm. One invoice per currency, then each is emailed.
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_…"
}
}
}
}