# The Knot Wedding Vendor Scraper (`parseforge/theknot-scraper`) Actor

Extract wedding vendors from The Knot marketplace: name, category, pricing tiers, ratings, reviews, awards history, contact details, location, services, and image galleries across 25 vendor categories nationwide.

- **URL**: https://apify.com/parseforge/theknot-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** Lead generation, E-commerce, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

![ParseForge Banner](https://raw.githubusercontent.com/ParseForge/apify-assets/main/banner.jpg)

## 💍 The Knot Wedding Vendor Scraper

> 🚀 **Pull wedding vendors from The Knot marketplace in seconds.** Photographers, florists, venues, caterers, planners, DJs, and 19 more vendor categories. Per-vendor pricing, star ratings, review counts, awards, contact info, and image galleries. No API key, no registration, no manual CSV wrangling.

> 🕒 **Last updated:** 2026-05-17 · **📊 41 fields** per record · **25 vendor categories** · **Nationwide US coverage** · **Pricing, ratings, awards, contact info**

The Knot is the largest wedding marketplace in the United States, indexing tens of thousands of vetted vendors across 25 categories. This Actor reads The Knot's marketplace listing pages directly and returns each vendor as a single flat record with every public field flattened into one row. It handles pagination automatically (30 listings per page, up to 333 pages per category and location), surfaces the listing-level data immediately, and optionally enriches every record by fetching the vendor's profile page to add phone, email, website, social handles, the full bio, and the full award history.

Each record carries the data couples and planners actually care about: name, category, city, state, service area, star rating, review count, price range, starting price band, Best of Weddings award status, premium tier, claimed status, business attributes (Woman-owned, Black-owned, Asian-owned, LGBTQ-owned, Veteran-owned), photo and video styles, services offered, contact info, social links, and the full image gallery. Vendors that opt to publish their physical address get `address` and `postalCode` populated; the rest expose `city`, `state`, and `serviceArea` only. Errors are pushed as rows with an `error` column so a single bad URL never breaks the run.

| 🎯 Target Audience | 🛠 Primary Use Cases |
|---|---|
| Wedding planners and event coordinators | Vendor shortlists by city, budget band, and review threshold |
| Event-planning SaaS and marketplaces | Power a vendor directory with rich profile cards |
| Local vendor marketing platforms | Lead-gen lists by category, city, and tier |
| Wedding bloggers and YouTubers | Roundups of top-rated vendors with images |
| Marriage and demographics researchers | Pricing-band distributions across markets |
| Local SEO and listing-quality teams | Audit which competitors hold paid placements |

---

### 📋 What the The Knot Wedding Vendor Scraper does

- 💒 **25 vendor categories.** Reception venues, photographers, videographers, florists, caterers, DJs, bands, planners, bakers, bridal salons, beauty, jewelers, officiants, photo booths, transportation, decor, rentals, invitations, favors, dance lessons, soloists and ensembles, bar services, hotel room blocks, rehearsal-dinner spaces, and travel specialists.
- 📍 **Any US city.** Paste any city + state marketplace URL (`/marketplace/wedding-photographers-new-york-ny`) or pick a category and location from dropdowns. The Actor walks every page of results, 30 listings at a time, until your `maxItems` cap or the last page.
- 💰 **Real prices and price bands.** When a vendor publishes a numeric range you get `priceMin` and `priceMax` in dollars. The Knot's quintile band (`$`, `$$`, `$$$`, `$$$$`, `$$$$$`) is also surfaced as `startingPriceRange` in human-readable form.
- 🏆 **Award history.** Every Best of Weddings year a vendor has won is in `awards`. Hall of Fame status is a separate boolean. This is the same award data couples filter on inside The Knot's UI.
- ☎️ **Contact info enrichment.** Flip the `includeDetails` switch and the Actor fetches each vendor's profile page to add phone, email, website, Facebook, Instagram, Pinterest, and Twitter handles plus the full bio and category-specific facets (photo styles, catering options, capacity ranges).
- ⭐ **Reviews and ratings.** Star rating to one decimal place and total review count come from the listing card and are populated for every published vendor.

Every record carries 41 fields: image URL, name, category slug, headline, full description, listing URL, vendor ID, profile ID, address, city, state, postal code, service area, star rating, review count, price min and max, starting price band, vendor tier, ad tier, claimed, paid, quick responder, Best of Weddings, Hall of Fame, awards array, business attributes, photo and video styles, services offered, phone, email, website, four social handles, photo count, video count, image gallery, and a `scrapedAt` timestamp. Errors get pushed with an `error` column so one bad input never stops the run.

> 💡 **Why it matters:** Wedding planning is a multi-billion-dollar local-services market where vendors compete on photos, reviews, and price bands. The Knot is the dominant directory. Pulling structured data out of it powers vendor shortlists, comparison sites, lead lists, market-rate research, and trend dashboards without screen-scraping HTML on your own.

---

### 🎬 Full Demo

🚧 Coming soon: a 3-minute walkthrough showing a single-city pull, multi-category batching, profile-page enrichment, and dropping the dataset into a Google Sheet for couples to filter.

---

### ⚙️ Input

<table>
<tr><th>Field</th><th>Type</th><th>Required</th><th>Description</th></tr>
<tr><td><code>startUrls</code></td><td>array of strings</td><td>No</td><td>One or more The Knot marketplace URLs. Paste category + city URLs (<code>/marketplace/wedding-photographers-new-york-ny</code>) or individual vendor profile URLs. Leave empty to use the structured inputs below.</td></tr>
<tr><td><code>maxItems</code></td><td>integer</td><td>No</td><td>Free plans cap at 10. Paid plans up to 1,000,000.</td></tr>
<tr><td><code>category</code></td><td>enum</td><td>No</td><td>Vendor category slug (25 options). Used with <code>city</code> + <code>stateCode</code> when <code>startUrls</code> is empty.</td></tr>
<tr><td><code>city</code></td><td>string</td><td>No</td><td>Lowercase hyphenated city (<code>new-york</code>, <code>los-angeles</code>, <code>chicago</code>).</td></tr>
<tr><td><code>stateCode</code></td><td>enum</td><td>No</td><td>Two-letter US state code (50 states + DC).</td></tr>
<tr><td><code>sort</code></td><td>enum</td><td>No</td><td><code>recommended</code> (default), <code>featured</code>, <code>popular</code>, <code>newest</code>, <code>rating</code>.</td></tr>
<tr><td><code>includeDetails</code></td><td>boolean</td><td>No</td><td>Visit every vendor's profile page to pull phone, email, website, socials, full bio, awards. Slower (one extra request per vendor) but much richer.</td></tr>
</table>

Example: top 25 wedding photographers in New York City, with profile-page enrichment so you get phone, email, and socials.

```json
{
  "startUrls": ["https://www.theknot.com/marketplace/wedding-photographers-new-york-ny"],
  "maxItems": 25,
  "sort": "recommended",
  "includeDetails": true
}
````

Example: structured search for highest-rated florists in Los Angeles, listing-only mode.

```json
{
  "category": "florists",
  "city": "los-angeles",
  "stateCode": "ca",
  "sort": "rating",
  "maxItems": 50,
  "includeDetails": false
}
```

> ⚠️ **Good to Know:** The Knot exposes physical addresses only for vendors that opt to publish them (typically venues and brick-and-mortar shops). Service-area vendors like photographers, DJs, and planners expose `city`, `state`, and `serviceArea` but leave `address` and `postalCode` empty. That is source behaviour, not a scraper bug. Price bands and review counts are populated for every published vendor.

***

### 📊 Output

Every record is one row in your dataset. Field set is identical across every category; only the relevant subset is populated per vendor (e.g. photo styles for photographers, capacity ranges for venues).

#### 🧾 Schema

| Field | Type | Example |
|---|---|---|
| 🖼️ `imageUrl` | string | `https://media-api.xogrp.com/images/3f31e926-417b-4d5c-af88-623092f6433d` |
| 🏷️ `name` | string | `Dreamlife Wedding Photo & Video` |
| 📂 `category` | string | `Wedding Photographers` |
| 🔖 `categorySlug` | string | `wedding-photographers` |
| 📝 `headline` | string | `Top Choice for Wedding Photography and Videography` |
| 📜 `description` | string | `Our team of professional photographers ...` |
| 🔗 `url` | string | `https://www.theknot.com/marketplace/dreamlife-wedding-photo-and-video-new-york-ny-841255` |
| 🆔 `vendorId` | string | `555cb900-744f-4b82-b88c-cc2c4741c2d0` |
| 🪪 `profileId` | string | `c2f5b7ea-82e1-4003-97b3-a41a00e7209d` |
| 🏠 `address` | string | `101 Ave of the Americas FL 9` |
| 🏙️ `city` | string | `New York` |
| 🗺️ `state` | string | `NY` |
| 📮 `postalCode` | string | `10013` |
| 📍 `serviceArea` | string | `Coast to Coast` |
| ⭐ `rating` | number | `4.9` |
| 💬 `reviewCount` | number | `187` |
| 💰 `priceMin` | number | `1590` |
| 💰 `priceMax` | number | `7150` |
| 💲 `startingPriceRange` | string | `$1,000-$1,999` |
| 🏷️ `vendorTier` | string | `PREMIUM` |
| 🥇 `adTier` | string | `PLATINUM` |
| ✅ `isClaimed` | boolean | `true` |
| 💳 `isPaid` | boolean | `true` |
| ⚡ `quickResponder` | boolean | `true` |
| 🏆 `isBestOfWeddings` | boolean | `true` |
| 👑 `isHallOfFame` | boolean | `true` |
| 🏅 `awards` | string array | `["BOW2024","BOW2025","BOW2026","BOWHOF"]` |
| 🌈 `businessAttributes` | string array | `["Woman-owned Business"]` |
| 🎨 `styles` | string array | `["Artistic","Classic","Documentary"]` |
| 🛠️ `services` | string array | `["Engagement","Digital Files","Drone"]` |
| 📞 `phone` | string | `(917) 388-2835` |
| 📧 `email` | string | `newyork@dreamlifeweddings.com` |
| 🌐 `website` | string | `http://www.dreamlifewedding.com` |
| 📘 `facebookUrl` | string | `https://www.facebook.com/dreamlifeweddingsusa` |
| 📷 `instagramUsername` | string | `dreamlifeweddingsusa` |
| 📌 `pinterestUsername` | string | `eivans` |
| 🐦 `twitterUsername` | string | `eivansinc` |
| 📸 `photoCount` | number | `151` |
| 🎬 `videoCount` | number | `3` |
| 🖼️ `images` | string array | gallery URLs |
| ⏱️ `scrapedAt` | datetime | `2026-05-17T21:27:25.663Z` |
| ⚠️ `error` | string | only present on failed records |

#### 📦 Sample records

<details>
<summary>Typical record: premium NYC photographer, Hall of Fame, Woman-owned</summary>

```json
{
  "imageUrl": "https://media-api.xogrp.com/images/3f31e926-417b-4d5c-af88-623092f6433d",
  "name": "Dreamlife Wedding Photo & Video",
  "category": "Wedding Photographers",
  "categorySlug": "wedding-photographers",
  "headline": "Top Choice for Wedding Photography and Videography",
  "url": "https://www.theknot.com/marketplace/dreamlife-wedding-photo-and-video-new-york-ny-841255",
  "city": "New York",
  "state": "NY",
  "serviceArea": "Coast to Coast",
  "rating": 4.9,
  "reviewCount": 187,
  "priceMin": 1590,
  "priceMax": 7150,
  "startingPriceRange": "$1,000-$1,999",
  "vendorTier": "PREMIUM",
  "adTier": "PLATINUM",
  "isBestOfWeddings": true,
  "isHallOfFame": true,
  "awards": ["BOW2011","BOW2012","BOW2013","BOW2016","BOW2018","BOW2019","BOW2020","BOW2021","BOW2022","BOW2024","BOW2025","BOW2026","BOWHOF"],
  "businessAttributes": ["Woman-owned Business"],
  "styles": ["Artistic","Classic","Documentary","Dramatic","Lifestyle","Modern","Vintage"],
  "phone": "(917) 388-2835",
  "email": "newyork@dreamlifeweddings.com",
  "website": "http://www.dreamlifewedding.com",
  "facebookUrl": "https://www.facebook.com/dreamlifeweddingsusa",
  "instagramUsername": "dreamlifeweddingsusa",
  "photoCount": 151,
  "videoCount": 3
}
```

</details>

<details>
<summary>Edge case: multi-location franchise with 2,696 reviews and full address</summary>

```json
{
  "name": "George Street Photo & Video",
  "category": "Wedding Photographers",
  "url": "https://www.theknot.com/marketplace/george-street-photo-and-video-new-york-ny-607697",
  "city": "New York",
  "state": "NY",
  "serviceArea": "NYC Metro Area",
  "rating": 4.3,
  "reviewCount": 2696,
  "priceMin": 1695,
  "priceMax": 4795,
  "startingPriceRange": "$1,000-$1,999",
  "vendorTier": "PREMIUM",
  "adTier": "PLATINUM",
  "isBestOfWeddings": false,
  "isHallOfFame": true,
  "awards": ["BOW2021","BOW2025","BOWHOF"],
  "businessAttributes": [],
  "services": ["Destination Wedding Packages","Bridal Portraits","Engagement","Digital Files","Film Photography"],
  "phone": "(866) 831-4103",
  "email": "info@georgestreetphoto.com",
  "facebookUrl": "https://www.facebook.com/pages/george-street-photo-video/56756024359",
  "instagramUsername": "georgestreetphoto",
  "pinterestUsername": "georgestreetpv",
  "photoCount": 87,
  "videoCount": 4
}
```

</details>

<details>
<summary>Sparse record: open-ended pricing, no upper bound, no business attributes</summary>

```json
{
  "name": "Eivan's Photo & Video",
  "category": "Wedding Photographers",
  "url": "https://www.theknot.com/marketplace/eivans-photo-and-video-manhattan-ny-892115",
  "city": "Manhattan",
  "state": "NY",
  "address": null,
  "postalCode": null,
  "rating": 4.7,
  "reviewCount": 246,
  "priceMin": 1249,
  "priceMax": null,
  "startingPriceRange": "$1,000-$1,999",
  "isBestOfWeddings": false,
  "isHallOfFame": true,
  "awards": ["BOW2008-09","BOW2011","BOW2012","BOW2013","BOW2015","BOW2025","BOWHOF"],
  "businessAttributes": [],
  "phone": "(708) 263-4349",
  "email": "nationwide@eivans.com",
  "instagramUsername": "eivans_inc",
  "pinterestUsername": "eivans",
  "twitterUsername": "eivansinc",
  "photoCount": 43,
  "videoCount": 8
}
```

</details>

***

### ✨ Why choose this Actor

| | Capability |
|---|---|
| 🗂️ | **All 25 vendor categories in one Actor.** Photographers, venues, florists, caterers, DJs, bands, planners, bakers, jewelers, officiants, decor, rentals, transportation, and more. No per-category code. |
| 💸 | **Real prices, not just ranges.** Numeric `priceMin` and `priceMax` in dollars when the vendor publishes a band, plus the human-readable `$`-tier label every record carries. |
| 🏆 | **Full award history.** Every Best of Weddings year a vendor has won, plus Hall of Fame status. Same data couples filter on inside The Knot's UI. |
| ☎️ | **Optional contact-info enrichment.** One toggle pulls phone, email, website, and four social handles from each vendor's profile page. |
| 📈 | **Pagination handled for you.** The Actor walks every page of results until `maxItems` is hit or the last page is reached. |
| 🛡️ | **Quiet on errors.** Failed pages get pushed as rows with an `error` column. One bad URL never stops the run. |
| 💼 | **Pay-per-event ready.** Charging mode auto-detected. Run on a fixed-rental plan or pay only for successful records. |

> 📊 The Knot is the largest wedding directory in the US and indexes vendors across all 50 states plus DC. NYC alone shows 313+ photographers; LA shows 247+ florists; mid-tier metros routinely list 50-200 vendors per category.

***

### 📈 How it compares to alternatives

| Approach | Cost | Coverage | Refresh | Filters | Setup |
|---|---|---|---|---|---|
| **⭐ The Knot Wedding Vendor Scraper** *(this Actor)* | Free tier + low pay-per-use | 25 categories, 50 states | On-demand or scheduled | Category, city, state, sort, awards | 30 seconds |
| Manual copy-paste from the site | Free but slow | Whatever you click | Manual | None | Hours per city |
| Paid lead-gen B2B platforms | $500-$5,000/month | Mixed | Periodic | Per-vendor account | Sales call required |
| Legacy community CSV dumps | Free | Outdated | Static | Whatever shipped | Hours of cleanup |
| Roll-your-own scraper | Engineering time | Whatever you build | Whatever you build | Whatever you code | Days to weeks |

Use the comparison as a rough heuristic. If your workflow needs current vendor data with one consistent schema across every category and city, this Actor is the fastest path.

***

### 🚀 How to use

1. 🔐 **Sign up.** Create a free Apify account at [console.apify.com/sign-up](https://console.apify.com/sign-up?fpr=vmoqkp). No credit card required for the free tier.
2. 🎯 **Pick a target.** Either paste a marketplace URL (e.g. `https://www.theknot.com/marketplace/florists-chicago-il`) or pick a category + city + state from the dropdowns.
3. ⚙️ **Tune the run.** Set `maxItems`, pick a sort order, and decide whether to flip on `includeDetails` for contact-info enrichment.
4. ▶️ **Click Run.** The Actor walks every page of results, pushes one row per vendor, and saves images and gallery URLs as arrays.
5. 📤 **Export.** Download as JSON, CSV, Excel, XML, RSS, or HTML. Or wire up Apify's Webhooks to drop new records straight into Sheets, Slack, or your database.

> ⏱️ Total time: under a minute from sign-up to first export.

***

### 💼 Business use cases

<table>
<tr>
<td width="50%">

#### 💒 Wedding planners and coordinators

- Build short-lists by city, category, and review threshold
- Track who is Best of Weddings or Hall of Fame in your market
- Compare price bands across rival vendors
- Maintain a private vendor CRM with phone and email

</td>
<td width="50%">

#### 📱 Wedding-tech SaaS and marketplaces

- Power a vendor-directory feature with rich profile cards
- Seed a new region with thousands of vendors in one run
- Refresh photos, ratings, and review counts on a schedule
- A/B test recommendation models on a real-world directory

</td>
</tr>
<tr>
<td width="50%">

#### 📣 Local vendor marketing

- Generate lead lists by category, city, and tier
- Find non-claimed vendors to pitch claim-and-promote services
- Build a competitor scoreboard with award counts and review velocity
- Spot under-promoted vendors with high ratings but low impressions

</td>
<td width="50%">

#### 🧪 Researchers and journalists

- Pricing-band distributions across markets
- Award concentration analysis (who holds Hall of Fame status)
- Diversity and ownership-attribute breakdowns per metro
- Longitudinal coverage of vendor churn and rating drift

</td>
</tr>
</table>

***

### 🌟 Beyond business use cases

Data like this powers more than commercial workflows. The same structured records support research, education, civic projects, and personal initiatives.

<table>
<tr>
<td width="50%">

#### 🎓 Research and academia

- Empirical datasets for papers, thesis work, and coursework
- Longitudinal studies tracking changes across snapshots
- Reproducible research with cited, versioned data pulls
- Classroom exercises on data analysis and ethical scraping

</td>
<td width="50%">

#### 🎨 Personal and creative

- Side projects, portfolio demos, and indie app launches
- Data visualizations, dashboards, and infographics
- Content research for bloggers, YouTubers, and podcasters
- Hobbyist collections and personal trackers

</td>
</tr>
<tr>
<td width="50%">

#### 🤝 Non-profit and civic

- Transparency reporting and accountability projects
- Advocacy campaigns backed by public-interest data
- Community-run databases for local issues
- Investigative journalism on public records

</td>
<td width="50%">

#### 🧪 Experimentation

- Prototype AI and machine-learning pipelines with real data
- Validate product-market hypotheses before engineering spend
- Train small domain-specific models on niche corpora
- Test dashboard concepts with live input

</td>
</tr>
</table>

***

### 🔌 Automating The Knot Wedding Vendor Scraper

Run on demand from your own code, or set it on a schedule.

- **[Node.js client](https://docs.apify.com/api/client/js)** for JavaScript and TypeScript callers
- **[Python client](https://docs.apify.com/api/client/python)** for data-science workflows and notebooks
- **[REST API docs](https://docs.apify.com/api/v2)** for any language with HTTP

Use [Apify Schedules](https://docs.apify.com/platform/schedules) to refresh your vendor list weekly, pull a city snapshot every Monday morning, or rerun award-winner queries each year when the new Best of Weddings list lands. Combine with Webhooks to drop new records into Sheets, a database, or your CRM.

***

### ❓ Frequently Asked Questions

<details>
<summary>📦 <b>Can I use the data commercially?</b></summary>
The data itself is from The Knot's public marketplace pages. You are responsible for using it in line with The Knot's Terms of Service plus any applicable laws (e.g. CAN-SPAM, CCPA, GDPR if you contact EU residents). For internal research, market analysis, and shortlists you control, commercial use is generally fine. For bulk outbound to vendor email addresses, check email-marketing law in your jurisdiction first.
</details>

<details>
<summary>💳 <b>Do I need a paid Apify plan?</b></summary>
No. The free Apify tier returns up to 10 records per run, which is enough to validate the schema and try every category. Paid plans unlock up to 1,000,000 items per run.
</details>

<details>
<summary>🚨 <b>What happens if a run fails?</b></summary>
Failed pages get pushed to the dataset with an <code>error</code> field describing the cause (proxy block, timeout, malformed URL). The Actor keeps going so one bad URL never stops the whole run. Listings and profile-page enrichment are retried up to four times with exponential backoff before being marked as an error row.
</details>

<details>
<summary>⚖️ <b>Is this legal?</b></summary>
The Actor reads The Knot's public marketplace listing pages without bypassing authentication or paywalls. You are bound by The Knot's Terms of Service and your local laws. Use the data for analysis, research, and personal vendor shortlists. If you plan bulk outbound, check anti-spam law in your jurisdiction first.
</details>

<details>
<summary>📍 <b>Which cities are covered?</b></summary>
Any US city The Knot lists. The URL pattern is <code>/marketplace/{category}-{city}-{state}</code>, e.g. <code>/marketplace/florists-chicago-il</code>. New York, Los Angeles, Chicago, Miami, Austin, Dallas, Atlanta, Seattle, Boston, and all 50 states plus DC are covered. Smaller towns often map to the nearest metro area.
</details>

<details>
<summary>🏷️ <b>Which categories are supported?</b></summary>
All 25: reception venues, photographers, videographers, bridal salons, beauty, DJs, wedding bands, florists, planners, hotel room blocks, jewelers, cakes, bar services, caterers, dance lessons, decor, ensembles, favors, invitations, officiants, photo booths, rehearsal-dinner spaces, rentals, transportation, and travel specialists.
</details>

<details>
<summary>☎️ <b>Why are phone and email sometimes empty?</b></summary>
Listing-only mode (the default) returns image, name, category, location, rating, review count, prices, awards, and business attributes. Flip <code>includeDetails</code> to <code>true</code> and the Actor fetches each vendor's profile page to pull phone, email, website, social handles, the full bio, and category-specific facets. The trade-off is one extra request per vendor.
</details>

<details>
<summary>🏠 <b>Why is the address blank for some vendors?</b></summary>
The Knot only publishes the full street address for vendors that opt to expose it, typically brick-and-mortar venues and shops. Photographers, DJs, planners, and other service-area vendors expose <code>city</code>, <code>state</code>, and <code>serviceArea</code> but leave <code>address</code> and <code>postalCode</code> empty by design. That is source behaviour, not a scraper bug.
</details>

<details>
<summary>💰 <b>How accurate are the prices?</b></summary>
The numeric <code>priceMin</code> and <code>priceMax</code> come straight from the vendor's published range. Some vendors publish a single starting price (no upper bound, so <code>priceMax</code> is null). The <code>startingPriceRange</code> field is The Knot's quintile band (<code>$</code>, <code>$$</code>, <code>$$$</code>, <code>$$$$</code>, <code>$$$$$</code>) in its raw text form. Both are the values shown to couples on the live site.
</details>

<details>
<summary>🏆 <b>What does the awards array contain?</b></summary>
Each entry is a year code: <code>BOW2024</code>, <code>BOW2025</code>, <code>BOW2026</code> are the Best of Weddings winner for that year. <code>BOWHOF</code> is Hall of Fame status (awarded after multiple Best of Weddings wins). The two booleans <code>isBestOfWeddings</code> and <code>isHallOfFame</code> flag the current-year winner and Hall of Fame status respectively.
</details>

<details>
<summary>🔄 <b>How fresh is the data?</b></summary>
Every run hits the live marketplace, so the data is current at run time. Review counts, ratings, photo counts, and prices update as soon as the vendor changes them on The Knot. Schedule a weekly run to keep a fresh snapshot.
</details>

<details>
<summary>📤 <b>What export formats are supported?</b></summary>
JSON, CSV, Excel, XML, RSS, and HTML straight from the Apify console. Or pull from the REST API, the Node.js client, the Python client, or set up Webhooks to push every new record into Sheets, Airtable, Slack, or your own backend.
</details>

***

### 🔌 Integrate with any app

- [**Zapier**](https://apify.com/integrations/zapier) - hundreds of no-code triggers and actions
- [**Make**](https://apify.com/integrations/make) - visual automation builder
- [**n8n**](https://apify.com/integrations/n8n) - self-hosted workflow automation
- [**Slack**](https://apify.com/integrations/slack) - drop new vendor records into a planning channel
- [**Google Sheets**](https://apify.com/integrations/google-drive) - auto-append vendor lists to a spreadsheet
- [**Airbyte**](https://apify.com/integrations/airbyte) - pipe results into your data warehouse

***

### 🔗 Recommended Actors

- [**🗺️ Google Maps Scraper**](https://apify.com/parseforge/google-maps-scraper) - local-business listings with reviews, photos, and contact info across every category, not just weddings
- [**🏨 TripAdvisor Scraper**](https://apify.com/parseforge/tripadvisor-scraper) - hotels, restaurants, and attractions with reviews and ratings, great for honeymoon planning
- [**🎟️ Eventbrite Scraper**](https://apify.com/parseforge/eventbrite-scraper) - upcoming events including bridal shows and wedding expos
- [**⭐ Trustpilot Reviews Scraper**](https://apify.com/parseforge/trustpilot-reviews-scraper) - business reviews and rating distributions to cross-check vendor reputation
- [**🏡 RateMyAgent Scraper**](https://apify.com/parseforge/ratemyagent-scraper) - same vendor-directory shape applied to real-estate agents, useful as a template for adjacent verticals

> 💡 Pro Tip: browse the complete [ParseForge collection](https://apify.com/parseforge) for more local-business, marketplace, and review scrapers.

***

**🆘 Need Help?** [**Open our contact form**](https://tally.so/r/BzdKgA)

***

> **Disclaimer.** This Actor reads The Knot's public marketplace listing pages. It does not bypass authentication, paywalls, or technical protection measures. You are responsible for using the resulting data in compliance with The Knot's Terms of Service and your local laws (anti-spam, data-protection, consumer-protection). ParseForge does not affiliate with, endorse, or claim any partnership with The Knot or its parent company XO Group.

# Actor input Schema

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

One or more The Knot marketplace URLs. Paste a category + city URL (e.g. https://www.theknot.com/marketplace/wedding-photographers-new-york-ny) or a vendor profile URL. Leave empty to use the structured Category + Location inputs below.

## `maxItems` (type: `integer`):

Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000.

## `category` (type: `string`):

Pick a vendor category. Used together with City + State to build the marketplace URL when Marketplace URLs is empty.

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

Lowercase, hyphen-separated city name (e.g. new-york, los-angeles, chicago, miami, austin).

## `stateCode` (type: `string`):

Two-letter US state abbreviation: ny, ca, tx, fl, il, etc.

## `sort` (type: `string`):

How the marketplace orders listings. Default is recommended (The Knot's personalised score). Featured promotes paid vendors first.

## `includeDetails` (type: `boolean`):

When enabled, the scraper visits each vendor's profile page to pull phone, email, website, social links, full description, and award history. Slower (one extra request per vendor) but much richer output.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.theknot.com/marketplace/wedding-photographers-new-york-ny"
  ],
  "maxItems": 10,
  "category": "",
  "stateCode": "",
  "sort": "recommended",
  "includeDetails": false
}
```

# Actor output Schema

## `overview` (type: `string`):

Table view with the most-used fields across the dataset.

## `fullData` (type: `string`):

Complete dataset with every extracted field.

# 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": [
        "https://www.theknot.com/marketplace/wedding-photographers-new-york-ny"
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/theknot-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": ["https://www.theknot.com/marketplace/wedding-photographers-new-york-ny"],
    "maxItems": 10,
}

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

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": [
    "https://www.theknot.com/marketplace/wedding-photographers-new-york-ny"
  ],
  "maxItems": 10
}' |
apify call parseforge/theknot-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=parseforge/theknot-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "The Knot Wedding Vendor Scraper",
        "description": "Extract wedding vendors from The Knot marketplace: name, category, pricing tiers, ratings, reviews, awards history, contact details, location, services, and image galleries across 25 vendor categories nationwide.",
        "version": "0.1",
        "x-build-id": "uKdHH4JqH5nMGbw10"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/parseforge~theknot-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-parseforge-theknot-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/parseforge~theknot-scraper/runs": {
            "post": {
                "operationId": "runs-sync-parseforge-theknot-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/parseforge~theknot-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-parseforge-theknot-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": {
                    "startUrls": {
                        "title": "Marketplace URLs",
                        "type": "array",
                        "description": "One or more The Knot marketplace URLs. Paste a category + city URL (e.g. https://www.theknot.com/marketplace/wedding-photographers-new-york-ny) or a vendor profile URL. Leave empty to use the structured Category + Location inputs below.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "minimum": 1,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000."
                    },
                    "category": {
                        "title": "Vendor category",
                        "enum": [
                            "",
                            "wedding-reception-venues",
                            "wedding-photographers",
                            "wedding-videographers",
                            "bridal-salons",
                            "beauty-services",
                            "wedding-djs",
                            "live-wedding-bands",
                            "florists",
                            "wedding-planners",
                            "wedding-room-blocks",
                            "jewelers",
                            "wedding-cake-bakeries",
                            "bar-services",
                            "catering",
                            "wedding-dance-lessons",
                            "wedding-decor-shops",
                            "wedding-soloists-ensembles",
                            "favors",
                            "invitations",
                            "wedding-officiants",
                            "wedding-photo-booth-rentals",
                            "rehearsal-dinners-bridal-showers",
                            "wedding-rentals",
                            "transportation-services",
                            "wedding-travel-agents"
                        ],
                        "type": "string",
                        "description": "Pick a vendor category. Used together with City + State to build the marketplace URL when Marketplace URLs is empty.",
                        "default": ""
                    },
                    "city": {
                        "title": "City",
                        "type": "string",
                        "description": "Lowercase, hyphen-separated city name (e.g. new-york, los-angeles, chicago, miami, austin)."
                    },
                    "stateCode": {
                        "title": "State (2-letter code)",
                        "enum": [
                            "",
                            "al",
                            "ak",
                            "az",
                            "ar",
                            "ca",
                            "co",
                            "ct",
                            "de",
                            "dc",
                            "fl",
                            "ga",
                            "hi",
                            "id",
                            "il",
                            "in",
                            "ia",
                            "ks",
                            "ky",
                            "la",
                            "me",
                            "md",
                            "ma",
                            "mi",
                            "mn",
                            "ms",
                            "mo",
                            "mt",
                            "ne",
                            "nv",
                            "nh",
                            "nj",
                            "nm",
                            "ny",
                            "nc",
                            "nd",
                            "oh",
                            "ok",
                            "or",
                            "pa",
                            "ri",
                            "sc",
                            "sd",
                            "tn",
                            "tx",
                            "ut",
                            "vt",
                            "va",
                            "wa",
                            "wv",
                            "wi",
                            "wy"
                        ],
                        "type": "string",
                        "description": "Two-letter US state abbreviation: ny, ca, tx, fl, il, etc.",
                        "default": ""
                    },
                    "sort": {
                        "title": "Sort order",
                        "enum": [
                            "recommended",
                            "featured",
                            "popular",
                            "newest",
                            "rating"
                        ],
                        "type": "string",
                        "description": "How the marketplace orders listings. Default is recommended (The Knot's personalised score). Featured promotes paid vendors first.",
                        "default": "recommended"
                    },
                    "includeDetails": {
                        "title": "Enrich with vendor profile pages",
                        "type": "boolean",
                        "description": "When enabled, the scraper visits each vendor's profile page to pull phone, email, website, social links, full description, and award history. Slower (one extra request per vendor) but much richer output.",
                        "default": false
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
