# Doctoralia Scraper (`solidcode/doctoralia-scraper`) Actor

\[💰 $30 / 1K doctors · $1.50 / 1K reviews] Extract doctors from Doctoralia across 11 countries — names, specialties, addresses, phones, GPS, ratings, services, prices, and patient reviews. Search by city and specialty, or paste profile URLs.

- **URL**: https://apify.com/solidcode/doctoralia-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Features:** Limited permissions
- **Stats:** 16 total users, 2 monthly users, 97.2% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $30.00 / 1,000 doctor profiles

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Doctoralia Scraper

Turn any Doctoralia specialty-and-city page into a structured dataset: doctor names and specialties, each clinic they practise at — with coordinates, phone numbers and postal codes wherever the practice publishes them — the services each clinic charges for and what it charges, star ratings, next-available appointment slots, and the complete text of every patient opinion you collect, across 11 localized country sites. Built for healthcare marketers, medical recruiters, and clinic intelligence teams who need thousands of provider records without opening profiles one at a time.

### Why This Scraper?

- **11 localized country sites, one dropdown** — Spain, Brazil, Mexico, Argentina, Chile, Peru, Colombia, plus the same network under its local brands: MioDottore (Italy), ZnanyLekarz (Poland), DoktorTakvimi (Turkey), ZnamyLekar (Czech Republic).
- **Prices attributed to the clinic that charges them** — a Milan gynaecologist bills `ecografia ostetrica` at €220 at her city-centre clinic and €150 at her suburban one, and you get both rows, each carrying the `addressId` of the clinic it belongs to. Across a 19,516-service benchmark, 58% of services came back with a numeric price and 22% with the price label exactly as the clinic prints it.
- **Complete patient opinions, not review counts** — author handle, 1–5 star rating, ISO 8601 publish date and full review body on **100% of 7,564 benchmark reviews**, capped exactly at your per-doctor limit.
- **Clinic geolocation you can map** — latitude and longitude on 81% of 1,809 benchmark clinic addresses, with postal code on 74% and a direct phone number on 78%, ready to join to territory or CRM data.
- **Booking signals on 93% of doctors** — the soonest open appointment as an ISO 8601 timestamp plus a calendar flag, so you can separate providers actively taking patients from dormant listings.
- **Headline reputation on 99.9% of doctors** — the aggregate star average and lifetime opinion total, alongside how many opinions this run actually pulled, so you always know your sample size.
- **Two record types, already split for you** — one `doctor` row per professional and one `review` row per opinion, joined by `doctorId`, shown as separate Doctors and Patient reviews tabs and exportable independently.
- **Paste a URL or search structurally** — drop in any profile or results URL from any of the 11 sites, or search by country, city and specialty. If the specialty word does not exist on the country you chose, the run tells you the exact address that came back empty instead of finishing silently with nothing.
- **Multi-clinic doctors come back whole** — a doctor practising at six addresses returns six location entries with their own postal codes, phones and availability, not just the primary one.

### Use Cases

**Healthcare Lead Generation**

- Build specialty-and-city outreach lists with clinic phone numbers and postal addresses
- Plot clinic coordinates to plan field-sales territories and route reps efficiently
- Target providers who already sell specific paid services in a chosen price band
- Prioritise doctors with near-term open appointments — the ones actively taking patients

**Market & Competitive Research**

- Benchmark what a procedure costs across cities, clinics and countries
- Measure provider density for a specialty in any metro across 11 markets
- Track which clinics offer online booking and online payment
- Compare Spanish, Italian, Brazilian and Polish markets on one consistent schema

**Reputation & Review Monitoring**

- Pull full opinion text for sentiment and theme analysis on a doctor or specialty
- Track a provider's star average and opinion volume over time
- Surface recurring complaints by filtering reviews to 1- and 2-star ratings
- Collect dated testimonials with star ratings for marketing collateral

**Healthcare Recruitment**

- Source specialists by specialty, city and country site
- Read a candidate's public rating and patient feedback before first contact
- Map where target specialists practise across multiple clinics and cities

### Getting Started

#### Search by Country, City, and Specialty

The simplest run — dentists in Madrid:

```json
{
    "country": "es",
    "city": "Madrid",
    "specialty": "dentista",
    "maxResults": 50
}
```

