{"openapi":"3.1.0","info":{"title":"ScoutingAPI","version":"1.0.0","description":"One accommodation-data API for Airbnb, Booking.com, Vrbo and Google Hotels — availability, search and cross-OTA price comparison in a single unified schema. Every endpoint returns the canonical envelope (§6.3.3); errors use the locked sub-code catalog (§6.4). Failed, empty and blocked calls are never billed; cached results bill at tier (caching is margin, not a discount). Full docs: https://scoutingapi.com/docs.","contact":{"name":"ScoutingAPI","url":"https://scoutingapi.com/docs"},"license":{"name":"Proprietary"}},"servers":[{"url":"https://api.scoutingapi.com/v1","description":"REST API (v1)"}],"x-mcp":{"server":"https://mcp.scoutingapi.com/mcp","serverCard":"https://mcp.scoutingapi.com/.well-known/mcp.json","documentation":"https://scoutingapi.com/docs/mcp","authentication":"oauth2.1+pkce","description":"A native Model Context Protocol server exposes these endpoints as read-only tools for AI agents."},"security":[{"bearerAuth":[]}],"tags":[{"name":"Data","description":"Accommodation data endpoints"},{"name":"Account","description":"Account, plan and credit balance"},{"name":"Jobs","description":"Async job polling"}],"paths":{"/search":{"get":{"tags":["Data"],"operationId":"searchGet","summary":"Search properties across platforms (per-result: RATE×results per platform, min 5 credits; airbnb 2×, booking/vrbo 1×, google 15/page).","parameters":[{"name":"location","in":"query","required":true,"schema":{"type":"string"},"description":"Destination (city, region, address)."},{"name":"checkIn","in":"query","required":false,"schema":{"type":"string"},"description":"YYYY-MM-DD."},{"name":"checkOut","in":"query","required":false,"schema":{"type":"string"},"description":"YYYY-MM-DD."},{"name":"platforms","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated platforms; defaults to all enabled."},{"name":"adults","in":"query","required":false,"schema":{"type":"integer"},"description":"Default 2."},{"name":"children","in":"query","required":false,"schema":{"type":"integer"},"description":"Default 0; requires matching childAges."},{"name":"rooms","in":"query","required":false,"schema":{"type":"integer"},"description":"Default 1."},{"name":"currency","in":"query","required":false,"schema":{"type":"string"},"description":"ISO-4217; default USD."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"1–40; default 10."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor."},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"recommended | price_asc | price_desc | rating_desc."}],"responses":{"200":{"description":"Success.","headers":{"X-Request-Id":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Property"}}}}]}}}},"202":{"description":"Accepted — async job created; poll pollUrl. Retry-After hints the back-off.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before polling."},"X-Request-Id":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AsyncAccepted"}}}},"400":{"description":"Validation error (invalid_request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Authentication error (missing/invalid API key).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"402":{"description":"Insufficient credits (credit_balance_too_low).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Permission denied (e.g. email_unverified on live credits).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limited (rate_limit_exceeded); carries Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"All upstream sources failed or were blocked (no charge).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}},"post":{"tags":["Data"],"operationId":"searchPost","summary":"Search properties (JSON body form of GET /search).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"responses":{"200":{"description":"Success.","headers":{"X-Request-Id":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Property"}}}}]}}}},"202":{"description":"Accepted — async job created; poll pollUrl. Retry-After hints the back-off.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before polling."},"X-Request-Id":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AsyncAccepted"}}}},"400":{"description":"Validation error (invalid_request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Authentication error (missing/invalid API key).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"402":{"description":"Insufficient credits (credit_balance_too_low).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Permission denied (e.g. email_unverified on live credits).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limited (rate_limit_exceeded); carries Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"All upstream sources failed or were blocked (no charge).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/availability":{"get":{"tags":["Data"],"operationId":"availability","summary":"Nightly availability for a listing (max(5, ⌈days/2⌉) credits by requested date range).","description":"Provide EXACTLY ONE identification form: listingId, listingIds, or url. None → missing_parameter; conflicting forms → mutually_exclusive_params; a url that is not a well-formed listing URL for the platform → invalid_listing_url.","parameters":[{"name":"platform","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Platform"},"description":"Target platform (must be enabled for availability)."},{"name":"listingId","in":"query","required":false,"schema":{"type":"string"},"description":"Platform listing id (one identification form)."},{"name":"listingIds","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated listing ids (one identification form)."},{"name":"url","in":"query","required":false,"schema":{"type":"string"},"description":"Full listing URL for the platform (one identification form)."},{"name":"startDate","in":"query","required":true,"schema":{"type":"string"},"description":"YYYY-MM-DD (required)."},{"name":"endDate","in":"query","required":true,"schema":{"type":"string"},"description":"YYYY-MM-DD (required)."},{"name":"onlyAvailable","in":"query","required":false,"schema":{"type":"boolean"},"description":"Only return available dates."}],"responses":{"200":{"description":"Success.","headers":{"X-Request-Id":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Availability"}}}}]}}}},"202":{"description":"Accepted — async job created; poll pollUrl. Retry-After hints the back-off.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before polling."},"X-Request-Id":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AsyncAccepted"}}}},"400":{"description":"Validation error (invalid_request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Authentication error (missing/invalid API key).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"402":{"description":"Insufficient credits (credit_balance_too_low).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Permission denied (e.g. email_unverified on live credits).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limited (rate_limit_exceeded); carries Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"All upstream sources failed or were blocked (no charge).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/listing/{platform}/{id}":{"get":{"tags":["Data"],"operationId":"listing","summary":"Full normalized listing (3 credits/leg, flat).","parameters":[{"name":"platform","in":"path","required":true,"schema":{"$ref":"#/components/schemas/Platform"}},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"checkIn","in":"query","required":false,"schema":{"type":"string"},"description":"YYYY-MM-DD."},{"name":"checkOut","in":"query","required":false,"schema":{"type":"string"},"description":"YYYY-MM-DD."},{"name":"currency","in":"query","required":false,"schema":{"type":"string"},"description":"ISO-4217; default USD."}],"responses":{"200":{"description":"Success.","headers":{"X-Request-Id":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Property"}}}]}}}},"202":{"description":"Accepted — async job created; poll pollUrl. Retry-After hints the back-off.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before polling."},"X-Request-Id":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AsyncAccepted"}}}},"400":{"description":"Validation error (invalid_request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Authentication error (missing/invalid API key).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"402":{"description":"Insufficient credits (credit_balance_too_low).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Permission denied (e.g. email_unverified on live credits).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limited (rate_limit_exceeded); carries Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"All upstream sources failed or were blocked (no charge).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/price":{"get":{"tags":["Data"],"operationId":"price","summary":"Live price for a listing + dates (3 credits/leg, flat).","parameters":[{"name":"platform","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Platform"},"description":"Target platform (must be enabled for price)."},{"name":"listingId","in":"query","required":true,"schema":{"type":"string"},"description":"Platform listing id."},{"name":"checkIn","in":"query","required":true,"schema":{"type":"string"},"description":"YYYY-MM-DD (required)."},{"name":"checkOut","in":"query","required":true,"schema":{"type":"string"},"description":"YYYY-MM-DD (required)."},{"name":"currency","in":"query","required":false,"schema":{"type":"string"},"description":"ISO-4217; default USD."}],"responses":{"200":{"description":"Success.","headers":{"X-Request-Id":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Price"}}}]}}}},"202":{"description":"Accepted — async job created; poll pollUrl. Retry-After hints the back-off.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before polling."},"X-Request-Id":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AsyncAccepted"}}}},"400":{"description":"Validation error (invalid_request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Authentication error (missing/invalid API key).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"402":{"description":"Insufficient credits (credit_balance_too_low).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Permission denied (e.g. email_unverified on live credits).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limited (rate_limit_exceeded); carries Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"All upstream sources failed or were blocked (no charge).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/price-compare":{"get":{"tags":["Data"],"operationId":"priceCompare","summary":"Cross-OTA price comparison via Google (22 credits/leg, flat).","parameters":[{"name":"name","in":"query","required":false,"schema":{"type":"string"},"description":"Property name (one of name/location/googleHotelId)."},{"name":"location","in":"query","required":false,"schema":{"type":"string"},"description":"Location hint (one of name/location/googleHotelId)."},{"name":"googleHotelId","in":"query","required":false,"schema":{"type":"string"},"description":"Google hotel id (mutually exclusive with name/location)."},{"name":"checkIn","in":"query","required":true,"schema":{"type":"string"},"description":"YYYY-MM-DD (required)."},{"name":"checkOut","in":"query","required":true,"schema":{"type":"string"},"description":"YYYY-MM-DD (required)."},{"name":"currency","in":"query","required":false,"schema":{"type":"string"},"description":"ISO-4217; default USD."}],"responses":{"200":{"description":"Success.","headers":{"X-Request-Id":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PriceCompare"}}}]}}}},"202":{"description":"Accepted — async job created; poll pollUrl. Retry-After hints the back-off.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before polling."},"X-Request-Id":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AsyncAccepted"}}}},"400":{"description":"Validation error (invalid_request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Authentication error (missing/invalid API key).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"402":{"description":"Insufficient credits (credit_balance_too_low).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Permission denied (e.g. email_unverified on live credits).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limited (rate_limit_exceeded); carries Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"All upstream sources failed or were blocked (no charge).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/reviews":{"get":{"tags":["Data"],"operationId":"reviews","summary":"Listing reviews (per-review: RATE×reviews, min 5 credits; airbnb 5×, booking/vrbo 1×).","description":"Provide EXACTLY ONE of listingId or url. None → missing_parameter; both → mutually_exclusive_params; a bad url → invalid_listing_url.","parameters":[{"name":"platform","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Platform"},"description":"Target platform (must be enabled for reviews)."},{"name":"listingId","in":"query","required":false,"schema":{"type":"string"},"description":"Platform listing id (one identification form)."},{"name":"url","in":"query","required":false,"schema":{"type":"string"},"description":"Full listing URL (one identification form)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"1–100; default 20."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor."},{"name":"language","in":"query","required":false,"schema":{"type":"string"},"description":"ISO-639-1 filter."},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"recent | rating_desc | rating_asc."}],"responses":{"200":{"description":"Success.","headers":{"X-Request-Id":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Review"}}}}]}}}},"202":{"description":"Accepted — async job created; poll pollUrl. Retry-After hints the back-off.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before polling."},"X-Request-Id":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AsyncAccepted"}}}},"400":{"description":"Validation error (invalid_request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Authentication error (missing/invalid API key).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"402":{"description":"Insufficient credits (credit_balance_too_low).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Permission denied (e.g. email_unverified on live credits).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limited (rate_limit_exceeded); carries Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"All upstream sources failed or were blocked (no charge).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/account":{"get":{"tags":["Account"],"operationId":"account","summary":"Account, plan, credit balance and rate limit (0 credits).","description":"Programmatic introspection of the authenticated key: credit balance, plan (code/name/status), key env (live | sandbox) and the per-plan rate limit (requests/minute). Works for live and sandbox keys; free and never billed.","responses":{"200":{"description":"Success.","headers":{"X-Request-Id":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountEnvelope"}}}},"401":{"description":"Authentication error (missing/invalid API key).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limited (rate_limit_exceeded); carries Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/jobs/{jobId}":{"get":{"tags":["Jobs"],"operationId":"pollJob","summary":"Poll an async job (always 0 credits).","description":"Poll until status is terminal (completed | failed). While pending/running the response carries a Retry-After header. Enforces jobs.user_id == caller; unknown/not-owned/expired → job_not_found (404).","parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"string"},"description":"job_-prefixed id."}],"responses":{"200":{"description":"Job status (pending/running carry Retry-After; completed carries the result envelope).","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Present while the job is in progress."},"X-Request-Id":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Authentication error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"job_not_found (unknown, not owned, or expired).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Bearer API key. scout_test_ = deterministic sandbox (0 credits); scout_live_ = live."}},"schemas":{"Platform":{"type":"string","enum":["airbnb","booking","vrbo","expedia","hotels","google","tripadvisor"]},"Meta":{"type":"object","description":"Canonical response metadata present on every 200 (§6.3.3).","required":["requestId","platforms","cached","partial","creditsCharged","currency"],"properties":{"requestId":{"type":"string","pattern":"^req_[0-9A-HJKMNP-TV-Z]{26}$","description":"Correlation id (also the X-Request-Id header): req_ + 26-char Crockford ULID.","example":"req_01J8ZK3QF9ABCDEF0123456789"},"platforms":{"type":"array","items":{"$ref":"#/components/schemas/Platform"}},"cached":{"type":"boolean","description":"Served fully from cache. Cached results still bill at tier (margin, not discount)."},"partial":{"type":"boolean","description":"At least one fan-out leg failed; failed legs are charged 0."},"creditsCharged":{"type":"integer","minimum":0},"currency":{"type":"string","example":"USD"},"pagination":{"oneOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"null"}]},"platformResults":{"type":"array","items":{"$ref":"#/components/schemas/PlatformResult"}},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/Warning"}}}},"Pagination":{"type":"object","properties":{"limit":{"type":"integer"},"cursor":{"type":["string","null"]},"nextCursor":{"type":["string","null"],"description":"Opaque base64 cursor for the next page; null on the last page."},"hasMore":{"type":"boolean"}}},"PlatformResult":{"type":"object","properties":{"platform":{"$ref":"#/components/schemas/Platform"},"status":{"type":"string","enum":["ok","failed"]},"creditsCharged":{"type":"integer","minimum":0},"cached":{"type":"boolean"},"count":{"type":"integer","minimum":0},"error":{"$ref":"#/components/schemas/Error"}}},"Warning":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"platform":{"$ref":"#/components/schemas/Platform"}}},"Error":{"type":"object","description":"The canonical error object (§6.4). `code` is the SINGLE source of truth for error sub-codes.","required":["type","code","message","requestId","creditsCharged","retryable","docUrl"],"properties":{"type":{"type":"string","enum":["invalid_request","authentication_error","permission_denied","not_found","insufficient_credits","rate_limited","upstream_unavailable","upstream_timeout","internal_error"]},"code":{"type":"string","enum":["missing_parameter","invalid_parameter","invalid_date_range","date_in_past","child_ages_mismatch","stay_too_long","window_too_long","invalid_listing_url","invalid_property_type","invalid_amenity","invalid_price_range","invalid_language","invalid_sort","invalid_cursor","limit_out_of_range","mutually_exclusive_params","platform_not_enabled","no_enabled_platform","missing_api_key","invalid_api_key","revoked_api_key","scope_insufficient","email_unverified","listing_not_found","job_not_found","credit_balance_too_low","rate_limit_exceeded","all_actors_failed","actor_blocked","actor_timeout","internal_error"],"description":"Error sub-code; each has a docs page at https://scoutingapi.com/docs/errors/<code>."},"message":{"type":"string"},"param":{"type":["string","null"]},"requestId":{"type":"string","pattern":"^req_[0-9A-HJKMNP-TV-Z]{26}$"},"creditsCharged":{"type":"integer","enum":[0],"description":"Errors never bill (always 0)."},"retryable":{"type":"boolean"},"docUrl":{"type":"string","format":"uri"}}},"ErrorEnvelope":{"type":"object","required":["error"],"properties":{"error":{"$ref":"#/components/schemas/Error"}}},"Account":{"type":"object","description":"Authenticated account snapshot (§F1): plan, key env, credit balance and rate limit.","required":["plan","key","credits","rateLimit"],"properties":{"plan":{"type":"object","required":["code","name","status"],"properties":{"code":{"type":"string","example":"free","description":"Plan code (free|starter|pro|scale|enterprise)."},"name":{"type":"string","example":"Free / Sandbox"},"status":{"type":"string","enum":["trialing","active","past_due","canceled","incomplete","incomplete_expired","unpaid"],"description":"Subscription status."}}},"key":{"type":"object","required":["env"],"properties":{"env":{"type":"string","enum":["live","sandbox"],"description":"Key environment: live or sandbox (scout_test_)."}}},"credits":{"type":"object","required":["balance"],"properties":{"balance":{"type":"integer","description":"Current credit balance (latest ledger balance_after)."}}},"rateLimit":{"type":"object","required":["requestsPerMinute"],"properties":{"requestsPerMinute":{"type":"integer","minimum":1,"description":"Per-plan rate limit (requests/minute)."}}}}},"AccountEnvelope":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/Account"}}},"SuccessEnvelope":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/AnyData"},"meta":{"$ref":"#/components/schemas/Meta"}}},"AsyncAccepted":{"type":"object","description":"Returned (202) when projected runtime exceeds the 8s async threshold. Poll pollUrl until terminal. A Retry-After header hints the back-off.","required":["data","meta"],"properties":{"data":{"type":"object","properties":{"jobId":{"type":"string","example":"job_01J8ZK4R2ABCDEF0123456789"},"status":{"type":"string","enum":["pending"]},"pollUrl":{"type":"string","example":"/v1/jobs/job_01J8ZK4R2ABCDEF0123456789"},"estimatedSeconds":{"type":"integer"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"creditsCharged":{"type":"integer","enum":[0]},"platforms":{"type":"array","items":{"$ref":"#/components/schemas/Platform"}}}}}},"AnyData":{"description":"Endpoint-specific data payload."},"Property":{"type":"object","title":"Property","description":"Normalized Property (unified schema §6.8). See https://scoutingapi.com/docs/schema for the full field-level contract.","additionalProperties":true},"Availability":{"type":"object","title":"Availability","description":"Normalized Availability (unified schema §6.8). See https://scoutingapi.com/docs/schema for the full field-level contract.","additionalProperties":true},"Price":{"type":"object","title":"Price","description":"Normalized Price (unified schema §6.8). See https://scoutingapi.com/docs/schema for the full field-level contract.","additionalProperties":true},"PriceCompare":{"type":"object","title":"PriceCompare","description":"Normalized PriceCompare (unified schema §6.8). See https://scoutingapi.com/docs/schema for the full field-level contract.","additionalProperties":true},"Review":{"type":"object","title":"Review","description":"Normalized Review (unified schema §6.8). See https://scoutingapi.com/docs/schema for the full field-level contract.","additionalProperties":true}}},"x-error-codes-by-type":{"invalid_request":["missing_parameter","invalid_parameter","invalid_date_range","date_in_past","child_ages_mismatch","stay_too_long","window_too_long","invalid_listing_url","invalid_property_type","invalid_amenity","invalid_price_range","invalid_language","invalid_sort","invalid_cursor","limit_out_of_range","mutually_exclusive_params","platform_not_enabled","no_enabled_platform"],"authentication_error":["missing_api_key","invalid_api_key","revoked_api_key"],"permission_denied":["scope_insufficient","email_unverified"],"not_found":["listing_not_found","job_not_found"],"insufficient_credits":["credit_balance_too_low"],"rate_limited":["rate_limit_exceeded"],"upstream_unavailable":["all_actors_failed","actor_blocked"],"upstream_timeout":["actor_timeout"],"internal_error":["internal_error"]}}