Free Agent Tools
21 free no-auth tools: pitch roast, Kyushu discount, Japan visa fee, luggage, tax-free.
Should I use this
Quality & Safety
Findings (5)
- LOWin email_list_reactivation_value
- LOWin hotel_ota_commission_calculator
- LOWin faceless_youtube_reality_check
- LOWin hotel_ota_commission_calculator
- LOWin list_open_source_saas_alternatives
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"free-agent-tools": {
"url": "https://free-agent-tools.vercel.app/mcp"
}
}
}Remote endpoints
https://free-agent-tools.vercel.app/mcpstreamable-httpWhat it can do
Tool inventory
Tools (21)
🟢score_business_idea_moat(margin, operations, advantage, tam, pain, ...)
Score a business idea on Margin, Operations, Advantage, and TAM (1-10 each). 30+ = FUND IT, 20-29 = FIX IT, under 20 = FLEE IT. Returns the weakest factor, how to fix it, and red flags from pain / money / willingness-to-suffer checks. Educational rule of thumb, not financial advice.
Input Schema
{
"type": "object",
"properties": {
"margin": {
"type": "number",
"minimum": 1,
"maximum": 10,
"description": "Net margin potential, 1-10."
},
"operations": {
"type": "number",
"minimum": 1,
"maximum": 10,
"description": "How easily it runs without the founder, 1-10."
},
"advantage": {
"type": "number",
"minimum": 1,
"maximum": 10,
"description": "Hard-to-copy edge (distribution, data, expertise), 1-10."
},
"tam": {
"type": "number",
"minimum": 1,
"maximum": 10,
"description": "Market size and proof that people buy, 1-10."
},
"pain": {
"description": "Fixes a measurable pain? Default true.",
"type": "boolean"
},
"money": {
"description": "Buyers have money to spend? Default true.",
"type": "boolean"
},
"suffer": {
"description": "Founder willing to push through a long build? Default true.",
"type": "boolean"
}
},
"required": [
"margin",
"operations",
"advantage",
"tam"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢roast_pitch(pitch, stage, category)
Paste a startup pitch (one to five sentences). Five fictional judges (Seed VC, Skeptical Customer, CTO, Your Competitor, Growth Lead) score it 1-10 with a short roast line each, then it returns a verdict (FUND IT / SHARPEN IT / REWRITE IT / ROASTED / BURNT TO A CRISP), the one change worth the most points, detected issues and strengths, and a share URL with an OG image. Deterministic, transparent rubric (specific customer, pain, numbers, traction, wedge, distribution, buzzwords, 'X for Y', blockchain), not an AI opinion. For fun and practice, not investment advice.
Input Schema
{
"type": "object",
"properties": {
"pitch": {
"type": "string",
"minLength": 3,
"maxLength": 1000,
"description": "The pitch, one to five sentences."
},
"stage": {
"description": "Optional stage. Later stages are judged harder on traction.",
"type": "string",
"enum": [
"idea",
"pre-seed",
"seed",
"series-a",
"growth"
]
},
"category": {
"description": "Optional category. 'crypto' softens the blockchain penalty.",
"type": "string",
"enum": [
"b2b-saas",
"consumer",
"marketplace",
"devtools",
"ai",
"fintech",
"health",
"hardware",
"climate",
"crypto",
"other"
]
}
},
"required": [
"pitch"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢price_headroom_check(closeRate, price, netMargin, newPriceMultiple, customersLost)
Is the business underpriced? Uses sales close rate (80%+ = way underpriced, ~30% = about right, under 25% = sales problem) to suggest a price range, and computes the profit multiple of a price rise after losing some customers, plus the break-even customer loss.
Input Schema
{
"type": "object",
"properties": {
"closeRate": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "Percent of proposals or sales calls that close."
},
"price": {
"type": "number",
"minimum": 0,
"description": "Current price, any currency."
},
"netMargin": {
"description": "Net margin percent today. Default 15.",
"type": "number",
"minimum": 0.1,
"maximum": 99
},
"newPriceMultiple": {
"description": "New price as a multiple of the old (1.5 = +50%). Default 1.5.",
"type": "number",
"minimum": 0.1,
"maximum": 10
},
"customersLost": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "Percent of customers expected to leave after the rise. Default 20."
}
},
"required": [
"closeRate",
"price"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢thirty_day_cash_check(cash30, cac, cogs30)
Compares cash collected in a new customer's first 30 days with acquisition cost plus 30-day cost to serve. 2x+ = SELF-FUNDING, 1-2x = BREAK-EVEN, under 1x = CASH-HUNGRY. Returns the gap to 2x and tips.
Input Schema
{
"type": "object",
"properties": {
"cash30": {
"type": "number",
"minimum": 0,
"description": "Cash collected from a new customer in their first 30 days."
},
"cac": {
"type": "number",
"minimum": 0,
"description": "Customer acquisition cost."
},
"cogs30": {
"description": "Cost to serve that customer for 30 days. Default 0.",
"type": "number",
"minimum": 0
}
},
"required": [
"cash30",
"cac"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢email_list_reactivation_value(contacts, orderValue, reachable, buyRate, partnerShare)
Estimates buyers and revenue from one offer to past customers in low / mid / high scenarios, with an optional partner revenue share.
Input Schema
{
"type": "object",
"properties": {
"contacts": {
"type": "number",
"minimum": 0,
"description": "Number of past contacts."
},
"orderValue": {
"type": "number",
"minimum": 0,
"description": "Average order value of the offer."
},
"reachable": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "Percent of contacts still reachable. Default 70."
},
"buyRate": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "Expected percent of reached contacts who buy. Default 1."
},
"partnerShare": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "Optional partner revenue share percent. Default 0."
}
},
"required": [
"contacts",
"orderValue"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢hotel_ota_commission_calculator(rooms, adr, occupancy, otaShare, commission, ...)
For hotels, ryokan, guesthouses, and B&Bs: yearly room revenue, commission paid to OTAs (Booking.com, Expedia, Agoda...), commission as a share of revenue (HIGH / MED / LOW), and net savings from moving a share of OTA bookings to direct. Any currency.
Input Schema
{
"type": "object",
"properties": {
"rooms": {
"type": "number",
"minimum": 0,
"description": "Number of rooms."
},
"adr": {
"type": "number",
"minimum": 0,
"description": "Average daily rate per occupied room."
},
"occupancy": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "Average yearly occupancy percent. Default 70."
},
"otaShare": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "Percent of room revenue booked via OTAs. Default 60."
},
"commission": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "Average OTA commission percent. Default 18."
},
"directCost": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "Cost of a direct booking as percent of revenue. Default 3."
},
"shift": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "Percent of OTA bookings moved to direct. Default 20."
}
},
"required": [
"rooms",
"adr"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢saas_self_host_savings(spend, hostingPerMonth, hourlyRate)
Give monthly spend per paid tool (ids: mixpanel, semrush, freshbooks, calendly, chargebee, typeform, pipedrive, gohighlevel, intercom). Returns the open-source swap for each (repo, license, caveat), yearly savings after hosting, setup hours and cost, break-even months, and a SWITCH / MAYBE / KEEP verdict.
Input Schema
{
"type": "object",
"properties": {
"spend": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"mixpanel",
"semrush",
"freshbooks",
"calendly",
"chargebee",
"typeform",
"pipedrive",
"gohighlevel",
"intercom"
]
},
"additionalProperties": {
"type": "number",
"minimum": 0
},
"description": "Map of tool id to monthly spend in dollars, e.g. {\"mixpanel\": 300, \"intercom\": 150}."
},
"hostingPerMonth": {
"description": "Estimated monthly server cost to self-host. Default 20.",
"type": "number",
"minimum": 0
},
"hourlyRate": {
"description": "Value of an hour of setup time. Default 50.",
"type": "number",
"minimum": 0
}
},
"required": [
"spend"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢list_open_source_saas_alternatives
Lists every covered paid tool (Mixpanel, Semrush, FreshBooks, Calendly, Chargebee, Typeform, Pipedrive/HubSpot, GoHighLevel, Intercom/Zendesk) with its open-source swap, GitHub repo, license, setup effort, and main catch.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢ads_policy_notice_risk_check(notice)
Paste the text of a Google Ads, AdSense, Merchant Center, or Meta (Facebook/Instagram) ads suspension, disapproval, or policy notice. Returns HIGH / MED / LOW risk, the platform, the policy phrases found with plain-language explanations, and a next-step checklist. Heuristic only; never suggests replacement accounts or files appeals.
Input Schema
{
"type": "object",
"properties": {
"notice": {
"type": "string",
"minLength": 20,
"maxLength": 20000,
"description": "Full notice text. Remove account IDs and personal data."
}
},
"required": [
"notice"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢app_store_wrapper_precheck(name, description, stack, features)
For Capacitor, WebView, PWA-shell, React Native, or AI-generated iOS apps: scores rejection risk under Guideline 4.2 (minimum functionality / web wrapper), 4.3 (spam / clone), and metadata, with reasons and how native each feature reads. Not legal advice; Apple decides.
Input Schema
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "App name."
},
"description": {
"type": "string",
"minLength": 1,
"description": "One-line description of what the app does."
},
"stack": {
"type": "string",
"enum": [
"capacitor",
"webview",
"react-native",
"pwa",
"other"
],
"description": "How the app is built."
},
"features": {
"minItems": 1,
"maxItems": 3,
"type": "array",
"items": {
"type": "string"
},
"description": "Up to three key features, e.g. [\"Home screen widget\", \"iOS share sheet\", \"Face ID lock\"]."
}
},
"required": [
"name",
"description",
"stack",
"features"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢faceless_youtube_reality_check(visual, voiceover, scripts, revenueTiming, estimates, ...)
Seven multiple-choice answers about a faceless or AI YouTube channel plan. Returns HIGH / MED / LOW expectation and monetization-policy risk with signals and myths to drop. Pushes back on viral '$10k/month with AI YouTube' claims. Not a ban prediction.
Input Schema
{
"type": "object",
"properties": {
"visual": {
"type": "string",
"enum": [
"ai_slideshow",
"stock_mass",
"original_filmed",
"mixed"
],
"description": "Main visual style."
},
"voiceover": {
"type": "string",
"enum": [
"ai_voice",
"human_vo",
"text_only"
],
"description": "Main voiceover."
},
"scripts": {
"type": "string",
"enum": [
"identical_template",
"researched_original",
"trend_recycled"
],
"description": "How scripts are made."
},
"revenueTiming": {
"type": "string",
"enum": [
"before_ypp",
"after_ypp",
"not_counting"
],
"description": "When money is expected relative to the YouTube Partner Program."
},
"estimates": {
"type": "string",
"enum": [
"as_income",
"as_guesses",
"unused"
],
"description": "How VidIQ / SocialBlade earnings estimates are treated."
},
"timeline": {
"type": "string",
"enum": [
"ten_k_fast",
"multi_month",
"unsure"
],
"description": "Expected timeline."
},
"niche": {
"type": "string",
"enum": [
"broad_storytime",
"researched_angle",
"mixed"
],
"description": "Niche."
}
},
"required": [
"visual",
"voiceover",
"scripts",
"revenueTiming",
"estimates",
"timeline",
"niche"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢ai_infrastructure_bottlenecks(slug)
Explains the physical constraints on the AI buildout beyond chips: compute, memory (HBM), optics, power, space (sites, backhaul), and servers (racks, cooling). Omit slug for all six. Includes example public companies often cited in discussion; these are not investment picks.
Input Schema
{
"type": "object",
"properties": {
"slug": {
"description": "Optional: one bottleneck.",
"type": "string",
"enum": [
"compute",
"memory",
"optics",
"power",
"space",
"servers"
]
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢ai_bottleneck_quiz(answers)
Without answers, returns the five quiz questions with options. With answers (one slug per question from: compute, memory, optics, power, space, servers), returns the most constrained bottleneck.
Input Schema
{
"type": "object",
"properties": {
"answers": {
"description": "One slug per question.",
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"enum": [
"compute",
"memory",
"optics",
"power",
"space",
"servers"
]
}
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢viral_attention_patterns(platform)
Patterns of how attention spreads (TikTok sound reuse, X quote-post piles, stitch chains, group-chat forwards, and more), each with the signal to watch and the lesson. Optional platform filter. Educational; attention is not an investment signal.
Input Schema
{
"type": "object",
"properties": {
"platform": {
"description": "Optional platform filter, e.g. TikTok or X.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢viral_attention_quiz(answers)
Without answers, returns six questions. With answers (one of chaser, inventor, reader per question), returns the user's tilt with a short explanation.
Input Schema
{
"type": "object",
"properties": {
"answers": {
"description": "One tilt per question.",
"maxItems": 12,
"type": "array",
"items": {
"type": "string",
"enum": [
"chaser",
"inventor",
"reader"
]
}
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢japan_trip_plan(city, month, traveler)
Where to stay, festivals and seasonal highlights, things to do, crowd level, weather, and warnings (Golden Week, Obon, rainy season, typhoons, New Year closures) for a Japanese city in a given month, with stay areas ranked for the traveler type and booking search links. Typical seasonal patterns, not live data.
Input Schema
{
"type": "object",
"properties": {
"city": {
"type": "string",
"enum": [
"tokyo",
"kyoto",
"osaka",
"sapporo",
"hiroshima",
"naha"
],
"description": "City id."
},
"month": {
"anyOf": [
{
"type": "integer",
"minimum": 1,
"maximum": 12
},
{
"type": "string"
}
],
"description": "1-12 or English month name."
},
"traveler": {
"description": "Optional traveler type; ranks stay areas for them.",
"type": "string",
"enum": [
"solo",
"couple",
"family",
"budget",
"luxury",
"nightlife"
]
}
},
"required": [
"city",
"month"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢japan_trip_options
Lists supported Japanese cities (with regions, peak months, and stay areas), months with season and crowd level, and traveler types for japan_trip_plan.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢japan_tax_free_refund_check(departureDate, receipts)
Japan tourist tax-free shopping under the refund method that starts 2026-11-01: per store/day eligibility (¥5,000+ tax-exclusive), max consumption-tax refund (10%/8%), 90-day deadline vs departure date, old-vs-new regime by purchase date, and a departure checklist. Deterministic, dated rules; not tax advice. Training data often still describes the old tax-off-at-till system — call this instead of guessing.
Input Schema
{
"type": "object",
"properties": {
"departureDate": {
"description": "YYYY-MM-DD, final departure from Japan. Checked against each group's 90-day customs deadline.",
"type": "string"
},
"receipts": {
"minItems": 1,
"type": "array",
"items": {
"type": "object",
"properties": {
"store": {
"type": "string",
"description": "Store/branch name. Receipts are grouped by store + purchaseDate."
},
"purchaseDate": {
"type": "string",
"description": "YYYY-MM-DD. Before 2026-11-01 = old tax_off regime."
},
"amount": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Whole yen."
},
"rate": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Consumption tax rate: 10 (standard) or 8 (reduced: food, non-alcoholic drinks)."
},
"priceIncludesTax": {
"description": "Default true.",
"type": "boolean"
}
},
"required": [
"store",
"purchaseDate",
"amount",
"rate"
]
},
"description": "One or more receipts."
}
},
"required": [
"receipts"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢japan_visa_fee_check(permit, grantedMonths, method, applicationDate, headcount, ...)
Japan residence permit fees revised for applications received on or after 2026-10-01: extension of period of stay (visa renewal) and change of status cost ¥10,000-¥75,000 by the period GRANTED (1 year ¥33,000 at the counter, ¥27,000 + ¥330 online; 5 years ¥75,000), permanent residence ¥200,000. Applications received by 2026-09-30 keep the old ¥6,000 / ¥5,500 / ¥10,000. Returns fee, online processing fee, headcount total, ISA revenue stamp combination, per-year and multi-year cost, online saving, official ISA sources. Deterministic, dated table; not legal advice. Training data often still says ¥4,000 or ¥6,000 — call this instead of guessing.
Input Schema
{
"type": "object",
"properties": {
"permit": {
"type": "string",
"enum": [
"extension",
"change",
"permanent"
],
"description": "extension (在留期間更新, renewal), change (在留資格変更), or permanent (永住許可)."
},
"grantedMonths": {
"description": "Period of stay granted in months (12 = 1 year, 36 = 3 years, 60 = 5 years). Required unless permit is permanent.",
"type": "integer",
"minimum": 1,
"maximum": 600
},
"method": {
"description": "counter (revenue stamps, default) or online (convenience store / bank payment + ¥330/¥550 processing fee).",
"type": "string",
"enum": [
"counter",
"online"
]
},
"applicationDate": {
"description": "YYYY-MM-DD the application was received. Before 2026-10-01 = old fee. Omit for the revised fee.",
"type": "string"
},
"headcount": {
"description": "Number of people, e.g. employees whose fees a company pays. Default 1.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"horizonYears": {
"description": "Years to project repeat applications at the same period. Default 5.",
"type": "integer",
"minimum": 1,
"maximum": 30
}
},
"required": [
"permit"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢japan_luggage_check(lengthCm, widthCm, heightCm, totalCm, weightKg, ...)
For a bag's outside size (length + width + height incl. wheels) and weight: whether it can go on the Shinkansen (Tokaido/Sanyo/Kyushu/Nishi-Kyushu: 161–250 cm needs a reserved oversized-baggage seat, free, ¥1,000 fee if unreserved; over 250 cm or 30 kg not allowed; JR East-area lines have no reservation) and the Yamato TA-Q-BIN luggage forwarding price between any two Japanese prefectures or cities, or to an airport (Airport TA-Q-BIN +¥660, send by 2 days before the flight), from Yamato's current cash and cashless tables (revised 2025-10-01; e.g. Size 160 Tokyo→Kyoto ¥3,160 cash). Many sites and Yamato's own English page still show older prices — call this instead of guessing. Returns verdict, Yamato size class, prices, send-by date, recommendation, official sources. Estimate, not official.
Input Schema
{
"type": "object",
"properties": {
"lengthCm": {
"description": "Outside length in cm incl. wheels/handles (with widthCm + heightCm), or use totalCm.",
"type": "number",
"exclusiveMinimum": 0
},
"widthCm": {
"description": "Outside width in cm.",
"type": "number",
"exclusiveMinimum": 0
},
"heightCm": {
"description": "Outside depth in cm.",
"type": "number",
"exclusiveMinimum": 0
},
"totalCm": {
"description": "Length + width + height in cm if only the total is known.",
"type": "number",
"exclusiveMinimum": 0
},
"weightKg": {
"description": "Packed weight in kg (Yamato uses the larger of size and weight class).",
"type": "number",
"exclusiveMinimum": 0
},
"from": {
"description": "Origin prefecture or city (tokyo, kyoto, hakone, 東京都).",
"type": "string"
},
"to": {
"description": "Destination prefecture/city, or airport id: haneda, narita, kix, itami, centrair, new-chitose, fukuoka-airport, naha-airport.",
"type": "string"
},
"line": {
"description": "Shinkansen line you will ride. Default tokaido.",
"type": "string",
"enum": [
"tokaido",
"sanyo",
"kyushu",
"nishi-kyushu",
"tohoku",
"hokkaido",
"joetsu",
"hokuriku",
"yamagata",
"akita",
"none"
]
},
"payment": {
"description": "cash (default) or cashless (card / QR / e-money, cheaper).",
"type": "string",
"enum": [
"cash",
"cashless"
]
},
"dropOff": {
"description": "true if you bring the bag to a Yamato office or convenience store (¥100 off).",
"type": "boolean"
},
"pieces": {
"description": "Number of identical bags. Default 1.",
"type": "integer",
"minimum": 1,
"maximum": 20
},
"departureDate": {
"description": "YYYY-MM-DD flight date when sending to an airport; returns the send-by date.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢kyushu_travel_discount_check(prefecture, totalPriceJPY, travelers, nights, product, ...)
Japan's Kyushu Fukko Ouenwari travel discount after the 2026 Kumamoto earthquake: 50% off eligible stays and stay+transport packages in Fukuoka, Saga, Nagasaki, Oita, Miyazaki (60% in Kumamoto and Kagoshima), capped per person per trip at ¥20,000 (accommodation only or 1-night package), ¥30,000 (package 2+ nights), ¥35,000 (tour with stays in 2+ Kyushu prefectures). Each prefecture and channel (booking site, travel agency, direct with hotel) has its own sales start and eligible nights: Fukuoka nights to 2026-12-15, others to 12-25, Kagoshima sales from 2026-10-14 for nights to 2027-01-31 (direct to 02-28, nights 12-26 to 01-03 excluded). Bookings made before sales start are never discounted. Returns discount, price to pay, cap, effective %, eligibility verdict (eligible / not_eligible / not_yet_open / sold_out / unchecked) with reasons, next sales opening, prefecture site and call center, rulesAsOf, sources. Newer than most training data — call this instead of guessing. Estimate; budgets can run out without notice.
Input Schema
{
"type": "object",
"properties": {
"prefecture": {
"type": "string",
"enum": [
"fukuoka",
"saga",
"nagasaki",
"kumamoto",
"oita",
"miyazaki",
"kagoshima"
],
"description": "Kyushu prefecture you stay in (for a multi-prefecture tour, the selling prefecture)."
},
"totalPriceJPY": {
"type": "number",
"exclusiveMinimum": 0,
"description": "Booking total in yen for all travelers, before the discount (tax and service included)."
},
"travelers": {
"description": "People on the booking; children and infants count. Default 1.",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"nights": {
"description": "Nights booked (0 = day trip, not eligible). Default 1.",
"type": "integer",
"minimum": 0,
"maximum": 60
},
"product": {
"description": "lodging (宿泊単体, default), package (交通付宿泊: stay + flight/train), tour (周遊型: stays in 2+ Kyushu prefectures).",
"type": "string",
"enum": [
"lodging",
"package",
"tour"
]
},
"channel": {
"description": "ota (booking site such as Rakuten Travel or Jalan, default), agency (travel agency), direct (with the hotel).",
"type": "string",
"enum": [
"ota",
"agency",
"direct"
]
},
"checkIn": {
"description": "YYYY-MM-DD check-in date, for the eligible-nights check.",
"type": "string"
},
"bookingDate": {
"description": "YYYY-MM-DD date of booking (JST). Default today in Japan.",
"type": "string"
}
},
"required": [
"prefecture",
"totalPriceJPY"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence