# Hidden Fee Checker: Hotel, Rental & Ticket Prices (`ultimatemc/hidden-fee-price-checker`) Actor

Check hotel, vacation rental and event ticket prices against the FTC junk fees rule (16 CFR 464, since May 2025): headline prices that leave out mandatory fees, resort and service fees, vague fee names, 'taxes and fees' lumped together and 'fees collected at property' text. Sources per finding.

- **URL**: https://apify.com/ultimatemc/hidden-fee-price-checker.md
- **Developed by:** [Ultimate Foresight Inc](https://apify.com/ultimatemc) (community)
- **Categories:** Travel, E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

Check **hotel, vacation rental (Airbnb, Vrbo, Booking.com) and live-event ticket prices** against the **FTC Rule on Unfair or Deceptive Fees (16 CFR Part 464)**, in effect since **May 12, 2025**. The **Hidden Fee Checker** compares the **headline price** with the **total price including all mandatory fees**, works out the **fee gap** per stay or per order, and flags **resort, destination and facility fees**, **vague fee names** like "service fee", **"taxes and fees" lumped together** and text such as **"resort fee collected at the property"** or **"price excludes fees"**. Click **Start** with the prefilled example to see it work.

> This is an automated screen of the price data you supply, not a legal determination. A clean result doesn't mean an offer meets the FTC rule or state laws such as California's SB 478; how prices are displayed on the page also matters. Not legal advice; every row carries this disclaimer and a timestamp.

### What does the Hidden Fee Checker do?

- ✅ **Headline price below the total** (high): the shown price (per night or per ticket times the stay or quantity) is lower than base price plus mandatory fees. Government taxes, shipping and optional add-ons are excluded, as in the rule.
- ✅ **Fees collected later**: text like "resort fee payable at the hotel", "plus fees" or "price does not include fees". Phrases such as "no hidden fees" or "all-in price" are not flagged.
- ✅ **Resort, destination, facility and similar mandatory fees**, each with its amount, per unit or per stay.
- ✅ **Vague fee names** such as "service fee", "convenience fee" or "processing fee" (FTC staff guidance asks businesses to say what a fee is for).
- ✅ **"Taxes and fees" combined** in one line, which can present business fees as taxes (16 CFR 464.3).
- ✅ **Large mandatory fees** (20% or more of the base) and **per-night prices without a stay length** as lower-severity notes.
- ✅ **Listing type**: short-term lodging, live-event ticket or other (the two categories the FTC rule covers), detected from your fields and text.
- ✅ Output per listing: `listingType`, `displayedPrice`, `requiredUpfrontTotal`, `feeGap`, `mandatoryFees`, `governmentCharges`, `feeBreakdown`, `riskLevel`, `issues` (`ruleId`, `severity`, `message`, `quote`, `sourceUrl`, `fixHint`), `checkedAt` and a disclaimer.

### Who is it for?

- **Hotels, vacation rental managers and Airbnb hosts** checking how their prices appear on booking sites.
- **Ticketing platforms, venues and promoters** reviewing all-in pricing.
- **OTAs, metasearch and price comparison sites** auditing partner listings at scale.
- **Consumer advocates, journalists and researchers** measuring drip pricing across scraped listings.

### How to check prices for hidden fees

1. Click **Start** with the prefilled example (a hotel, a ticket order and an all-in cabin price).
2. Replace **Offers** with your own: `displayedPrice` plus `fees` (`name`, `amount`, optional `per` such as night or ticket, `mandatory`, `government`), or `totalPrice`, and `nights` or `quantity`.
3. Or enter a **Dataset ID** from an Airbnb, Booking.com, Expedia, Vrbo or ticket scraper. Common fields are detected automatically; use **Field map** with dotted paths for nested ones.
4. Turn on **Only save rows with findings** to skip clean listings; you only pay for saved rows.
5. Export results as CSV, Excel or JSON, or fetch them through the API.

### Input example

This is the prefilled input:

```json
{
  "offers": [
    {
      "id": "EXAMPLE-HOTEL",
      "title": "Example beach hotel, 2 nights",
      "listingType": "lodging",
      "displayedPrice": 189,
      "priceUnit": "per night",
      "nights": 2,
      "fees": [
        {
          "name": "Resort fee",
          "amount": 35,
          "per": "night",
          "mandatory": true
        },
        {
          "name": "Taxes",
          "amount": 51.03,
          "government": true
        }
      ],
      "description": "Resort fee collected at the property."
    },
    {
      "id": "EXAMPLE-TICKET",
      "title": "Example concert, 2 tickets",
      "listingType": "ticket",
      "displayedPrice": 79,
      "priceUnit": "per ticket",
      "quantity": 2,
      "fees": [
        {
          "name": "Service fee",
          "amount": 18.5,
          "per": "ticket",
          "mandatory": true
        },
        {
          "name": "Facility charge",
          "amount": 4,
          "per": "ticket",
          "mandatory": true
        },
        {
          "name": "Taxes and fees",
          "amount": 9.6
        }
      ]
    },
    {
      "id": "EXAMPLE-CABIN",
      "title": "Example cabin, 3 nights (all-in price)",
      "listingType": "lodging",
      "displayedPrice": 642,
      "totalPrice": 642,
      "nights": 3,
      "fees": [
        {
          "name": "Cleaning fee",
          "amount": 90,
          "mandatory": true,
          "includedInPrice": true
        }
      ],
      "description": "Total price includes all fees, before taxes."
    }
  ]
}
```

Dataset mode:

```json
{"datasetId": "YOUR_DATASET_ID", "fieldMap": {"displayedPrice": "price.rate.amount", "totalPrice": "price.breakDown.total.price", "priceUnit": "price.qualifier", "nights": "numberOfNights"}, "listingType": "lodging", "onlyFlagged": true}
```

### Output example

Real output from a run of the prefilled input on 2026-10-31 (long finding lists are shortened here; the run returns all of them):

```json
[
  {
    "itemNo": 1,
    "listingId": "EXAMPLE-HOTEL",
    "title": "Example beach hotel, 2 nights",
    "listingType": "short-term lodging",
    "displayedPrice": 189,
    "basePrice": null,
    "totalPriceGiven": null,
    "requiredUpfrontTotal": 448,
    "feeGap": 70,
    "mandatoryFees": 70,
    "governmentCharges": 51.03,
    "optionalOrShipping": 0,
    "feeBreakdown": [
      {
        "name": "Resort fee",
        "amount": 35,
        "kind": "mandatory",
        "perUnit": true,
        "included": false
      },
      {
        "name": "Taxes",
        "amount": 51.03,
        "kind": "government",
        "perUnit": false,
        "included": false
      }
    ],
    "riskLevel": "high",
    "issueCount": 4,
    "categoriesFlagged": [
      "fee_collected_at_property",
      "headline_excludes_mandatory_fees",
      "resort_or_property_fee",
      "total_price_not_provided"
    ],
    "issues": [
      {
        "ruleId": "headline_excludes_mandatory_fees",
        "severity": "high",
        "message": "The displayed price (378) is 70 below the price including mandatory fees (448; taxes, shipping and optional add-ons excluded). The FTC rule requires the total price, including mandatory fees, to be shown more prominently than other pricing information.",
        "quote": null,
        "sourceUrl": "https://www.ecfr.gov/current/title-16/chapter-I/subchapter-D/part-464",
        "fixHint": "Show the total price (base plus all mandatory fees) as the headline price; taxes and optional add-ons may be shown later, before payment.",
        "gapAmount": 70,
        "gapPct": 18.5
      },
      {
        "ruleId": "resort_or_property_fee",
        "severity": "medium",
        "message": "'Resort fee' is a mandatory per-unit fee of 35 (resort, facility, destination and similar fees). Mandatory fees like this belong in the total price shown up front.",
        "quote": "Resort fee",
        "sourceUrl": "https://www.ecfr.gov/current/title-16/chapter-I/subchapter-D/part-464",
        "fixHint": "Include it in the headline/total price."
      },
      {
        "...": "2 more findings: fee_collected_at_property 'Example beach hotel, 2 nights   Resort fee collected at the property.', total_price_not_provided 'No total price was supplied, so the total was comp'"
      }
    ],
    "notes": [],
    "url": null,
    "checkedAt": "2026-10-31T18:43:35+00:00",
    "disclaimer": "Automated screening based on the FTC Rule on Unfair or Deceptive Fees (16 CFR Part 464,..."
  },
  {
    "itemNo": 2,
    "listingId": "EXAMPLE-TICKET",
    "title": "Example concert, 2 tickets",
    "listingType": "live-event ticket",
    "displayedPrice": 79,
    "basePrice": null,
    "totalPriceGiven": null,
    "requiredUpfrontTotal": 212.6,
    "feeGap": 54.6,
    "mandatoryFees": 54.6,
    "governmentCharges": 0,
    "optionalOrShipping": 0,
    "feeBreakdown": [
      {
        "name": "Service fee",
        "amount": 18.5,
        "kind": "mandatory",
        "perUnit": true,
        "included": false
      },
      {
        "name": "Facility charge",
        "amount": 4,
        "kind": "mandatory",
        "perUnit": true,
        "included": false
      },
      {
        "name": "Taxes and fees",
        "amount": 9.6,
        "kind": "mandatory",
        "perUnit": false,
        "included": false
      }
    ],
    "riskLevel": "high",
    "issueCount": 6,
    "categoriesFlagged": [
      "headline_excludes_mandatory_fees",
      "resort_or_property_fee",
      "taxes_and_fees_combined",
      "total_price_not_provided",
      "vague_fee_name"
    ],
    "issues": [
      {
        "ruleId": "headline_excludes_mandatory_fees",
        "severity": "high",
        "message": "The displayed price (158) is 54.6 below the price including mandatory fees (212.6; taxes, shipping and optional add-ons excluded). The FTC rule requires the total price, including mandatory fees, to be shown more prominently than other pricing information.",
        "quote": null,
        "sourceUrl": "https://www.ecfr.gov/current/title-16/chapter-I/subchapter-D/part-464",
        "fixHint": "Show the total price (base plus all mandatory fees) as the headline price; taxes and optional add-ons may be shown later, before payment.",
        "gapAmount": 54.6,
        "gapPct": 34.6
      },
      {
        "ruleId": "vague_fee_name",
        "severity": "medium",
        "message": "Fee named 'Service fee' doesn't say what it's for. FTC staff guidance says to describe each fee's purpose and avoid vague names like 'service fee', 'convenience fee' or 'processing fee'.",
        "quote": "Service fee",
        "sourceUrl": "https://www.ftc.gov/business-guidance/resources/rule-unfair-or-deceptive-fees-frequently-asked-questions",
        "fixHint": "Rename the fee to what it pays for, or fold it into the base price."
      },
      {
        "...": "4 more findings: vague_fee_name 'Facility charge', resort_or_property_fee 'Facility charge', taxes_and_fees_combined 'Taxes and fees', total_price_not_provided 'No total price was supplied, so the total was comp'"
      }
    ],
    "notes": [],
    "url": null,
    "checkedAt": "2026-10-31T18:43:35+00:00",
    "disclaimer": "Automated screening based on the FTC Rule on Unfair or Deceptive Fees (16 CFR Part 464,..."
  },
  {
    "itemNo": 3,
    "listingId": "EXAMPLE-CABIN",
    "title": "Example cabin, 3 nights (all-in price)",
    "listingType": "short-term lodging",
    "displayedPrice": 642,
    "basePrice": null,
    "totalPriceGiven": 642,
    "requiredUpfrontTotal": 642,
    "feeGap": 0,
    "mandatoryFees": 90,
    "governmentCharges": 0,
    "optionalOrShipping": 0,
    "feeBreakdown": [
      {
        "name": "Cleaning fee",
        "amount": 90,
        "kind": "mandatory",
        "perUnit": false,
        "included": true
      }
    ],
    "riskLevel": "none found",
    "issueCount": 0,
    "categoriesFlagged": [],
    "issues": [],
    "notes": [],
    "url": null,
    "checkedAt": "2026-10-31T18:43:35+00:00",
    "disclaimer": "Automated screening based on the FTC Rule on Unfair or Deceptive Fees (16 CFR Part 464,..."
  }
]
```

### How much does it cost to check listings for hidden fees?

This Actor uses pay-per-event pricing: **$0.002 per listing saved** plus a **$0.00005 start fee per run**, plus small platform usage paid by you (a few hundredths of a cent for small runs). That's about **$2.00 for 1,000 listings** and **$20.00 for 10,000** plus usage. With **Only save rows with findings** on, rows without findings aren't saved or charged. You can set a maximum cost per run in the run options.

### Use it through the API, integrations or AI agents

- Run it and get results in one call: `https://api.apify.com/v2/acts/ultimatemc~hidden-fee-price-checker/run-sync-get-dataset-items`
- Use it from AI agents through the Apify MCP server: `https://mcp.apify.com?tools=ultimatemc/hidden-fee-price-checker`
- Schedule it after a daily scraper run, send flagged rows to Slack or email with webhooks, or connect it to Make, Zapier, n8n or Google Sheets.
- Chain it after a lodging or ticket scraper by passing the scraper's dataset ID.

### How it works

Checks are deterministic rules written from the text of 16 CFR Part 464 and the FTC's business guidance, checked on 2026-10-31. Prices are parsed from numbers or text ("$1,234.50", "1.234,50 €"), per-unit prices and fees are scaled by nights or quantity, and fee names are classified as mandatory, government, shipping or optional. No AI and no external calls, so the same input always gives the same result.

Sources:

- [eCFR: 16 CFR Part 464, Rule on Unfair or Deceptive Fees](https://www.ecfr.gov/current/title-16/chapter-I/subchapter-D/part-464)
- [FTC: Rule on Unfair or Deceptive Fees, Frequently Asked Questions](https://www.ftc.gov/business-guidance/resources/rule-unfair-or-deceptive-fees-frequently-asked-questions)
- [California Attorney General: SB 478 hidden fees](https://oag.ca.gov/hiddenfees)

### FAQ

#### Which businesses does the FTC rule cover?

Short-term lodging (hotels, motels, vacation rentals) and live-event tickets. Rows detected as other types get a note; similar state laws, such as California's, apply more widely.

#### Are taxes counted as hidden fees?

No. Government taxes and fees, shipping and truly optional add-ons may be left out of the total under the rule; the checker excludes them from the gap.

#### Why is a 'service fee' flagged?

FTC staff guidance says a fee's name should describe what it's for. Generic names are flagged at medium severity so you can review them.

#### Does it read the booking page?

No. It checks the data you give it (for example a scraper's output). Use any lodging or ticket scraper first and pass its dataset ID.

#### Is it AI?

No. It's a fixed set of rules, so results are repeatable.

### Limitations

- It can't see how prominently prices are displayed on a page, only the values and text supplied.
- Fee data is only as complete as the scraper's output; fees not in the data can't be checked.
- Federal rule and California law only; other states and countries aren't covered.
- Long-term rentals and non-covered businesses get notes, not findings.

### Other tools by Ultimate Foresight

- [Amazon Listing Policy Checker for Titles & Bullets](https://apify.com/ultimatemc/amazon-listing-policy-checker): flags pesticide, FDA and disease claims and Amazon title and bullet rule breaks in bulk, with policy links and fixes.
- [Fair Housing Listing Checker for Real Estate Ads](https://apify.com/ultimatemc/fair-housing-listing-checker): flags rental and sale listing wording that may raise Fair Housing Act issues, with HUD sources and rewrite tips (screening aid only).
- [Ad Copy Policy Checker for Meta, Google & TikTok](https://apify.com/ultimatemc/ad-copy-policy-checker): checks ad text against Facebook, Instagram, Google Ads and TikTok ad policies before you submit.
- [H-1B Visa Sponsor Checker & Score for Job Listings](https://apify.com/ultimatemc/h1b-visa-sponsor-score): adds Department of Labor H-1B sponsorship history and a 0-100 score to company names or job listings.
- [Chain vs Independent Labeler for Google Maps Leads](https://apify.com/ultimatemc/chain-vs-independent-labeler): labels local businesses as chain, franchise or independent.
- [YouTube Monetization Checker for Scripts & Titles](https://apify.com/ultimatemc/youtube-script-monetization-checker): pre-checks titles, descriptions and scripts for wording that leads to limited or no ads.
- [Etsy & eBay Listing Policy & Banned Item Checker](https://apify.com/ultimatemc/etsy-ebay-listing-policy-checker): pre-checks marketplace listings for prohibited items, counterfeit wording and off-platform contact.
- [Job Scam Detector & Trust Score for Job Postings](https://apify.com/ultimatemc/job-posting-trust-score): scores job postings 0-100 for scam and ghost-job signals.
- [SAM.gov Amendment & Opportunity Change Tracker](https://apify.com/ultimatemc/sam-gov-opportunity-change-detector): shows what changed between versions of a SAM.gov notice: deadlines, set-asides, NAICS and attachments.
- [Product Recall Checker for Brands, UPCs & Products](https://apify.com/ultimatemc/product-recall-matcher): matches your brands, products, UPCs or model numbers against CPSC, FDA and NHTSA recalls.
- [App Store & Google Play Listing Policy Checker](https://apify.com/ultimatemc/app-store-listing-policy-checker): pre-checks app names, subtitles and descriptions against Apple and Google Play metadata rules.
- [Company Name Normalizer & Deduplicator for CRM](https://apify.com/ultimatemc/company-name-canonicalizer): cleans company names (Inc, LLC, d/b/a, aliases) and groups duplicates in CRM, lead or vendor lists.
- [FCC Covered List & Section 889 Bulk Screener](https://apify.com/ultimatemc/fcc-covered-list-screener): screens FCC IDs and brand names against the public FCC Covered List, with sources and timestamps (screening aid only).
- [Green Claims Checker: EU Greenwashing Ban & FTC](https://apify.com/ultimatemc/green-claims-checker): flags risky eco-friendly, carbon neutral and recyclable wording under EU, FTC and UK CMA rules.
- [Influencer #ad Disclosure Checker: FTC & ASA](https://apify.com/ultimatemc/influencer-ad-disclosure-checker): flags influencer posts with missing or unclear #ad labels under FTC, ASA/CAP and CMA rules.
- [Job Title to SOC Code Mapper with O\*NET Data](https://apify.com/ultimatemc/job-title-soc-code-mapper): maps job titles to SOC and O\*NET-SOC codes in bulk, with seniority and tech skills found in the posting.
- [Shrinkflation Detector for Grocery Price Data](https://apify.com/ultimatemc/shrinkflation-detector): finds smaller packs at the same or higher price by comparing two runs of a grocery scraper, with unit price before and after.
- [Job Ad Discrimination Checker for Job Posts (US)](https://apify.com/ultimatemc/job-ad-discrimination-checker): flags age, sex, national origin, citizenship and other discriminatory wording in job posts, with EEOC and DOJ sources (screening aid only).
- [Walmart Listing Policy Checker for Titles & Copy](https://apify.com/ultimatemc/walmart-listing-policy-checker): flags promotional phrases, retailer names, URLs, long titles and pesticide or FDA claims in Walmart Marketplace listings, with policy links and fixes.
- [TikTok Shop Listing Policy Checker for Products](https://apify.com/ultimatemc/tiktok-shop-listing-policy-checker): flags off-platform links, dupe wording, weight-loss, disease and FDA claims and title rule breaks in TikTok Shop listings.
- [Supplement & Cosmetic Claims Checker: FDA & FTC](https://apify.com/ultimatemc/supplement-cosmetic-claims-checker): flags disease, drug and 'FDA approved' claims and missing supplement disclaimers in supplement and beauty product copy, with FDA and FTC sources (screening aid only).
- [Rental Listing Scam Checker for Craigslist & FB](https://apify.com/ultimatemc/rental-listing-scam-checker): scores rental listings 0-100 for FTC-listed scam signs like wire or gift card payment, deposit before viewing and rent far below similar listings.
- [GTIN, UPC & EAN Barcode Validator (Check Digit)](https://apify.com/ultimatemc/gtin-barcode-validator): checks UPC, EAN, GTIN-14 and ISBN codes for wrong check digits, lost leading zeros, scientific notation, restricted prefixes and duplicates before a feed upload.
- [Fake Review Checker: Incentivized & Duplicates](https://apify.com/ultimatemc/review-integrity-checker): screens scraped reviews for incentivized or insider wording, copied text, rating bursts and rating/text mismatches named in the FTC 2024 fake-review rule.
- [Facebook Marketplace Listing Policy Checker](https://apify.com/ultimatemc/facebook-marketplace-listing-policy-checker): flags Marketplace listings that may break Meta's Commerce Policies (weapons, vapes, Rx, animals, gift cards, services, counterfeits and more), with policy links.
- [Fake Discount Checker: EU 30-Day Prior Price](https://apify.com/ultimatemc/discount-claim-checker): checks 'was' and strikethrough prices against your own price history for 30-day prior-price, raise-then-discount and wrong-badge issues.
- [SMS Marketing Message Checker: STOP & 10DLC](https://apify.com/ultimatemc/sms-marketing-message-checker): pre-checks SMS marketing texts for segment count, STOP opt-out wording, URL shorteners, SHAFT content and quiet hours.
- [EU GPSR Listing Checker for Amazon, eBay & Shops](https://apify.com/ultimatemc/gpsr-listing-checker): checks listings for the EU GPSR Article 19 online-sale details: manufacturer, EU responsible person, product identifier, picture and warnings.
- [Food Allergen Label Checker: US, EU & AU](https://apify.com/ultimatemc/food-allergen-label-checker): compares ingredient lists with the 'Contains' statement for US 9, EU/UK 14 and Australian PEAL allergens and flags gaps and conflicting free-from claims.
- [Toy Choking Hazard Warning Checker (CPSC)](https://apify.com/ultimatemc/toy-choking-warning-checker): flags toy listings missing the CPSC choking-hazard warnings for small parts, balloons, small balls and marbles, with age-grade checks.
- [Textile Fiber Label Checker: Bamboo & Origin](https://apify.com/ultimatemc/textile-fiber-label-checker): flags 'bamboo' claims that should say rayon, fiber percentages that don't add up, mismatched silk or cashmere titles and missing Made in USA/Imported.
- [Prop 65 Warning Checker for Product Listings](https://apify.com/ultimatemc/prop65-warning-checker): flags Prop 65 safe-harbor warnings missing 'WARNING', the P65Warnings.ca.gov link or a chemical name, old short forms, and listed chemicals mentioned with no warning.
- [Unit Price Checker for Grocery & Retail Listings](https://apify.com/ultimatemc/unit-price-checker): parses pack sizes, recomputes the price per kg, litre or item, and flags missing or wrong unit prices in grocery and retail data.
- [Made in USA Claim Checker for Product Listings](https://apify.com/ultimatemc/made-in-usa-claim-checker): flags unqualified 'Made in USA' claims next to imported or foreign-origin details under the FTC rule (16 CFR 323), with sources per finding.
- [Subscription Auto-Renewal Disclosure Checker](https://apify.com/ultimatemc/auto-renewal-disclosure-checker): checks subscription and free-trial offer text for missing renewal, price, billing period and cancellation disclosures under California law and FTC ROSCA.
- [Email CAN-SPAM Checker & Unsubscribe Header Test](https://apify.com/ultimatemc/email-can-spam-checker): pre-checks marketing emails for missing unsubscribe links or postal address, misleading subjects and Google/Yahoo one-click unsubscribe headers.

Found a false positive? Open an issue on the **Issues** tab with the listing data and what you expected, and we'll review the rule.

# Actor input Schema

## `offers` (type: `array`):

Array of objects with "displayedPrice" and optional "fees" (list of {name, amount, mandatory}), "totalPrice", "nights", "quantity", "priceUnit", "description", "listingType" (lodging, ticket, other), "title", "id" and "url". Flat fields such as cleaningFee, serviceFee, resortFee and taxes also work. The prefilled example shows two common problems and one all-in price; replace it with your own.

## `listingType` (type: `string`):

The FTC rule covers short-term lodging and live-event tickets. Leave on Detect to classify each row from its fields and text.

## `datasetId` (type: `string`):

Apify dataset with listings, for example the output of an Airbnb, Booking.com, Expedia, Vrbo or ticketing scraper. Common fields (price, price.breakDown.total.price, totalPrice, fees, cleaningFee, serviceFee, nights, title, url) are detected automatically; override them with Field map.

## `fieldMap` (type: `object`):

Override field names; dotted paths work for nested fields. Example: {"displayedPrice": "price.rate.amount", "totalPrice": "price.total.amount", "fees": "price.breakDown.fees"}.

## `onlyFlagged` (type: `boolean`):

Skip listings with no findings (you are only charged for saved rows).

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

Maximum number of listings to check in this run.

## Actor input object example

```json
{
  "offers": [
    {
      "id": "EXAMPLE-HOTEL",
      "title": "Example beach hotel, 2 nights",
      "listingType": "lodging",
      "displayedPrice": 189,
      "priceUnit": "per night",
      "nights": 2,
      "fees": [
        {
          "name": "Resort fee",
          "amount": 35,
          "per": "night",
          "mandatory": true
        },
        {
          "name": "Taxes",
          "amount": 51.03,
          "government": true
        }
      ],
      "description": "Resort fee collected at the property."
    },
    {
      "id": "EXAMPLE-TICKET",
      "title": "Example concert, 2 tickets",
      "listingType": "ticket",
      "displayedPrice": 79,
      "priceUnit": "per ticket",
      "quantity": 2,
      "fees": [
        {
          "name": "Service fee",
          "amount": 18.5,
          "per": "ticket",
          "mandatory": true
        },
        {
          "name": "Facility charge",
          "amount": 4,
          "per": "ticket",
          "mandatory": true
        },
        {
          "name": "Taxes and fees",
          "amount": 9.6
        }
      ]
    },
    {
      "id": "EXAMPLE-CABIN",
      "title": "Example cabin, 3 nights (all-in price)",
      "listingType": "lodging",
      "displayedPrice": 642,
      "totalPrice": 642,
      "nights": 3,
      "fees": [
        {
          "name": "Cleaning fee",
          "amount": 90,
          "mandatory": true,
          "includedInPrice": true
        }
      ],
      "description": "Total price includes all fees, before taxes."
    }
  ],
  "listingType": "auto",
  "onlyFlagged": false,
  "maxItems": 5000
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "offers": [
        {
            "id": "EXAMPLE-HOTEL",
            "title": "Example beach hotel, 2 nights",
            "listingType": "lodging",
            "displayedPrice": 189,
            "priceUnit": "per night",
            "nights": 2,
            "fees": [
                {
                    "name": "Resort fee",
                    "amount": 35,
                    "per": "night",
                    "mandatory": true
                },
                {
                    "name": "Taxes",
                    "amount": 51.03,
                    "government": true
                }
            ],
            "description": "Resort fee collected at the property."
        },
        {
            "id": "EXAMPLE-TICKET",
            "title": "Example concert, 2 tickets",
            "listingType": "ticket",
            "displayedPrice": 79,
            "priceUnit": "per ticket",
            "quantity": 2,
            "fees": [
                {
                    "name": "Service fee",
                    "amount": 18.5,
                    "per": "ticket",
                    "mandatory": true
                },
                {
                    "name": "Facility charge",
                    "amount": 4,
                    "per": "ticket",
                    "mandatory": true
                },
                {
                    "name": "Taxes and fees",
                    "amount": 9.6
                }
            ]
        },
        {
            "id": "EXAMPLE-CABIN",
            "title": "Example cabin, 3 nights (all-in price)",
            "listingType": "lodging",
            "displayedPrice": 642,
            "totalPrice": 642,
            "nights": 3,
            "fees": [
                {
                    "name": "Cleaning fee",
                    "amount": 90,
                    "mandatory": true,
                    "includedInPrice": true
                }
            ],
            "description": "Total price includes all fees, before taxes."
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ultimatemc/hidden-fee-price-checker").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 = { "offers": [
        {
            "id": "EXAMPLE-HOTEL",
            "title": "Example beach hotel, 2 nights",
            "listingType": "lodging",
            "displayedPrice": 189,
            "priceUnit": "per night",
            "nights": 2,
            "fees": [
                {
                    "name": "Resort fee",
                    "amount": 35,
                    "per": "night",
                    "mandatory": True,
                },
                {
                    "name": "Taxes",
                    "amount": 51.03,
                    "government": True,
                },
            ],
            "description": "Resort fee collected at the property.",
        },
        {
            "id": "EXAMPLE-TICKET",
            "title": "Example concert, 2 tickets",
            "listingType": "ticket",
            "displayedPrice": 79,
            "priceUnit": "per ticket",
            "quantity": 2,
            "fees": [
                {
                    "name": "Service fee",
                    "amount": 18.5,
                    "per": "ticket",
                    "mandatory": True,
                },
                {
                    "name": "Facility charge",
                    "amount": 4,
                    "per": "ticket",
                    "mandatory": True,
                },
                {
                    "name": "Taxes and fees",
                    "amount": 9.6,
                },
            ],
        },
        {
            "id": "EXAMPLE-CABIN",
            "title": "Example cabin, 3 nights (all-in price)",
            "listingType": "lodging",
            "displayedPrice": 642,
            "totalPrice": 642,
            "nights": 3,
            "fees": [{
                    "name": "Cleaning fee",
                    "amount": 90,
                    "mandatory": True,
                    "includedInPrice": True,
                }],
            "description": "Total price includes all fees, before taxes.",
        },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("ultimatemc/hidden-fee-price-checker").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 '{
  "offers": [
    {
      "id": "EXAMPLE-HOTEL",
      "title": "Example beach hotel, 2 nights",
      "listingType": "lodging",
      "displayedPrice": 189,
      "priceUnit": "per night",
      "nights": 2,
      "fees": [
        {
          "name": "Resort fee",
          "amount": 35,
          "per": "night",
          "mandatory": true
        },
        {
          "name": "Taxes",
          "amount": 51.03,
          "government": true
        }
      ],
      "description": "Resort fee collected at the property."
    },
    {
      "id": "EXAMPLE-TICKET",
      "title": "Example concert, 2 tickets",
      "listingType": "ticket",
      "displayedPrice": 79,
      "priceUnit": "per ticket",
      "quantity": 2,
      "fees": [
        {
          "name": "Service fee",
          "amount": 18.5,
          "per": "ticket",
          "mandatory": true
        },
        {
          "name": "Facility charge",
          "amount": 4,
          "per": "ticket",
          "mandatory": true
        },
        {
          "name": "Taxes and fees",
          "amount": 9.6
        }
      ]
    },
    {
      "id": "EXAMPLE-CABIN",
      "title": "Example cabin, 3 nights (all-in price)",
      "listingType": "lodging",
      "displayedPrice": 642,
      "totalPrice": 642,
      "nights": 3,
      "fees": [
        {
          "name": "Cleaning fee",
          "amount": 90,
          "mandatory": true,
          "includedInPrice": true
        }
      ],
      "description": "Total price includes all fees, before taxes."
    }
  ]
}' |
apify call ultimatemc/hidden-fee-price-checker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ultimatemc/hidden-fee-price-checker"
        }
    }
}
```

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/OK6CLBIYFaSIWXGKh/builds/Do7Ott1cwRm5H31Et/openapi.json