Write the specialty the way that country's site writes it: `dentista` in Spain, `ginecologo` in Italy, `cardiologista` in Brazil.

#### Doctors Without Reviews (Lighter, Cheaper)

Skip opinion collection when you only need provider and clinic details:

```json
{
    "country": "it",
    "city": "Milano",
    "specialty": "Ginecologo",
    "includeReviews": false,
    "maxResults": 100
}
```

#### Paste Doctoralia URLs Directly

Mix individual profiles and already-filtered results pages from any country site:

```json
{
    "startUrls": [
        "https://www.doctoralia.es/barbara-lizaur-ajuria/dentista/madrid",
        "https://www.miodottore.it/cardiologo/roma"
    ],
    "maxReviewsPerDoctor": 30
}
```

#### Full-Featured Example

```json
{
    "country": "br",
    "city": "São Paulo",
    "specialty": "Cardiologista",
    "maxResults": 200,
    "includeReviews": true,
    "maxReviewsPerDoctor": 50
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `startUrls` | string\[] | `[]` | Paste Doctoralia doctor profile or search-results URLs. The most direct way to get exactly the doctors you want. Clinic pages are skipped — they describe the centre, not the doctors in it. Leave empty to use the search options below. |
| `country` | select | `Spain` | Which country site to search: Spain, Brazil, Mexico, Argentina, Chile, Peru, Colombia, Italy, Poland, Turkey, or Czech Republic. Used with City and Specialty; ignored when you paste URLs. |
| `city` | string | `""` | City or area within the chosen country, e.g. "Madrid", "São Paulo". Leave empty to search the whole country. |
| `specialty` | string | `""` | Medical specialty, written the way the chosen country's site writes it, e.g. "dentista" in Spain, "cardiologista" in Brazil, "ginecologo" in Italy. Leave empty to include all specialties. |

#### Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `maxResults` | integer | `100` | Maximum doctors to collect. Set to 0 for no limit. Keep a limit to control cost. |
| `includeReviews` | boolean | `true` | Collect each doctor's patient opinions. Turn off for faster, cheaper runs when you only need provider and clinic details. |
| `maxReviewsPerDoctor` | integer | `20` | Maximum opinions per doctor. Set to 0 to collect all available, up to a safety maximum of 5,000 per doctor. Popular doctors carry hundreds — a limit keeps runs fast and affordable. |

### Output

The dataset holds two kinds of rows, marked by `recordType`: one **doctor** row per professional, followed by one **review** row for each opinion collected for that doctor. They share `doctorId`, so you can keep them together or export each tab on its own.

The **Filled** column below is measured on a benchmark of 850 doctors, 1,809 clinic addresses, 19,516 services and 7,564 reviews across seven country sites. A field below 100% is absent because the clinic or doctor did not publish it, not because it was missed.

#### Doctor Records

```json
{
    "recordType": "doctor",
    "doctorId": "608709",
    "fullName": "Dott.ssa Federica Baltaro",
    "title": "Dott.ssa",
    "profileUrl": "https://www.miodottore.it/profilo/federica-baltaro",
    "specialties": [
        { "id": 28, "name": "ginecologo" }
    ],
    "rating": 5,
    "opinionsTotal": 38,
    "reviewsCollected": 10,
    "locations": [
        {
            "clinicName": "WELCOMED-GEPO",
            "addressStreet": "F. Burlamacchi 1/A",
            "city": "Milano",
            "province": "MI",
            "postalCode": "20135",
            "phone": "335 198 2363",
            "latitude": 45.4507294,
            "longitude": 9.2055302,
            "onlinePayment": false,
            "isOnlineOnly": false,
            "nextAvailable": "2026-09-14T18:30:00+02:00",
            "addressId": "1023168"
        },
        {
            "clinicName": "Centro Polisalute",
            "addressStreet": "Via E. de Amicis 67",
            "city": "Cinisello Balsamo",
            "province": "MI",
            "postalCode": "20092",
            "phone": "02 3670 4424",
            "latitude": 45.5645409,
            "longitude": 9.2269869,
            "onlinePayment": false,
            "isOnlineOnly": false,
            "nextAvailable": "2026-10-15T16:30:00+02:00",
            "addressId": "1044925"
        }
    ],
    "services": [
        {
            "name": "ecografia ostetrica",
            "description": "Esclusa ecografia morfologica e ecografia con traslucenza nucale",
            "price": 220,
            "priceText": "220 €",
            "isFromPrice": false,
            "addressId": "1023168"
        },
        {
            "name": "ecografia ostetrica",
            "description": "Ecografia Ostetrica",
            "price": 150,
            "priceText": "150 €",
            "isFromPrice": false,
            "addressId": "1044925"
        }
    ],
    "insurances": ["Faschim", "Fasdac", "Previmedical", "Allianz"],
    "hasCalendar": true,
    "nextAvailable": "2026-09-14T18:30:00+02:00",
    "country": "it",
    "scrapedAt": "2026-09-11T21:47:46.179857+00:00"
}
```

A real row, shortened for the page: this doctor actually returned 21 services and 17 insurance names, plus 10 separate review rows. Note the same service, `ecografia ostetrica`, priced €220 and €150 at two different `addressId` values.

##### Core Fields

| Field | Type | Filled | Description |
|-------|------|--------|-------------|
| `recordType` | string | 100% | Always `"doctor"` for these rows |
| `doctorId` | string | 100% | Stable Doctoralia doctor identifier; joins to the review rows |
| `fullName` | string | 100% | Doctor's full display name |
| `profileUrl` | string | 100% | Canonical doctor profile URL |
| `specialties` | object\[] | 100% | Every specialty as `{ id, name }` — the numeric id is stable across languages |
| `title` | string | 93% | Professional title or prefix, e.g. "Dr.", "Dra.", "Dott.ssa". Spanish profiles often publish none (69% there) |
| `country` | string | 100% | Country site the record came from |
| `scrapedAt` | string | 100% | ISO 8601 timestamp of collection |

##### Ratings & Availability

| Field | Type | Filled | Description |
|-------|------|--------|-------------|
| `rating` | number | 99.9% | Average star rating. `0` means the doctor has no opinions yet, not a zero-star review — check `opinionsTotal` alongside it |
| `opinionsTotal` | number | 99.9% | Lifetime opinions on file, including ones this run did not collect |
| `reviewsCollected` | number | 100% | How many opinion rows this run produced for the doctor |
| `hasCalendar` | boolean | 100% | Whether the doctor offers online booking |
| `nextAvailable` | string | 93% | Soonest open appointment, ISO 8601. Highest in Brazil, Poland and Turkey (100%), lowest in Colombia (55%) |

##### Practice Data

| Field | Type | Filled | Description |
|-------|------|--------|-------------|
| `locations` | object\[] | 100% | One entry per clinic the doctor practises at — fields below |
| `services` | object\[] | 100% | Everything the doctor lists as a bookable service — fields below |
| `insurances` | string\[] | 13% | Accepted insurer names. A minority of doctors publish these anywhere (Spain highest at 28%), and Polish profiles publish none at all — treat it as a bonus field, not a filter |

##### `locations[]` — one entry per clinic

| Field | Type | Filled | Description |
|-------|------|--------|-------------|
| `addressId` | string | 100% | Clinic identifier; matches `services[].addressId` |
| `clinicName` | string | 99% | Name of the practice or medical centre |
| `onlinePayment` | boolean | 97% | Whether the clinic accepts payment online |
| `isOnlineOnly` | boolean | 97% | True for remote-consultation entries with no physical address |
| `addressStreet` | string | 83% | Street and number |
| `latitude` / `longitude` | number | 81% | Exact clinic coordinates. Highest in Turkey (99%) and Italy (90%), lowest in Poland (72%) |
| `phone` | string | 78% | Direct clinic phone number |
| `city` | string | 78% | Clinic city |
| `postalCode` | string | 74% | Clinic postal code where the practice publishes one |
| `nextAvailable` | string | 70% | Soonest open slot at this specific clinic, ISO 8601 |
| `province` | string | 68% | Province or region. The Turkish site publishes no province field at all, so this is always empty there |

##### `services[]` — what each clinic charges for

| Field | Type | Filled | Description |
|-------|------|--------|-------------|
| `name` | string | 100% | Service name as the clinic lists it |
| `addressId` | string | 91% | The clinic this price belongs to; matches `locations[].addressId`. The Turkish site does not publish a per-clinic service breakdown (23% there) |
| `isFromPrice` | boolean | 87% | True when the price is a starting-from estimate rather than a fixed fee |
| `price` | number | 58% | Numeric price when the clinic publishes one. Highest in Poland (96%) and Italy (91%); Turkish clinics publish essentially no service prices and show a "request the price" prompt instead |
| `description` | string | 23% | The clinic's own description of the service |
| `priceText` | string | 22% | The price label exactly as printed, e.g. `"220 €"`, `"Desde 149 €"`, `"R$ 180"`, `"Od 1 000 zł"`. This is the only field that carries a currency symbol, and 89% of the labels include one |

#### Review Records

```json
{
    "recordType": "review",
    "doctorId": "608709",
    "doctorName": "Dott.ssa Federica Baltaro",
    "reviewId": "4221703",
    "authorName": "FIORELLA",
    "rating": 5,
    "datePublished": "2026-09-11T17:42:16+02:00",
    "body": "La dott.ssa Baltaro ha seguito entrambe le mie gravidanze, mi sono trovata benissimo. È una professionista completa sia umanamente che professionalmente.",
    "isAnonymous": false,
    "country": "it",
    "scrapedAt": "2026-09-11T21:47:46.179857+00:00"
}
```

A real row; the body is shortened here, and the dataset carries the complete text.

| Field | Type | Filled | Description |
|-------|------|--------|-------------|
| `recordType` | string | 100% | Always `"review"` for these rows |
| `doctorId` | string | 100% | Identifier of the doctor this opinion belongs to — join key back to the doctor row |
| `doctorName` | string | 100% | Name of the reviewed doctor, repeated so review exports stand alone |
| `reviewId` | string | 100% | Stable opinion identifier, useful for de-duplicating across repeat runs |
| `authorName` | string | 100% | The handle the patient published under — a first name, initials such as `J.F.P.N`, or the site's own deleted-account placeholder |
| `rating` | number | 100% | Star rating, 1–5 |
| `datePublished` | string | 100% | When the opinion was posted, ISO 8601. The newest opinions carry a full timestamp with UTC offset and older ones a `YYYY-MM-DD` date — both parse with any date library |
| `body` | string | 100% | Complete opinion text |
| `isAnonymous` | boolean | 100% | True when the author published under initials or a placeholder rather than a name — about 22% of opinions |
| `country` | string | 100% | Country site the opinion came from |
| `scrapedAt` | string | 100% | ISO 8601 timestamp of collection |

### Tips for Best Results

- **Use the word for the professional, not the word for the field** — this is the single biggest cause of an empty run. `dermatologo` lists dermatologists; `dermatologia` sends you to the clinic directory instead, which holds almost no individual doctors. The same holds for `odontologia` versus `dentista` and `ginecologia` versus `ginecologo`. When a run reports a redirected page, this is usually why.
- **Write the specialty in the site's own language** — an English word on a Spanish or Italian site finds nothing at all. Use "Cardiologo" in Italy, "Cardiologista" in Brazil, "Cardiólogo" in Spain. When in doubt, browse to the results page yourself and paste that URL.
- **Start with 25–50 doctors** to confirm your city and specialty return the providers you expect, then scale the same input up.
- **Cap opinions with `maxReviewsPerDoctor`** — 10 to 20 is plenty for sentiment sampling and keeps runs fast and affordable. Set it to 0 only when you genuinely need every opinion on file.
- **Switch `includeReviews` off for pure lead lists** — when you only need names, specialties, addresses and phone numbers, runs get noticeably leaner and cheaper.
- **Join services to clinics with `addressId`** — the same procedure often carries different prices at a doctor's different addresses, and `addressId` is what tells you which price applies where.
- **Expect country differences before you build a filter on them** — Turkish clinics publish no service prices and no province; Polish profiles list no insurers; Colombian listings carry thinner availability and contact data than Spanish or Italian ones. Sample one country before committing a pipeline to a field.

### Pricing

**From $30.00 per 1,000 doctor profiles and $1.50 per 1,000 patient opinions at Gold rates.** Two separate charges keep this fair: a doctor profile is a large record with clinics, coordinates, services and prices, while an opinion is a single short row — and each doctor can carry hundreds of them. You pay the doctor rate once per professional and the opinion rate only for the opinions you chose to collect. Bronze, Silver and Gold subscribers pay progressively less on both.

#### Doctor Profiles

| Doctor profiles | No discount | Bronze | Silver | Gold |
|-----------------|-------------|--------|--------|------|
| 100 | $3.60 | $3.40 | $3.20 | $3.00 |
| 1,000 | $36.00 | $34.00 | $32.00 | $30.00 |
| 10,000 | $360.00 | $340.00 | $320.00 | $300.00 |
| 100,000 | $3,600.00 | $3,400.00 | $3,200.00 | $3,000.00 |

#### Patient Opinions

| Opinions | No discount | Bronze | Silver | Gold |
|----------|-------------|--------|--------|------|
| 100 | $0.18 | $0.17 | $0.16 | $0.15 |
| 1,000 | $1.80 | $1.70 | $1.60 | $1.50 |
| 10,000 | $18.00 | $17.00 | $16.00 | $15.00 |
| 100,000 | $180.00 | $170.00 | $160.00 | $150.00 |

**Worked example:** 100 doctors with 20 opinions each at Gold rates is 100 × $0.030 plus 2,000 × $0.0015 = **$3.00 + $3.00 = $6.00**, plus a small fixed per-run start fee.

No compute or time-based charges — you pay per result. Use `includeReviews` and `maxReviewsPerDoctor` to put the opinion half of that bill exactly where you want it.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This actor is designed for legitimate market research, recruitment, and reputation-monitoring use. The data includes information about named medical professionals and patient opinions — treat it as personal data. You are responsible for complying with applicable laws (including GDPR and other privacy regulations), the relevant Doctoralia site's Terms of Service, and any restrictions on processing health-related or personal data. Do not use extracted data for spam, harassment, or any unlawful purpose, and honor individuals' privacy and data-subject rights.

# Actor input Schema

## `startUrls` (type: `array`):

Paste one or more Doctoralia URLs — doctor profiles or search-results pages. This is the quickest way to get exactly the doctors you want. Clinic pages (the page for a medical centre itself) are skipped: they describe the clinic, not the doctors who work there, so there is nothing to collect from one. Leave empty to use the search options below instead.

## `country` (type: `string`):

Which Doctoralia country site to search. Only used with the City and Specialty search below — ignored when you paste URLs.

## `city` (type: `string`):

City or area to search within the chosen country, for example 'Madrid' or 'São Paulo'. Leave empty to search the whole country.

## `specialty` (type: `string`):

Medical specialty, written the way the chosen country's site writes it - for example 'dentista' in Spain, 'cardiologista' in Brazil, 'ginecologo' in Italy. An English word on a Spanish or Italian site finds nothing. Leave empty to include all specialties.

## `maxResults` (type: `integer`):

Maximum number of doctors to collect. Set to 0 for no limit. We recommend keeping a limit to control cost.

## `includeReviews` (type: `boolean`):

Collect each doctor's patient opinions (reviews). Turn this off for faster, cheaper runs when you only need doctor and clinic details.

## `maxReviewsPerDoctor` (type: `integer`):

Maximum number of patient reviews to collect for each doctor. Set to 0 to collect all available reviews, up to a safety maximum of 5,000 per doctor. Popular doctors can have hundreds of reviews — a limit keeps runs fast and affordable. Only applies when 'Include Patient Reviews' is on.

## Actor input object example

```json
{
  "startUrls": [],
  "country": "es",
  "city": "",
  "specialty": "",
  "maxResults": 100,
  "includeReviews": true,
  "maxReviewsPerDoctor": 20
}
```

# Actor output Schema

## `doctors` (type: `string`):

Table of scraped doctors with key fields.

## `reviews` (type: `string`):

Table of patient reviews collected for the doctors.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [],
    "country": "es",
    "city": "",
    "specialty": "",
    "maxResults": 100,
    "includeReviews": true,
    "maxReviewsPerDoctor": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/doctoralia-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [],
    "country": "es",
    "city": "",
    "specialty": "",
    "maxResults": 100,
    "includeReviews": True,
    "maxReviewsPerDoctor": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/doctoralia-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [],
  "country": "es",
  "city": "",
  "specialty": "",
  "maxResults": 100,
  "includeReviews": true,
  "maxReviewsPerDoctor": 20
}' |
apify call solidcode/doctoralia-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,solidcode/doctoralia-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/tYmwbx5MeFmaxtKld/builds/Nbfg0sxAZqL4O6QB1/openapi.json
