{
  "openapi": "3.0.1",
  "info": {
    "title": "MEDICA & Messe Düsseldorf Exhibitor Scraper",
    "description": "From $1 per 1,000 exhibitors. Scrape the exhibitor directory of MEDICA, COMPAMED, K, ProWein, interpack, drupa, EuroShop, A+A, boot, glasstec and 7 more Messe Düsseldorf fairs. Filter by product category, hall, country, event or keyword. Optional phone, website, street address and named contacts.",
    "version": "0.1",
    "x-build-id": "1kPkfA4VvLVvdOaFi"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapersdelight~medica-exhibitors-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapersdelight-medica-exhibitors-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/scrapersdelight~medica-exhibitors-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapersdelight-medica-exhibitors-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/scrapersdelight~medica-exhibitors-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapersdelight-medica-exhibitors-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "fair": {
            "title": "Trade fair",
            "enum": [
              "www.medica-tradefair.com",
              "www.compamed-tradefair.com",
              "www.k-online.com",
              "www.prowein.com",
              "www.interpack.com",
              "www.wire-tradefair.com",
              "www.tube-tradefair.com",
              "www.aplusa-online.com",
              "www.gifa.de",
              "www.euroshop-tradefair.com",
              "www.drupa.com",
              "www.boot.de",
              "www.glasstec.de",
              "www.caravan-salon.de",
              "www.valveworldexpo.com",
              "www.eurocis-tradefair.com",
              "www.beauty.de"
            ],
            "type": "string",
            "description": "Which Messe Düsseldorf exhibitor directory to scrape. Each entry is a fair hostname that was probed live and answered with a real exhibitor list. MEDICA and COMPAMED share one directory (as do wire/Tube, interpack/components and the four GMTN fairs) — pick either and use 'Events' to split them.",
            "default": "www.medica-tradefair.com"
          },
          "customFairDomain": {
            "title": "Custom fair hostname (overrides the picker)",
            "type": "string",
            "description": "The hostname of a Messe Düsseldorf fair that is not in the list above, e.g. a new edition launched after this Actor was published. Type the bare host, such as www.medica-tradefair.com. It is validated against the platform before anything is scraped; a hostname the platform does not know stops the run with its own error rather than returning the wrong fair. Leave empty to use the picker."
          },
          "startUrls": {
            "title": "Start URLs (optional)",
            "type": "array",
            "description": "Paste URLs from a fair's own exhibitor finder. A search URL carries its filters and keyword into this run (…/search?f_country=DE&_query=endoscope). An exhibitor profile URL (…/exhprofiles/<id>) scrapes just that company. A directory letter URL is treated as the whole directory. The URL's host also selects the fair, overriding the picker above.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "searchTerms": {
            "title": "Keywords",
            "type": "array",
            "description": "Full-text search over exhibitor profiles and their products — measured on MEDICA 2026: \"dialysis\" 8 exhibitors, \"endoscope\" 15, \"sterile packaging\" 16, \"ultrasound\" 44. Each keyword is crawled as its own query and results are de-duplicated, so overlapping keywords are never billed twice.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "productCategories": {
            "title": "Product categories",
            "type": "array",
            "description": "The fair's own product-category tree — the filter a distributor actually wants. Give the category NAME (\"Laboratory, IVD & Diagnostics\") or its id (\"medica2026.01.02\"); names are matched against the live tree, shallowest match first. MEDICA 2026 publishes 68 categories over 3 levels, e.g. Laboratory, IVD & Diagnostics = 515 exhibitors of 3,576. Names are resolved before the crawl and an unmatched name stops the run — it never falls back to the whole fair. Every fair has its own tree; the live list for the fair you picked is written to this run's key-value store as FAIR_FACETS.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "countries": {
            "title": "Countries / regions",
            "type": "array",
            "description": "ISO-2 code (\"DE\", \"CN\") or country name (\"Germany\"). Several values are OR-ed together. Measured on MEDICA 2026: Germany 644, China 688, France 144.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "halls": {
            "title": "Halls",
            "type": "array",
            "description": "Hall id (\"01\", \"08B\") or hall label (\"Hall 1\"). Several values are OR-ed. Useful for planning a walk of the fair or for targeting a country pavilion. MEDICA 2026 has 18 hall areas; Hall 1 holds 245 exhibitors.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "eventIds": {
            "title": "Events (for shared directories)",
            "type": "array",
            "description": "Some directories carry two or more fairs at once. Use this to split them: on the MEDICA/COMPAMED directory \"MEDICA 2026\" is 2,842 exhibitors and \"COMPAMED 2026\" is 734. Give the event name or its id (medica2026, compamed2026, wire2026, tube2026, interpack2026, components2026, GMTN2023.gifa …). Leave empty to get every event in the directory.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "exhibitorCriteria": {
            "title": "Exhibitor criteria",
            "type": "array",
            "description": "The self-declared company-type tags a fair offers, e.g. Manufacturer, OEM, Service on MEDICA (477 / 193 / 191 exhibitors on 2026-09-08; the counts move as exhibitors register). Give the label or the tag id. The tag vocabulary differs per fair — see FAIR_FACETS in this run's key-value store.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "extraFilters": {
            "title": "Other filters (advanced)",
            "type": "array",
            "description": "Filters only some fairs publish, written as facet=value. ProWein adds f_sales (sales channel) and f_industry; K and drupa add f_targrp (target group); EuroShop adds f_itag. Values are validated against the fair's live facet list where it exposes one; where it does not, the filter is passed through and the run log says so rather than pretending it was checked.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "sortBy": {
            "title": "Sort",
            "enum": [
              "alpha_asc",
              "alpha_desc",
              "date_desc",
              "date_asc",
              "location_asc",
              "score_desc"
            ],
            "type": "string",
            "description": "Server-side ordering. A-Z is the stable default and is what a directory export should look like. 'Newest registered first' surfaces the companies that signed up most recently — the trigger a sales team wants. Note the sort decides WHICH rows you get when 'Maximum exhibitors' cuts the sweep short.",
            "default": "alpha_asc"
          },
          "maxItems": {
            "title": "Maximum exhibitors",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Hard cap on rows delivered and billed across the whole run. Set 0 for no limit — the biggest single directory held 3,576 exhibitors on 2026-09-07, and all 15 directories together held 28,698. The default of 250 exists so an accidental run cannot bill a full sweep; raise it deliberately.",
            "default": 250
          },
          "startOffset": {
            "title": "Skip the first N exhibitors",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Start the sweep at this offset instead of the beginning — use it to resume a big export in slices without re-billing the rows you already have. Keep the sort the same between slices or the slices will overlap.",
            "default": 0
          },
          "includeDetail": {
            "title": "Fetch full detail (phone, website, street address)",
            "type": "boolean",
            "description": "One extra request per exhibitor for the company's phone number, website, full street address, profile description, product list and brands. Measured fill on MEDICA 2026 (n=30): phone 100%, street 100%, city 100%, postcode 97%, website 90%, description 40%. On fairs that have already taken place the descriptions are far fuller (K 2025: description 90%, products 87%). Billed as a separate event, so a listing-only run never pays for it.",
            "default": false
          },
          "includeContactPersons": {
            "title": "Include contact persons (named individuals)",
            "type": "boolean",
            "description": "Adds the named staff an exhibitor chose to publish on its own profile: name, job title, phone and LinkedIn URL. Measured coverage: MEDICA 2026 40% of exhibitors (23 people across 30), K 2025 63% (47 people across 30). These are identifiable natural persons, mostly in the EU — you are responsible for having a lawful basis to process them. Off by default and billed per person. Needs 'Fetch full detail', which is switched on automatically if you enable this.",
            "default": false
          },
          "descriptionFormat": {
            "title": "Company description format",
            "enum": [
              "text",
              "html",
              "both"
            ],
            "type": "string",
            "description": "The profile description is stored as HTML. 'Plain text' converts it for spreadsheets and LLM pipelines; 'HTML' keeps the original markup; 'Both' emits both columns. Only applies when 'Fetch full detail' is on.",
            "default": "text"
          },
          "includeRawPayload": {
            "title": "Include the raw source payload",
            "type": "boolean",
            "description": "Adds the untouched listing document and the exhibitor's schema.org JSON-LD to each row, for anyone who wants a field this Actor does not map.",
            "default": false
          },
          "deduplicateById": {
            "title": "De-duplicate by exhibitor id",
            "type": "boolean",
            "description": "Keeps one row per company across overlapping keywords, categories and filters. De-duplication runs BEFORE billing, so a company matched by three of your keywords is delivered once and charged once. Turn it off only if you want to see every match separately.",
            "default": true
          },
          "language": {
            "title": "Language",
            "enum": [
              "en",
              "de"
            ],
            "type": "string",
            "description": "Which language the fair should answer in. It changes country names, hall labels, category names and the profile description — the German edition of a profile is often written by the exhibitor separately from the English one.",
            "default": "en"
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Apify's automatic (datacenter) proxy is enough: 297 of 300 detail calls succeeded first try at 13 requests/second, with the 3 misses recovered by retry. Residential also works and is not needed. You may plug in your own proxies here.",
            "default": {
              "useApifyProxy": true
            }
          },
          "maxConcurrency": {
            "title": "Maximum concurrency",
            "minimum": 1,
            "maximum": 15,
            "type": "integer",
            "description": "Parallel requests. 10 measured 13 requests/second with no rate-limiting. The platform does rate-limit a single address pushed hard; if you supply your own single-IP proxy, lower this.",
            "default": 10
          },
          "requestTimeoutSecs": {
            "title": "Request timeout",
            "minimum": 5,
            "maximum": 300,
            "type": "integer",
            "description": "Per-request timeout. Median response measured at 622 ms, 95th percentile 1.24 s.",
            "default": 45
          },
          "maxRequestRetries": {
            "title": "Maximum retries per request",
            "minimum": 0,
            "maximum": 8,
            "type": "integer",
            "description": "Retries for connection resets, HTTP 429 (the Retry-After header is honoured) and 5xx. A 404 or other 4xx is a real answer and is not retried.",
            "default": 3
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}