Navigated to /developers.

Beauty by proof
Log inBeauty by proof

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
  1. 01Connect an assistant
  2. 02Tools
  3. 03Limits and data
  4. 04Discovery
  5. 05Changelog
  6. 06Account access
  7. 07Reporting a vulnerability

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.beauty/mcp

1. 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 https://receipts.beauty/llms.txt instead 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 claude mcp add --transport http receipts https://api.receipts.beauty/mcp
- Codex: run codex mcp add receipts --url https://api.receipts.beauty/mcp
- 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: https://receipts.beauty/agents/setup.md
https://receipts.beauty/agents/setup.md
  1. Add 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.

  2. Ask about hair or beauty

    For example: “Find knotless braids near Peckham and show me open times next week.”

  3. 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/list

Tools

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_id required
lookbookPublicId from list_my_lookbooks.
expected_revision required
aggregateRevision from the lookbook you last read.
idempotency_key required
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_id required
notificationPublicId from list_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_id required
The appointment, from get_workspace_calendar.
decision required
RESCHEDULE_DECISION_ACCEPT or RESCHEDULE_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_id required
The provider's public ID, from get_connected_workspace.
service_public_id required
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_id required
The appointment, from get_workspace_calendar.
action required
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_id required
The provider's public ID, from get_connected_workspace.
service_public_id required
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_id required
The provider's public ID, from get_connected_workspace.
service_public_id required
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_id required
The provider's public ID, from get_connected_workspace.
review_public_id required
The review, from get_workspace_reviews.
body required
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.

purpose required
The purpose, from get_my_consents.
granted required
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_in required
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_id required
The provider's public ID, from get_connected_workspace.
starts_at required
Start, as an RFC 3339 time.
ends_at required
End, as an RFC 3339 time, up to 31 days after the start.
label
A short label the team sees, such as Lunch.
idempotency_key required
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_id required
providerPublicId from get_provider_page.
service_public_id required
The offering's offeringPublicId from get_provider_page.
location_public_id
The locationPublicId where the appointment is. Give this or client_postcode and client_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_at required
RFC 3339 start time of a slot from list_availability.
team_member_public_id
Optional: the team member, as list_availability returned 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_id required
The appointment's publicId from list_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.

title required
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_slug required
The provider's slug, from search_providers, list_directory or get_provider_page.
service_public_id
The offering's public ID (offeringPublicId on get_provider_page) to open the booking at that service.
location_public_id
The provider location's public ID (locationPublicId on get_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 with service_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_id required
The requestId book_appointment, reschedule_appointment or cancel_appointment returned.

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_id required
lookbookPublicId from list_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.

slug required
The provider's slug, such as "london-braids-studio", from search_providers, list_directory or get_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_id required
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_slug required
The service area's serviceSlug from list_directory, such as "knotless-braids".
place_key required
The service area's placeKey from list_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_id required
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.

filter required
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_id required
The provider's public ID, from get_connected_workspace.
service_public_id required
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_id required
providerPublicId from get_provider_page.
service_public_id required
The offering's offeringPublicId from get_provider_page.
location_public_id
The locationPublicId (from get_provider_page) where the appointment would be. Give this or client_postcode.
client_postcode
For a service done at the person's place (an at_client_location service match): their postcode, which must be inside the provider's travel area. Give this or location_public_id.
from_date required
First day to search, YYYY-MM-DD in the provider's time zone.
to_date required
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_id required
threadPublicId from 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_id required
threadPublicId from 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.

cursor
next_cursor from 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_id required
lookbookPublicId from list_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.

spot required
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.

when
APPOINTMENT_LIST_SCOPE_UPCOMING (the default) or APPOINTMENT_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_token
nextPageToken from 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_id required
The provider's public ID, from get_connected_workspace.
search
Words in the service's name.
page_token
next_page_token from the last page.

Mark a notification read

mark_notification_read

Marks one notification read. It stays in the list.

notification_public_id required
notificationPublicId from list_notifications.

Message a provider

message_provider

Starts a conversation with a provider as the person, with a first message.

client_message_id required
A new UUIDv7 for this message.
provider_public_id required
providerPublicId from get_provider_page.
body required
The message text.
idempotency_key required
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_id required
lookbookLookPublicId from list_lookbook_looks.
expected_revision required
aggregateRevision from the lookbook you last read.
idempotency_key required
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_id required
publicId from list_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_id required
The appointment's publicId from list_my_appointments.
starts_at required
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_id required
lookbookPublicId from list_my_lookbooks.
look_public_id required
The public look to save: a portfolio image's lookPublicId or a supported look's lookPublicId from get_provider_page.
source_revision required
The revision read with that look: the portfolio image's lookSourceRevision or the supported look's sourceRevision. A look that changed since must be read again.
expected_revision required
aggregateRevision from the lookbook you last read.
idempotency_key required
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_id required
The set's id, from list_my_question_sets.
set_version required
The set's version, from get_question_set.
choices required
One entry per chosen option, written question_key=option_key with keys from get_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_id required
The provider's public ID, from get_provider_page or search_providers.
idempotency_key required
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.

query required
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: nextCursor from a previous search_providers result, 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_id required
A new UUIDv7 for this message.
provider_public_id
Optional: the provider, when replying as its team.
thread_public_id required
threadPublicId from the matching list tool.
body required
The message text.
idempotency_key required
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_id required
A new UUIDv7 for this message.
thread_public_id required
threadPublicId from the matching list tool.
body required
The message text.
idempotency_key required
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.

domains required
The complete list of service names, as get_my_interests returns 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.

category required
The category, from get_notification_preferences.
channel required
Email or push. Not every category has both.
enabled required
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_key required
itemKey from list_recommendation_activity.
event_type required
eventType from the same entry.
excluded required
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_id required
publicId of an interest from get_recommendation_settings.
status required
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_kind required
Whether it is a lookbook or a saved provider.
source_public_id required
sourcePublicId from get_recommendation_settings.
enabled required
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_id required
A new UUIDv7 for this message.
target_user_public_id required
The member to message.
body required
The message text.
idempotency_key required
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_id required
The provider's public ID, from get_connected_workspace.
blocked_time_public_id required
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_id required
lookbookPublicId from list_my_lookbooks.
expected_revision required
aggregateRevision from the lookbook you last read.
idempotency_key required
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_UNLISTED or LOOKBOOK_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_id required
The provider's public ID, from get_connected_workspace.
service_public_id required
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_key required
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_id required
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
RateLimit headers on limited and non-GET responses, and _meta on 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.

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.