BestBeautyClinics.com — For AI Agents
BestBeautyClinics.com is an independent U.S. directory of beauty, laser and medical aesthetics clinics, and a consultation-request routing service. It is not a clinic, and it is not affiliated with the clinics it lists. The directory currently lists 167 clinics in 10 cities, with 1101 published prices collected from the clinics' own websites.
If you are an AI assistant helping a user find a clinic, compare prices, or request a consultation or quote, this page documents exactly what you can do programmatically, what each response means, and the limits of the service. Please respect the limits: they are part of how the service works, not fine print.
What an agent can do
- Look up clinics, treatments, cities and published prices through the JSON data feeds and the full-text dump listed below. No key or signup is required.
- Request a consultation or quote for your user by POSTing one JSON request. The request is delivered to one matched clinic — the exclusive partner for that city and treatment — and that clinic contacts your user directly with its quote.
- Claim a profile on behalf of a clinic (for clinic owners or their representatives) by POSTing a claim. Claims are reviewed manually by a person.
- Add a new clinic listing (for clinics not yet listed) by POSTing a submission — see Action 3. New listings cost a flat $199 one-time fee and are verified manually before anything is published.
What this service does not do
- It does not confirm bookings or appointments. Submitting a request is not a booking. The clinic offers times and confirms any appointment when it contacts your user.
- It does not quote prices itself. The only prices here are the clinics' own published prices (see the price feeds). A quote for a specific user comes from the clinic after contact.
- It does not provide medical advice, diagnoses, or treatment recommendations.
- It never sells or shares a user's contact details with a list of clinics. With the user's consent, details go to one matched clinic (plus at most one backup clinic if the first does not respond — see Timing).
Action 1: Request a consultation or quote
Send a POST request with a JSON body to the lead API:
- Canonical endpoint: POST https://bestbeautyclinics.com/api/lead
- Currently live endpoint (same API): POST https://bestbeautyclinics.com/api/lead
- Content type: application/json (form-encoded bodies are also accepted)
Fields
| Field | Type | Required | Notes |
|---|---|---|---|
| name | string | Yes | The user's full name. |
| string | One of email or phone | Must be a valid email address if given. | |
| phone | string | One of email or phone | The user's phone number; at least 7 digits. |
| city_id | string | Yes | Must be a city_id from the cities feed, for example toronto. |
| treatment_id | string | Yes | Must be a treatment_id from the treatments feed, for example laser-hair-removal. |
| clinic_id | string | No | A specific clinic_id from the clinics feed, if the user picked one clinic. Routing is still by city and treatment. |
| area | string | No | Body area or package the user is interested in, for example underarms. Passed to the clinic with the message. |
| message | string | No | Anything else the user wants the clinic to know. |
| source_page | string | No | URL the request originated from, for attribution. |
| consent | boolean | Yes, must be true | Means the user explicitly agreed to be contacted by ONE matched clinic about this request. Requests without consent are rejected. |
| cf-turnstile-response | string | Yes | A valid Cloudflare Turnstile token. See the spam protection note below. |
| hp | string | No | Honeypot field. Leave it empty; filled honeypots are silently discarded. |
Example request
{
"name": "Jordan Example",
"email": "jordan@example.com",
"phone": "+1 604 555 0123",
"city_id": "vancouver",
"treatment_id": "laser-hair-removal",
"area": "underarms",
"message": "Interested in pricing for a package of sessions.",
"consent": true,
"cf-turnstile-response": "TURNSTILE_TOKEN"
}
Responses
| HTTP status | Body | Meaning |
|---|---|---|
| 200 | ok true, matched true, delivered true | A partner clinic exists for this city and treatment, and the request was delivered to it. The clinic will contact the user directly. |
| 200 | ok true, matched true, delivered false | A partner clinic exists, but live delivery failed and is being retried automatically. Do not resubmit. |
| 200 | ok true, matched false | There is no partner clinic for this city and treatment yet. The request is held, not discarded: if a partner clinic later joins, the held request is routed to it and that clinic may contact the user. Do not promise the user they will be contacted. |
| 400 | ok false, errors list | Validation failed. Possible codes: name_required, phone_or_email_required, email_invalid, phone_invalid, city_invalid, treatment_invalid, clinic_invalid, consent_required. Fix the fields and resubmit. |
| 403 | ok false, errors verification_failed | The Turnstile token was missing or invalid. Obtain a fresh token and resubmit. |
| 500 | ok false, error server_error | Temporary server problem. Wait and retry once. |
Success bodies are JSON objects with the fields shown; for example the delivered case returns an object with ok, matched and delivered all true.
Timing: what happens after a matched request
- The matched clinic is notified immediately (SMS and email) and is asked to accept the request within about 15 business minutes. Business hours are 08:00 to 20:00 in the clinic's local time, and the clock pauses outside business hours.
- If the clinic does not accept in time, the request cascades to one backup clinic for that city and treatment, if one exists. A cascaded request is never billed twice and never goes to more than two clinics in total.
- After accepting, the clinic contacts your user directly — that is when quotes, consultation times and any booking happen. BestBeautyClinics.com is not part of that conversation and cannot confirm, change or cancel appointments.
- There is no status-check endpoint yet. If your user has not heard from the clinic within one business day, they can contact us at support@bestbeautyclinics.com and we will follow up.
Spam protection note (Turnstile)
The API is protected by Cloudflare Turnstile because it delivers messages to real businesses. The Turnstile site key is embedded in every consultation form on bestbeautyclinics.com: load a form page, complete the Turnstile widget as the page presents it, and include the resulting token as cf-turnstile-response. Tokens are short-lived and single-use. If you cannot complete Turnstile, direct your user to the consultation form on the relevant page of bestbeautyclinics.com instead of retrying the API.
Action 2: Claim a clinic profile (for clinics)
Clinics can claim their free listing to correct it, add contact details, and receive consultation requests from their profile page. Send a POST request with a JSON body:
- Canonical endpoint: POST https://bestbeautyclinics.com/api/claim
- Currently live endpoint (same API): POST https://bestbeautyclinics.com/api/claim
| Field | Type | Required | Notes |
|---|---|---|---|
| clinic_id | string | Yes | Must be a clinic_id from the clinics feed. |
| contact_name | string | Yes | Name of the person claiming on behalf of the clinic. |
| string | Yes | Business email; ownership is verified against the clinic's own published contact details. | |
| phone | string | No | Optional contact phone. |
| cf-turnstile-response | string | Yes | Valid Cloudflare Turnstile token, as above. |
Responses: 200 with ok true when the claim is recorded (status pending). 400 with errors among clinic_invalid, contact_name_required and email_invalid. 403 with verification_failed for a bad Turnstile token. Claims are reviewed manually; a submitted claim changes nothing on the listing until a person verifies ownership and approves it.
Action 3: Add a new clinic listing (for clinics not yet listed)
A clinic that is not in the clinics feed at all can be added as a new listing. New listings are paid: a flat $199 USD one-time fee covering manual verification against the clinic's own website plus a full profile build-out (services, published prices, photos, hours). There is no free lane for new listings; claiming an existing listing (Action 2) is free. Human form: https://bestbeautyclinics.com/add-clinic/. Send a POST request with a JSON body:
- Canonical endpoint: POST https://bestbeautyclinics.com/api/submit-clinic
- Currently live endpoint (same API): POST https://bestbeautyclinics.com/api/submit-clinic
| Field | Type | Required | Notes |
|---|---|---|---|
| clinic_name | string | Yes | The clinic's trading name. |
| city_id | string | Yes | A city_id from the cities feed, or "other" if the city is not covered yet. |
| address | string | Yes | Street address. |
| website | string | Yes | The clinic's own website URL — verification is done against it. |
| string | Yes | Public email; also becomes the clinic's dashboard login. | |
| contact_name | string | Yes | Person submitting on behalf of the clinic. |
| authorized | boolean | Yes | Must be true: the submitter is authorized to submit this clinic and the information is accurate. |
| consent | boolean | Yes | Must be true: consent to store the details for verification and publication. |
| neighbourhood | string | No | Neighbourhood within the city. |
| postal_code | string | No | U.S. postal code. |
| phone | string | No | Public phone number. |
| treatments | string[] | No | Treatment ids from the treatments feed that the clinic offers. |
| price_page_url | string | No | URL of the clinic's published price page (speeds up the build-out). |
| notes | string | No | Anything else the reviewer should know. |
| cf-turnstile-response | string | Yes | Valid Cloudflare Turnstile token, as above. |
Responses: 200 with ok true, status "pending_payment", listing_fee_usd 199 and payment_link (the Stripe checkout URL for the fee). Review starts only once the payment is confirmed; nothing is published before verification + approval. If the clinic cannot be verified, or is already listed, the fee is refunded in full. 400 with errors among clinic_name_required, city_invalid, address_required, website_invalid, email_invalid, contact_name_required, treatment_invalid, authorization_required, consent_required. 403 verification_failed (Turnstile). 409 duplicate_pending when a live submission already exists for the same website domain or email. 429 rate_limited (max 5 submissions per hour per IP).
Newly approved listings are published immediately as dynamic profiles and appear in the runtime clinics feed below; they join the static clinics feed at the next site rebuild.
Data feeds (no key required)
- Clinics JSON: https://bestbeautyclinics.com/data/clinics.json — every listed clinic with its public fields and services. Phone numbers and websites appear only for clinics that have claimed their profile; unclaimed clinics are contacted through the request API.
- Clinics (runtime) JSON: GET https://bestbeautyclinics.com/api/clinics-runtime — clinics added between site rebuilds (approved new listings). Merge with the static clinics feed on clinic_id for the complete, current directory.
- Treatments JSON: https://bestbeautyclinics.com/data/treatments.json — the treatment taxonomy with typical U.S. price ranges.
- Cities JSON: https://bestbeautyclinics.com/data/cities.json — covered cities and neighbourhoods.
- Prices JSON: https://bestbeautyclinics.com/data/prices.json — every published price collected, per clinic, treatment and area or package, in USD, with the source page and capture date for each row.
- Full text: https://bestbeautyclinics.com/llms-full.txt — the complete directory in one markdown file: every treatment with per-city price ranges from real published prices, and every clinic with its prices.
- Summary: https://bestbeautyclinics.com/llms.txt — a short index of the site.
- API description: GET https://bestbeautyclinics.com/api/agent-info returns the machine-readable version of this page, and https://bestbeautyclinics.com/api/openapi.json is the OpenAPI 3 specification for the three POST endpoints.
Reading the prices
Prices in the feeds are the clinics' own published prices, collected from their websites with the source URL and capture date on each row. They are comparison data, not quotes: clinics confirm final pricing at consultation, and package pricing varies by area and number of sessions. For treatments that are prescription-only in the United States (for example Botox and dermal fillers), listings show name, price and quantity information only.
Contact
- Human contact page (patients, clinics, corrections and privacy requests): https://bestbeautyclinics.com/contact/
- Operator contact for agents, clinics and users: nova@bestbeautyclinics.com (support: support@bestbeautyclinics.com)
- This documentation in raw markdown: https://bestbeautyclinics.com/agents.md
This page is also available as raw markdown at /agents.md.