Developers
Receipts has a public MCP server. Assistants can search hair and beauty providers, read their pages and check open times without a key or sign-in. A person connects their account to book.
On this page7 sections
The Receipts MCP server
Without an account, the tools return what a signed-out visitor sees on receipts.beauty. A person can connect their account with OAuth and set a spending limit. The assistant can then list their appointments and ask to book, move or cancel. The person confirms each change on receipts.beauty, where they see the price and pay any deposit.
- Endpoint
https://api.receipts.beauty/mcp - Transport
- Streamable HTTP, one POST per message
- Protocol
2026-07-28,2025-11-25,2025-06-18,2025-03-26- Access
- Anonymous reads; OAuth for account tools
Connect an assistant
Send your agent the setup prompt, or add the server by hand.
Read the prompt
Set up Receipts for me. Receipts finds and books hair and beauty professionals in the UK. Its MCP server needs no API key:https://api.receipts.beauty1. Find your app in the list below. 2. If you can run the command or change your own MCP settings, do it. If you can't, give me the steps one at a time and wait for me. 3. If this app can't add an MCP server but can read web pages, use/mcp https://receipts.beautyinstead and tell me you did. 4. Check it worked: list the Receipts tools, or search for a service in a place I choose. 5. Tell me what changed and suggest one thing to ask. Never ask me for a password, API key or card number. I book and pay on receipts.beauty myself, so give me the booking link. Apps: - ChatGPT: Open Settings, then Apps. Turn on developer mode and create an app with the address. - Claude: Open Customize, then Connectors. Add a custom connector with the address. - Claude Code: run/llms.txt claude mcp add --transport http receipts https://api.receipts.beauty- Codex: run/mcp codex mcp add receipts --url https://api.receipts.beauty- Grok: Open Connectors, then New connector, then Custom, and add the address. - Gemini CLI: In its settings, add the address as an HTTP server. - Microsoft Copilot: Your organisation's admin adds the address as an MCP tool in Copilot Studio or Microsoft 365 Copilot. - Perplexity: Open Settings, then Connectors, and add a custom connector with the address. - Le Chat: Open Connectors and add a custom MCP connector with the address. - Cursor and VS Code: Add the address as a remote MCP server. - Instinct, Dots, Duet and other web agents: Nothing to install if it can read web pages: it uses the public pages. If its settings show MCP connections, add the address there. Setup prompt v2, 30 October 2026. Latest version:/mcp https://receipts.beauty/agents/setup.md
Or tell your agent to open this link and follow it:
https://receipts.beauty /agents/setup.mdAdd the server
claude mcp add --transport http receipts https://api.receipts.beauty/mcp In ChatGPT or Claude, add a custom connector with the endpoint. Using another assistant? See how to add it.
Ask about hair or beauty
For example: “Find knotless braids near Peckham and show me open times next week.”
Book on Receipts
The assistant gives a booking link for the chosen service and time. The person books and pays on receipts.beauty.
To test the server by hand:
npx @modelcontextprotocol/inspector --cli https://api.receipts.beauty /mcp --method tools/listTools
Reads can be retried. Booking, moving and cancelling need a connected account and the person's confirmation, and are marked destructive. Bios, reviews and other text from providers and clients is user-written.
Archive a lookbook
archive_lookbook
Archives a lookbook, which takes it out of view. The person can restore it.
lookbook_public_idrequiredlookbookPublicIdfromlist_my_lookbooks.expected_revisionrequiredaggregateRevisionfrom the lookbook you last read.idempotency_keyrequired- A new unique string for each change; reuse it only to retry the same change.
Archive a notification
archive_notification
Moves one notification out of the list and marks it read. It is kept, and list_notifications with include_archived still shows it.
notification_public_idrequirednotificationPublicIdfromlist_notifications.
Ask to answer a client's move
ask_answer_client_reschedule
Accepts or declines the move a client asked for, after the person confirms it in Receipts. It answers with a receipts.beauty link where the person reads the new time.
appointment_public_idrequired- The appointment, from
get_workspace_calendar. decisionrequiredRESCHEDULE_DECISION_ACCEPTorRESCHEDULE_DECISION_DECLINE.note- What the client reads with it, if anything. The person reads it first.
Ask to archive a service
ask_archive_service
Takes a service off the menu, after the person confirms it in Receipts. It answers with a receipts.beauty link where they read what changes.
provider_public_idrequired- The provider's public ID, from
get_connected_workspace. service_public_idrequired- The service, from
list_workspace_services.
Ask to change a client's appointment
ask_change_client_appointment
Confirms, declines, cancels, completes or marks a no-show on a client's appointment in the connected workspace, after the person confirms it in Receipts. Clients see this, so it answers with a receipts.beauty link where the person reads the change. A cancelled or declined booking refunds what the client is owed. Moving an appointment is the client's ask: answer it with ask_answer_client_reschedule.
appointment_public_idrequired- The appointment, from
get_workspace_calendar. actionrequired- What to do: one of the appointment's permitted actions.
note- What the client reads with it, if anything. The person reads it first.
Ask to pause a service
ask_pause_service
Stops clients seeing and booking a service, after the person confirms it in Receipts. It answers with a receipts.beauty link where they read what changes.
provider_public_idrequired- The provider's public ID, from
get_connected_workspace. service_public_idrequired- The service, from
list_workspace_services.
Ask to publish a service
ask_publish_service
Makes a service's draft live, with its price, after the person confirms it in Receipts. It answers with a receipts.beauty link where they read what changes.
provider_public_idrequired- The provider's public ID, from
get_connected_workspace. service_public_idrequired- The service, from
list_workspace_services.
Ask to reply to a review
ask_reply_to_review
Publishes a reply to a review of the provider in the connected workspace, after the person reads the exact text and confirms it in Receipts. A reply is public, and it replaces any earlier one. It answers with a receipts.beauty link. Find reviews with get_workspace_reviews.
provider_public_idrequired- The provider's public ID, from
get_connected_workspace. review_public_idrequired- The review, from
get_workspace_reviews. bodyrequired- The reply, exactly as it should appear.
Ask to change a privacy choice
ask_to_change_consent
Asks the signed-in person to change one privacy choice. A consent is their own decision, so nothing changes until they read it and confirm in Receipts. Check the outcome with get_booking_request.
purposerequired- The purpose, from
get_my_consents. grantedrequired- True to agree, false to withdraw.
Ask to change marketing emails
ask_to_change_marketing
Asks the signed-in person to turn marketing emails on or off. That choice is theirs, so nothing changes until they confirm in Receipts. Check the outcome with get_booking_request.
opt_inrequired- True to get marketing emails, false to stop them.
Ask to change my username or who sees my profile
ask_to_change_profile
Asks the signed-in person to change their username, or who can see their profile. One at a time. Others can see both, so nothing happens until they confirm in Receipts. Check the outcome with get_booking_request.
username- The new username.
visibility- Who can see the profile.
Ask to reset my recommendations
ask_to_reset_recommendations
Asks the signed-in person to erase what shapes their recommendations. It can't be undone, so nothing happens until they confirm in Receipts. Check the outcome with get_booking_request.
Block time on the calendar
block_workspace_time
Keeps a window free of online bookings. Appointments already in it stay. The person can see it on their calendar and unblock it. Answer with the blocked time's public ID, which unblock_workspace_time takes.
provider_public_idrequired- The provider's public ID, from
get_connected_workspace. starts_atrequired- Start, as an RFC 3339 time.
ends_atrequired- End, as an RFC 3339 time, up to 31 days after the start.
label- A short label the team sees, such as Lunch.
idempotency_keyrequired- A fresh random key for each new block. Reuse it only to retry the same one.
Book an appointment
book_appointment
Books an appointment for the signed-in person, after they confirm it in Receipts. It answers with a receipts.beauty link where the person sees the service, time, price and any deposit, and confirms or declines; nothing is booked or paid until they do. Show them the link and wait. A deposit is paid on the secure payment page Receipts opens after they confirm. Get the IDs from get_provider_page and a slot start from list_availability. Spending is capped per connection; a booking over the cap is refused.
provider_public_idrequiredproviderPublicIdfromget_provider_page.service_public_idrequired- The offering's
offeringPublicIdfromget_provider_page. location_public_id- The
locationPublicIdwhere the appointment is. Give this orclient_postcodeandclient_address. client_postcode- For a visit at the person's place: their postcode, as given to
list_availability. client_address- For a visit at the person's place: the rest of their address, house number and street. Ask the person; the provider sees it once they accept.
starts_atrequired- RFC 3339 start time of a slot from
list_availability. team_member_public_id- Optional: the team member, as
list_availabilityreturned for the slot. option_public_ids- Optional: the chosen variant and add-on public IDs of the service, from
get_provider_page. note- Optional note to the provider, in the person's words.
Cancel an appointment
cancel_appointment
Cancels one of the signed-in person's appointments, after they confirm it in Receipts. It answers with a receipts.beauty link where the person sees the appointment and what cancelling costs under the provider's terms, and confirms or declines. Only appointments whose permittedActions include APPOINTMENT_ACTION_CANCEL can be cancelled.
appointment_public_idrequired- The appointment's
publicIdfromlist_my_appointments. note- Optional reason for the provider, in the person's words.
Create a lookbook
create_lookbook
Creates a lookbook on the signed-in person's account. It stays private unless visibility says otherwise.
titlerequired- The lookbook title.
description- Optional description.
visibility- Optional: private (the default), unlisted or public.
Get a booking link
get_booking_link
Builds the receipts.beauty link where a person books with a provider. Booking and paying happen there, after the person signs in and confirms; give them the link rather than booking for them. Pass the provider's slug, and optionally the service, location and team member public IDs from get_provider_page, and a slot start time from list_availability.
provider_slugrequired- The provider's slug, from
search_providers,list_directoryorget_provider_page. service_public_id- The offering's public ID (
offeringPublicIdonget_provider_page) to open the booking at that service. location_public_id- The provider location's public ID (
locationPublicIdonget_provider_page). team_member_public_id- A team member's public ID, to book with that person.
slot_start- RFC 3339 start time of a slot from
list_availability. Used only withservice_public_id.
Check a booking request
get_booking_request
Says whether the person has confirmed, declined or let expire a booking, move or cancellation you asked for with book_appointment, reschedule_appointment or cancel_appointment, and once confirmed the appointment and any deposit payment link. Pass the requestId those tools returned.
request_idrequired- The
requestIdbook_appointment,reschedule_appointmentorcancel_appointmentreturned.
Find the connected workspace
get_connected_workspace
Returns the provider this agent is connected to: its public ID, which the workspace tools take, and its name.
Read my privacy choices
get_my_consents
Returns what the signed-in person has agreed to, purpose by purpose. Reading only: a consent is the person's own decision, so they change it in Receipts.
Read my beauty interests
get_my_interests
Returns the services the signed-in person chose, first choice first. Call it before set_my_interests, which replaces the whole list.
Read a lookbook
get_my_lookbook
Reads one lookbook the signed-in person can open.
lookbook_public_idrequiredlookbookPublicIdfromlist_my_lookbooks.
Read my profile
get_my_profile
Returns the signed-in person's profile: name, bio, links, pronouns, colour, and who can see it. Call it before update_my_profile.
Read my settings
get_my_settings
Returns the signed-in person's Receipts settings. A setting that's missing has never been answered.
Read what is waiting for me
get_my_setup
Lists what the signed-in person still has to do in Receipts, in order: agreements to accept, Receipts Preview access, an action they were part-way through, and setup questions. Enforced ones block their account until they are passed. Reading only: agreements and Preview access wait for the person, so send them to receipts.beauty to finish.
Read my notification choices
get_notification_preferences
Returns which notifications the signed-in person gets, by category and channel. Call it before set_notification_preference.
Get a provider's public page
get_provider_page
Returns a provider's public Receipts page: profile and bio, locations and opening hours, services with prices (minor units, such as pence) and durations, team, portfolio, credentials and published reviews. It also gives the public IDs list_availability and get_booking_link need: providerPublicId, each offering's offeringPublicId and each location's locationPublicId. Reviews and bios are written by clients and providers.
slugrequired- The provider's slug, such as "london-braids-studio", from
search_providers,list_directoryorget_service_area_providers. location_public_id- Optional: a location's public ID, to resolve services, hours and booking for that branch.
Read profile questions
get_question_set
Returns one question set's questions in order, with their exact wording, options and the person's current answers. Ask the questions in this wording and offer every option, including "I'm not sure". Never ask a question marked sensitive: tell the person they can answer it in Receipts. Then call save_my_answers.
set_idrequired- The set's id, from
list_my_question_sets.
Read what shapes my recommendations
get_recommendation_settings
Returns what Receipts has learned about the signed-in person's taste, and which of their lookbooks and saved providers shape their feed. Use set_recommendation_interest and set_recommendation_source to change them.
limit- How many of each to return.
offset- How many to skip, for the next page.
query- Only entries whose label contains this text.
Find providers for a service in a place
get_service_area_providers
Lists the most-reviewed providers offering one service in one place, up to 100, with each published offering's price (minor units, such as pence), duration and whether it books online, plus related services and places. Take service_slug and place_key from list_directory. Call get_provider_page for one provider's full page.
service_slugrequired- The service area's
serviceSlugfromlist_directory, such as "knotless-braids". place_keyrequired- The service area's
placeKeyfromlist_directory, such as "london".
Read the workspace calendar
get_workspace_calendar
Returns the appointments and blocked time of the provider in the connected workspace, between two times: 35 days from a week ago by default, up to 93 days. Each appointment lists its permitted actions.
provider_public_idrequired- The provider's public ID, from
get_connected_workspace. from- Start of the window, as an RFC 3339 time.
to- End of the window, as an RFC 3339 time.
Read my client messages
get_workspace_messages
Returns the client conversations of the provider in the connected workspace.
filterrequired- Which conversations to return.
provider_public_id- Which provider in the workspace, when it has several. Leave it out for the main one.
Read my workspace overview
get_workspace_overview
Returns how the provider in the workspace this agent is connected to is doing: performance over recent days, and what needs attention.
provider_public_id- Which provider in the workspace, when it has several. Leave it out for the main one.
Read my provider page
get_workspace_profile
Returns the provider page as the team sees it in the connected workspace, drafts included.
provider_public_id- Which provider in the workspace, when it has several. Leave it out for the main one.
Read my provider reviews
get_workspace_reviews
Returns the reviews of the provider in the connected workspace.
provider_public_id- Which provider in the workspace, when it has several. Leave it out for the main one.
Read a service
get_workspace_service
Returns one service as clients see it, and its unpublished draft if it has one.
provider_public_idrequired- The provider's public ID, from
get_connected_workspace. service_public_idrequired- The service, from
list_workspace_services.
List open appointment times
list_availability
Lists a provider's open appointment slots for one service between two dates, in the provider's time zone, with the duration, whether the provider confirms bookings, any deposit, and a plain reason when nothing is open. Get provider_public_id, service_public_id and location_public_id from get_provider_page; for a service done at the person's place, give their client_postcode instead of a location. To book, give the person a get_booking_link link with the chosen slot; this tool books nothing.
provider_public_idrequiredproviderPublicIdfromget_provider_page.service_public_idrequired- The offering's
offeringPublicIdfromget_provider_page. location_public_id- The
locationPublicId(fromget_provider_page) where the appointment would be. Give this orclient_postcode. client_postcode- For a service done at the person's place (an
at_client_locationservice match): their postcode, which must be inside the provider's travel area. Give this orlocation_public_id. from_daterequired- First day to search, YYYY-MM-DD in the provider's time zone.
to_daterequired- Last day to search (inclusive), YYYY-MM-DD.
team_member_public_id- Optional: only times with this team member.
Read a provider conversation
list_conversation_messages
Reads messages in one conversation with a provider. Pass provider_public_id to read a client conversation of the workspace this agent is connected to.
thread_public_idrequiredthreadPublicIdfrom the matching list tool.provider_public_id- The provider, when reading as its team. Leave it out for the person's own conversations.
List direct conversations
list_direct_conversations
Lists the person's conversations with other members.
page_size- Optional page size.
page_token- Optional token from the last page.
Read a direct conversation
list_direct_messages
Reads messages in one direct conversation, newest first.
thread_public_idrequiredthreadPublicIdfrom the matching list tool.page_size- Optional page size.
page_token- Optional token from the last page.
List providers and service areas
list_directory
Lists public service areas, then public providers (slug and name), one page at a time. A service area is a service offered in a place by at least two providers, such as Afro hair in London. Call it to learn which services and places Receipts covers, then call get_service_area_providers with a service_slug and place_key, or get_provider_page with a slug. Use search_providers instead to find someone; pass next_cursor as cursor only to keep browsing. provider_count and service_area_count give the full size. It may be up to ten minutes old, so entries can move between pages.
cursornext_cursorfrom the previous page. Leave it out to start at the beginning.
List looks in a lookbook
list_lookbook_looks
Lists the looks saved in a lookbook.
lookbook_public_idrequiredlookbookPublicIdfromlist_my_lookbooks.limit- Optional: at most this many looks.
List cleared photos for a spot
list_media_spot
Lists photos Receipts has cleared to use in one spot on its pages. A house account picks from these for its lookbooks.
spotrequired- The MediaSpot to list, such as
MEDIA_SPOT_EXPLAINER.
List my appointments
list_my_appointments
Lists the signed-in person's own appointments, upcoming or past: provider, service, time, status, price, deposit and payment, and which actions they may take now (permittedActions). Use an appointment's publicId with reschedule_appointment or cancel_appointment.
whenAPPOINTMENT_LIST_SCOPE_UPCOMING(the default) orAPPOINTMENT_LIST_SCOPE_PAST.limit- Optional: at most this many appointments.
List conversations with providers
list_my_conversations
Lists the person's conversations with providers.
provider_public_id- The provider, to list its client conversations as its team. Works only in the workspace this agent is connected to.
limit- Optional: at most this many conversations.
cursor- Optional cursor from the last page.
List my lookbooks
list_my_lookbooks
Lists the signed-in person's own lookbooks with their ids, visibility and revision. Call this before changing one.
limit- Optional: at most this many lookbooks.
List my loyalty cards
list_my_loyalty_cards
Lists the signed-in person's loyalty cards with providers: visits so far, visits needed and the reward.
List my profile questions
list_my_question_sets
Returns the question sets the signed-in person can answer, such as their hair match profile, makeup preferences and beauty interests, each with whether it is answered and which questions changed since. Read one with get_question_set before asking the person its questions.
List my review drafts
list_my_review_drafts
Lists the reviews the signed-in person has started and not submitted. Reading only: a review is the person's own words, so agents can't write, change or submit one.
List my reviews
list_my_reviews
Lists the reviews the signed-in person wrote, with their status and any provider reply. Reading only: a review is the person's own words, so agents can't write, change or submit one.
limit- How many to return.
Read my notifications
list_notifications
Lists the signed-in person's notifications, newest first, with how many are unread. Use mark_notification_read or archive_notification on a notificationPublicId.
page_size- How many to return, up to 100. Default 30.
page_tokennextPageTokenfrom the last call, for the next page.include_archived- Also list archived notifications.
List what my feed learned from
list_recommendation_activity
Lists the signed-in person's past actions that shape their recommendations. Use set_recommendation_activity to stop one counting.
limit- How many to return.
offset- How many to skip, for the next page.
hidden_only- Only actions that have stopped counting.
List my saved providers
list_saved_providers
Lists the providers the signed-in person has saved. Each entry's publicId is what remove_saved_provider takes.
limit- How many to return.
List the workspace's services
list_workspace_services
Returns the service menu of the provider in the connected workspace: live, draft, paused and archived services, each with its price and whether it has unpublished changes.
provider_public_idrequired- The provider's public ID, from
get_connected_workspace. search- Words in the service's name.
page_tokennext_page_tokenfrom the last page.
Mark a notification read
mark_notification_read
Marks one notification read. It stays in the list.
notification_public_idrequirednotificationPublicIdfromlist_notifications.
Message a provider
message_provider
Starts a conversation with a provider as the person, with a first message.
client_message_idrequired- A new UUIDv7 for this message.
provider_public_idrequiredproviderPublicIdfromget_provider_page.bodyrequired- The message text.
idempotency_keyrequired- A new unique string for each change; reuse it only to retry the same change.
Remove a look from a lookbook
remove_look_from_lookbook
Removes one saved look from a lookbook. The look itself stays on Receipts.
lookbook_look_public_idrequiredlookbookLookPublicIdfromlist_lookbook_looks.expected_revisionrequiredaggregateRevisionfrom the lookbook you last read.idempotency_keyrequired- A new unique string for each change; reuse it only to retry the same change.
Remove a saved provider
remove_saved_provider
Removes a provider from the signed-in person's saved list. Saving them again undoes it.
saved_provider_public_idrequiredpublicIdfromlist_saved_providers.
Ask for a copy of my data
request_my_data_export
Asks the signed-in person to request a copy of everything in their account. Nothing happens until they confirm in Receipts. The copy goes to them, never to you. Check the outcome with get_booking_request.
Move an appointment
reschedule_appointment
Asks to move one of the signed-in person's appointments to a new time, after they confirm it in Receipts. It answers with a receipts.beauty link where the person sees the old and new times and confirms or declines; the provider then accepts or declines the move. Find a free time with list_availability for the same service and location. Only appointments whose permittedActions include APPOINTMENT_ACTION_RESCHEDULE can be moved.
appointment_public_idrequired- The appointment's
publicIdfromlist_my_appointments. starts_atrequired- RFC 3339 start of the new time, a slot from
list_availability. note- Optional note to the provider, in the person's words.
Save a look to a lookbook
save_look_to_lookbook
Saves a public look into one of the person's lookbooks.
lookbook_public_idrequiredlookbookPublicIdfromlist_my_lookbooks.look_public_idrequired- The public look to save: a portfolio image's
lookPublicIdor a supported look'slookPublicIdfromget_provider_page. source_revisionrequired- The revision read with that look: the portfolio image's
lookSourceRevisionor the supported look'ssourceRevision. A look that changed since must be read again. expected_revisionrequiredaggregateRevisionfrom the lookbook you last read.idempotency_keyrequired- A new unique string for each change; reuse it only to retry the same change.
note- Optional note for the person.
Save my answers
save_my_answers
Proposes the person's answers to one question set. Nothing is saved until the person reads them in Receipts and confirms; answers to questions they did not give stay as they were. Sensitive questions are refused: those are answered only in Receipts. Check the outcome with get_booking_request.
set_idrequired- The set's id, from
list_my_question_sets. set_versionrequired- The set's version, from
get_question_set. choicesrequired- One entry per chosen option, written
question_key=option_keywith keys fromget_question_set, such as "hair_pattern=coily". Repeat a question for several options, first choice first. Use the not-sure option's key when the person is unsure.
Save a provider
save_provider
Saves a published provider to the signed-in person's saved list. The provider isn't told. Find providers with search_providers or list_directory.
provider_public_idrequired- The provider's public ID, from
get_provider_pageorsearch_providers. idempotency_keyrequired- A new unique string for this save. Reuse it only to retry the same save.
Search conversations
search_conversations
Finds the person's conversations by who they are with, anything said in them, or what their photos show. Best match first.
query- Words to find.
limit- Optional: at most this many conversations.
Search hair and beauty providers
search_providers
Searches Receipts for hair and beauty providers (salons, barbers and independent stylists, mostly in the UK) by what the person wants, in plain words such as "knotless braids" or "silk press for 4C hair", near a place. Results are ranked by evidence of that work (photos, reviews and services) and include each provider's slug, summary, matched styles, a matched service with its price and booking facts. Call get_provider_page with a slug for details.
queryrequired- What the person wants, in their words.
location- Optional: a place name or UK postcode, such as "Peckham" or "E8 1DY". Empty searches the default launch area.
limit- Optional: how many providers to return in this page.
cursor- Optional:
nextCursorfrom a previoussearch_providersresult, for the next page.
Reply in a provider conversation
send_conversation_message
Sends a message in a conversation with a provider as the person. A member of the provider's team sets provider_public_id.
client_message_idrequired- A new UUIDv7 for this message.
provider_public_id- Optional: the provider, when replying as its team.
thread_public_idrequiredthreadPublicIdfrom the matching list tool.bodyrequired- The message text.
idempotency_keyrequired- A new unique string for each change; reuse it only to retry the same change.
Send a direct message
send_direct_message
Sends a message in a direct conversation as the person.
client_message_idrequired- A new UUIDv7 for this message.
thread_public_idrequiredthreadPublicIdfrom the matching list tool.bodyrequired- The message text.
idempotency_keyrequired- A new unique string for each change; reuse it only to retry the same change.
Change my beauty interests
set_my_interests
Replaces the services the signed-in person chose. Read them with get_my_interests first and send the whole list, first choice first, or the rest are dropped.
domainsrequired- The complete list of service names, as
get_my_interestsreturns them.
Change a notification choice
set_notification_preference
Turns one notification category on or off on one channel. Everything else stays as it is. It can't change marketing emails; the person does that in Receipts.
categoryrequired- The category, from
get_notification_preferences. channelrequired- Email or push. Not every category has both.
enabledrequired- True to get these notifications, false to stop them.
Change whether an action counts
set_recommendation_activity
Stops one past action shaping recommendations, or lets it count again. The action itself isn't erased.
item_keyrequireditemKeyfromlist_recommendation_activity.event_typerequiredeventTypefrom the same entry.excludedrequired- True to stop it counting, false to let it count.
Change an interest
set_recommendation_interest
Changes how one learned interest shapes the signed-in person's recommendations. It changes nothing else.
interest_public_idrequiredpublicIdof an interest fromget_recommendation_settings.statusrequired- What the interest should do.
Change whether a source counts
set_recommendation_source
Stops one of the signed-in person's lookbooks or saved providers shaping their feed, or lets it count again. The lookbook or saved provider itself doesn't change.
source_kindrequired- Whether it is a lookbook or a saved provider.
source_public_idrequiredsourcePublicIdfromget_recommendation_settings.enabledrequired- True to let it count, false to stop it.
Start a direct conversation
start_direct_conversation
Sends another member a first message as the person.
client_message_idrequired- A new UUIDv7 for this message.
target_user_public_idrequired- The member to message.
bodyrequired- The message text.
idempotency_keyrequired- A new unique string for each change; reuse it only to retry the same change.
Unblock time on the calendar
unblock_workspace_time
Frees blocked time, so clients can book it online again. Find it with get_workspace_calendar.
provider_public_idrequired- The provider's public ID, from
get_connected_workspace. blocked_time_public_idrequired- The blocked time, from
get_workspace_calendar.
Update a lookbook
update_lookbook
Changes a lookbook's title, description or visibility. Fields left out stay as they are.
lookbook_public_idrequiredlookbookPublicIdfromlist_my_lookbooks.expected_revisionrequiredaggregateRevisionfrom the lookbook you last read.idempotency_keyrequired- A new unique string for each change; reuse it only to retry the same change.
title- Optional new title.
description- Optional new description.
visibility- Optional:
LOOKBOOK_VISIBILITY_PRIVATE,LOOKBOOK_VISIBILITY_UNLISTEDorLOOKBOOK_VISIBILITY_PUBLIC.
Update my profile
update_my_profile
Changes the signed-in person's profile. Fields left out stay as they are, and an empty string clears a field. It can't change their username, photo, or who can see the profile; they do that in Receipts. If the profile is public, what you write here is public.
display_name- The name shown on the profile.
bio- A short bio.
pronouns- Pronouns, up to 30 characters.
website_url- An https link to their website.
instagram_url- An https link to their Instagram.
tiktok_url- An https link to their TikTok.
profile_tone- The profile's colour.
pinned_lookbook_public_id- One of their public lookbooks to pin, from
list_my_lookbooks. An empty string unpins. accepts_direct_requests- Whether members they have not talked to may send a message request.
Change my settings
update_my_settings
Changes the signed-in person's Receipts settings. Settings left out stay as they are. It can't change search history or personalisation; the person does that in Receipts.
theme- Light, dark, or follow the device.
density- How tightly pages are laid out.
motion- Follow the device, or reduce motion.
contrast- Follow the device, or use stronger contrast.
media_autoplay- Whether video plays by itself.
image_card_detail- How much detail image cards show.
ai_content- How AI-labelled media is shown to this person.
map_provider- Which maps app opens for directions.
time_zone- An IANA time zone, such as Europe/London.
Edit a service draft
update_service_draft
Changes a service's unpublished draft: its name, description, price or length. Anything left out keeps its value, and any earlier unpublished change stays. Clients see nothing until the person publishes it, so follow with ask_publish_service.
provider_public_idrequired- The provider's public ID, from
get_connected_workspace. service_public_idrequired- The service, from
list_workspace_services. name- The service's name.
description- What the service is, in the provider's words.
price_min_minor- The price in pence, or the lowest price of a range.
duration_minutes- How long it takes, in minutes.
idempotency_keyrequired- A fresh random key for each new change. Reuse it only to retry the same one.
Ask to withdraw a review
withdraw_my_review
Asks the signed-in person to withdraw one of their reviews. It can't be undone, so nothing happens until they confirm in Receipts. Check the outcome with get_booking_request.
review_public_idrequired- The review's id, from
list_my_reviews.
Limits and data
- Counted against
- Your connection when an account is connected, else your address
- ChatGPT and Claude
- Their published addresses get 25 times the limit
- Booking requests
- A few a minute per connection; a retry returns the same request
- Your quota
RateLimitheaders on limited and non-GET responses, and_metaon each tool result that calls Receipts
Over a limit, a request gets HTTP 429 with Retry-After, or a tool error with the seconds to wait. An earlier retry is refused the same way. Prices are in minor units, such as pence. The server keeps no conversation state, so each request stands alone.
Without a connected account, the tools return published profiles, services, prices, reviews and open times. A connected assistant sees its own person's appointments and loyalty cards, within what that person allowed.
Discovery
Changelog
Follow changes by RSS or JSON Feed.
Setup prompt version 2
An agent that can read the web needs no install: tell it to open receipts.beauty/agents/setup.md and follow it. Version 2 lists these agents and points them to the public pages.
list_directory returns pages
list_directory returns 100 entries at a time: service areas, then providers. Pass next_cursor as cursor to read the next page; provider_count and service_area_count give the full size. get_service_area_providers returns the 100 most-reviewed providers, and provider_count on the area gives the full count. Long sitemaps continue in numbered files listed in sitemap.xml.
Setup prompt
Version 1 of the setup prompt is at receipts.beauty/agents/setup.md. Send it to an assistant and it adds the Receipts MCP server, or gives the person the steps for their app. The version and date are on its last line, and changes to it appear here.
Limits per connection, and when to retry
Calls from a connected assistant count against its own connection. ChatGPT's and Claude's published addresses share a larger budget. Each tool result that calls Receipts carries the remaining quota under _meta beauty.receipts/rate-limit, non-GET and limited responses carry the IETF RateLimit-Policy and RateLimit headers, and a limited call says how many seconds to wait. Repeating a booking change returns the request already waiting for the person.
Connect a Receipts account
The MCP server now signs people in with OAuth (api.receipts.beauty is the authorization server). A connected assistant can list the person's appointments and loyalty cards, and ask to book, move or cancel. Each change waits for the person to confirm on receipts.beauty, where they see the price; clients on MCP 2026-07-28 get a URL elicitation, others a link. Bookings stay under a spending limit the person sets when they connect.
Public MCP server
Receipts has a public, anonymous MCP server at api.receipts.beauty/mcp. Assistants can search hair and beauty providers, list service areas, read public provider pages, check open appointment times and give a booking link. It speaks MCP 2026-07-28 and earlier revisions, with a server card and an AI catalog for discovery.
Account access
A person connects an assistant to their own account with OAuth 2.1. An account tool answers HTTP 401 with a WWW-Authenticate challenge that names its protected resource metadata. Clients register dynamically or with a client ID metadata document and use PKCE (S256). Codes go only to known assistants' callbacks or loopback. The person chooses the scopes and a spending limit, and can revoke the connection from their settings.
Receipts has no API keys. The app's own requests are private and can change without notice, so build on the MCP server.
To ask about a use case, write to hello@receipts.beauty.
Reporting a vulnerability
Email security@receipts.beauty with the steps to reproduce. Test only against an account you own, and do not read, change or keep anyone else's data.