{"data":{"$schema":"https://docs.mworks.com/schemas/pricing/v1.json","version":"1.50.0","updated_at":"2026-10-30","currency":"USD","credit":{"rate_per_credit_usd":0.05,"stripe_lookup_key_payg":"credits_metered","free_monthly_grant":2000,"free_grant_accumulates":false},"overage_policy":{"products":"payg","platform":"contact_sales"},"products":{"popcast":{"display_name":"Popcast","kicker":"Audience Intelligence","status":"production","operations":[{"id":"popcast_audience_query","display_name":"Audience Query","credits_per_call":2,"usd_per_call":0.1,"qualifier":null,"endpoints":["GET /v2/popcast/at-home","GET /v2/popcast/anytime"],"status":"production"},{"id":"popcast_custom_audience","display_name":"Custom Audience","credits_per_call":1000,"usd_per_call":50,"qualifier":"per audience","endpoints":["POST /v2/popcast/audiences"],"status":"production","note":"Flat one-time registration cost per custom audience. Retrieval charged separately via Audience Query."}],"skus":[{"id":"popcast_at_home_monthly","display_name":"Popcast At Home — Monthly","billing_cadence":"monthly","price_usd":500,"included_calls":5000,"included_operation_id":"popcast_audience_query","status":"production"},{"id":"popcast_at_home_annual","display_name":"Popcast At Home — Annual","billing_cadence":"annual","price_usd":6000,"included_calls_per_year":60000,"included_operation_id":"popcast_audience_query","status":"production"},{"id":"popcast_anytime_monthly","display_name":"Popcast Anytime (incl. At Home) — Monthly","billing_cadence":"monthly","price_usd":750,"included_calls":7500,"included_operation_id":"popcast_audience_query","status":"production"},{"id":"popcast_anytime_annual","display_name":"Popcast Anytime (incl. At Home) — Annual","billing_cadence":"annual","price_usd":9000,"included_calls_per_year":90000,"included_operation_id":"popcast_audience_query","status":"production"}],"addons":[]},"placecast":{"display_name":"Placecast","kicker":"Place Intelligence — Current Profiles and Event Analysis","status":"production","operations":[{"id":"placecast_profile_call","display_name":"Place Profile Call","credits_per_call":20,"usd_per_call":1,"qualifier":null,"endpoints":["GET /v2/placecast/profiles/:place_id"],"status":"production","note":"One place returns a full profile object with all details."},{"id":"placecast_custom_place","display_name":"Custom Place","credits_per_call":150,"usd_per_call":7.5,"qualifier":"per place","endpoints":["POST /v2/placecast/places"],"status":"production","note":"One place at a time. Register-once with large data object defining the place."}],"skus":[{"id":"placecast_profiles_standard_monthly","billing_cadence":"monthly","price_usd":1500,"expected_calls":3000,"scope":"standard","place_universe":"TBD","status":"production"},{"id":"placecast_profiles_mid_monthly","billing_cadence":"monthly","price_usd":2250,"expected_calls":4500,"scope":"mid","place_universe":"TBD","status":"production"},{"id":"placecast_profiles_full_monthly","billing_cadence":"monthly","price_usd":3000,"expected_calls":6000,"scope":"full","place_universe":"TBD","status":"production"},{"id":"placecast_profiles_standard_annual","billing_cadence":"annual","price_usd":18000,"expected_calls_per_year":36000,"scope":"standard","place_universe":"TBD","status":"production"},{"id":"placecast_profiles_mid_annual","billing_cadence":"annual","price_usd":27000,"expected_calls_per_year":54000,"scope":"mid","place_universe":"TBD","status":"production"},{"id":"placecast_profiles_full_annual","billing_cadence":"annual","price_usd":36000,"expected_calls_per_year":72000,"scope":"full","place_universe":"TBD","status":"production"}],"addons":[]},"pathcast":{"display_name":"Pathcast","kicker":"Traffic Volume Measurement","status":"roadmap","operations":[{"id":"pathcast_location_month","display_name":"Location-Month Lookup","credits_per_call":100,"usd_per_call":5,"qualifier":"per location-month","endpoints":["GET /v2/pathcast/paths/:id","GET /v2/pathcast/faces/:id/paths","GET /v2/pathcast/faces/:id/viewshed","GET /v2/pathcast/paths/:id/traffic","GET /v2/pathcast/paths/:id/history"],"status":"roadmap","note":"Direct data access via Snowflake/BigQuery; not API-metered. SKUs preserved as sales surface."}],"skus":[{"id":"pathcast_500","billing_cadence":"annual","price_usd":3750,"included_locations":500,"rate_per_location_yr":6.25,"annual_minimum_usd":3750,"status":"roadmap"},{"id":"pathcast_2000","billing_cadence":"annual","price_usd":11250,"included_locations":2000,"rate_per_location_yr":5.625,"status":"roadmap"},{"id":"pathcast_5000","billing_cadence":"annual","price_usd":25000,"included_locations":5000,"rate_per_location_yr":5,"status":"roadmap"},{"id":"pathcast_10000","billing_cadence":"annual","price_usd":43750,"included_locations":10000,"rate_per_location_yr":4.375,"status":"roadmap"},{"id":"pathcast_25000","billing_cadence":"annual","price_usd":93750,"included_locations":25000,"rate_per_location_yr":3.75,"status":"roadmap"},{"id":"pathcast_50000","billing_cadence":"annual","price_usd":171875,"included_locations":50000,"rate_per_location_yr":3.4375,"status":"roadmap"},{"id":"pathcast_100000","billing_cadence":"annual","price_usd":312500,"included_locations":100000,"rate_per_location_yr":3.125,"status":"roadmap"},{"id":"pathcast_unlimited","billing_cadence":"annual","price_usd":null,"included_locations":null,"rate_per_location_yr":2.8125,"status":"roadmap","note":"Rate beyond 100k locations."}]}},"platform":{"viewcast":{"display_name":"Viewcast","kicker":"OOH Display Planning — viewshed validation","status":"production","operations":[{"id":"viewcast_display_validation","display_name":"Viewcast Display Validation","credits_per_call":5,"usd_per_call":0.25,"qualifier":"per validation","endpoints":["POST /v2/viewcast/display-validation"],"status":"production","note":"MA-121: synchronous display-face validation against the BQ procedure mworks-product.viewcast.sketch_viewshed_v0 on the resurrected mw-api-viewcast worker. Customer-facing price is 5 cr/call; the endpoint is marked conditional in PRICING_MANIFEST (no CREDIT_COSTS claim) so the codegen skips the 5-cr endpoint entry, and the runtime 1-cr router base for the route lives in scripts/credit-costs-manual-additions.json. creditsForOperation = 5; the handler charges the 4-cr delta through deduct_credits, matching the displays purchase pattern. Results KV-cached 168h (MA-218); cache hits are still charged 5 credits."},{"id":"viewcast_on_demand_detail","display_name":"Viewcast On-Demand Detail","credits_per_call":1,"usd_per_call":0.05,"qualifier":null,"endpoints":["GET /v2/viewcast/on-demand/:asset_id"],"status":"production","note":"MA-125: asset + measurement detail on mw-api-viewcast. 1 cr, org-scoped, no-store."}]},"displays_profiles":{"display_name":"Displays","kicker":"OOH Audience Measurement — historical","status":"production","operations":[{"id":"displays_viewshed_purchase_draft","display_name":"Displays Viewshed Purchase (Draft)","credits_per_call":150,"usd_per_call":7.5,"qualifier":"per face","endpoints":["POST /v2/viewcast/measurements/purchase/:type"],"status":"production","note":"State-conditional purchase (150 cr when the asset is in state draft). Does NOT claim the endpoint in CREDIT_COSTS; the base 1 cr via displays_asset_crud is the CREDIT_COSTS entry. Replaces viewcast_custom_inventory (MA-79 / ADR-0037). MA-117 renamed from viewcast_viewshed_purchase_draft. MA-128 / ADR-0045: the route moved to mw-api-viewcast and the live purchase op is the viewcast_* twin; this op id is kept (append-only discipline) for ledger continuity — the displays cron still completes pre-cutover rows carrying this op name (ADR-0045 D6; the ledger CHECK admits both prefixes, migration 0064). MA-139 / ADR-0046: the route refactored from /v2/viewcast/measurements/:asset_id/purchase to /v2/viewcast/measurements/purchase/{type}; this endpoint annotation is the post-refactor shape (historical pre-cutover ledger rows carry the old path)."},{"id":"displays_viewshed_purchase_final","display_name":"Displays Viewshed Purchase (Final)","credits_per_call":300,"usd_per_call":15,"qualifier":null,"endpoints":["POST /v2/viewcast/measurements/purchase/:type"],"status":"production","note":"State-conditional purchase (300 cr when the asset is in state draft_measured, the owned-asset final transition). Does NOT claim the endpoint in CREDIT_COSTS; the base 1 cr via displays_asset_crud is the CREDIT_COSTS entry. Replaces viewcast_profile_call for the owned-asset transition (MA-79 / ADR-0037). MA-117 renamed from viewcast_viewshed_purchase_final. MA-128 / ADR-0045: the route moved to mw-api-viewcast and the live purchase op is the viewcast_* twin; this op id is kept (append-only discipline) for ledger continuity (ADR-0045 D6; migration 0064 CHECK admits both prefixes). MA-139 / ADR-0046: the route refactored from /v2/viewcast/measurements/:asset_id/purchase to /v2/viewcast/measurements/purchase/{type}; this endpoint annotation is the post-refactor shape (historical pre-cutover ledger rows carry the old path)."},{"id":"displays_asset_crud","display_name":"Displays Asset CRUD","credits_per_call":1,"usd_per_call":0.05,"qualifier":null,"endpoints":["POST /v2/displays/assets","GET /v2/displays/assets","GET /v2/displays/assets/:asset_id","PATCH /v2/displays/assets/:asset_id","DELETE /v2/displays/assets/:asset_id","GET /v2/displays/assets/summary"],"status":"production","note":"Library listing, detail, refine, archive, summary, and draft create calls on the Displays Asset library. Carries the base CREDIT_COSTS claim for the conditional purchase endpoints (MA-79 / ADR-0037). Merged into the Displays worker (MA-113): endpoints re-pathed from /v2/viewcast/* to /v2/displays/* on 2026-09-02. MA-117 renamed from viewcast_asset_crud. MA-128 / ADR-0045: the measurement purchase/poll and profile-read endpoints moved to /v2/viewcast/* (base claim via viewcast_asset_crud); removed from this list."},{"id":"displays_viewshed_purchase_direct","display_name":"Displays Viewshed Purchase (Direct Add)","credits_per_call":300,"usd_per_call":15,"qualifier":null,"endpoints":["POST /v2/viewcast/measurements/purchase/:type"],"status":"production","note":"Ledger-history twin (append-only discipline, ADR-0045 D6): historical ledger rows carry this op id; the live direct-add op is the viewcast_* twin. MA-144 (2026-09-05): endpoint annotation re-pointed from the retired direct-add surface GET /v2/viewcast/profiles/:display_id (MA-143 stripped it back to a pure licensed read, PR #580) to POST /v2/viewcast/measurements/purchase/:type so the published manifest no longer presents a 300 cr charge on the profile-read endpoint; annotation-only, no DB migration (the codegen drift gate covers seed + snapshot; the ops CHECK constraint admits both prefixes). Direct-add purchase (300 cr when the caller org does not own the display). Auto-adds the face to the caller org assets, related_parties empty (the DB default \"[]\"::jsonb), starts a 12-month measurement subscription clocked from purchase date. Does NOT claim the endpoint in CREDIT_COSTS; the base 1 cr via displays_asset_crud is the CREDIT_COSTS entry. Replaces viewcast_profile_call for the direct-add path (MA-79 / ADR-0037). MA-117 renamed from viewcast_viewshed_purchase_direct. MA-128 / ADR-0045: the route moved to mw-api-viewcast and the live direct-add op is the viewcast_* twin; this op id is kept (append-only discipline) for ledger continuity (ADR-0045 D6)."},{"id":"displays_search","display_name":"Displays Search","credits_per_call":1,"usd_per_call":0.05,"qualifier":null,"endpoints":["POST /v2/displays/search"],"status":"production","note":"MA-115 Card 5: ES-backed public display search. 1 credit per search request. Feature key oohdisplays.displays.search (provisional). Authenticated-only (no anonymous search at launch)."},{"id":"viewcast_viewshed_purchase_draft","display_name":"Viewcast Viewshed Purchase (Draft)","credits_per_call":150,"usd_per_call":7.5,"qualifier":"per face","endpoints":["POST /v2/viewcast/measurements/purchase/:type","POST /v2/viewcast/measurements/purchase/:type/batch"],"status":"production","note":"MA-128 / ADR-0045: the draft-measurement purchase moved from the displays worker to /v2/viewcast/measurements/:asset_id/purchase (op renamed back from displays_viewshed_purchase_draft). State-conditional purchase (150 cr when the asset is in state draft). Does NOT claim the endpoint in CREDIT_COSTS; the base 1 cr via viewcast_asset_crud is the CREDIT_COSTS entry. MA-139 / ADR-0046: the route refactored to /v2/viewcast/measurements/purchase/{type} (type in {draft, final, direct}); asset_id moved from path to body. MA-192 / ADR-0058 (2026-09-11): batch purchase surface (/purchase/{type}/batch, 1..100 items, sync, per-item outcomes); batch calls charge this op PER QUEUED ITEM (the 149-cr delta = 150 rate minus the 1-cr base share, x queued_count; the base rides viewcast_asset_crud once per call), never per call."},{"id":"viewcast_viewshed_purchase_final","display_name":"Viewcast Viewshed Purchase (Final)","credits_per_call":300,"usd_per_call":15,"qualifier":null,"endpoints":["POST /v2/viewcast/measurements/purchase/:type","POST /v2/viewcast/measurements/purchase/:type/batch"],"status":"production","note":"MA-128 / ADR-0045: the final-measurement purchase moved to /v2/viewcast/measurements/:asset_id/purchase (op renamed back from displays_viewshed_purchase_final). State-conditional purchase (300 cr when the asset is in state draft_measured). Does NOT claim the endpoint in CREDIT_COSTS; the base 1 cr via viewcast_asset_crud is the CREDIT_COSTS entry. MA-139 / ADR-0046: the route refactored to /v2/viewcast/measurements/purchase/{type} (type in {draft, final, direct}); asset_id moved from path to body. MA-192 / ADR-0058 (2026-09-11): batch purchase surface; batch calls charge this op PER QUEUED ITEM (the 299-cr delta = 300 rate minus the 1-cr base share, x queued_count; the base rides viewcast_asset_crud once per call)."},{"id":"viewcast_asset_crud","display_name":"Viewcast Asset CRUD","credits_per_call":1,"usd_per_call":0.05,"qualifier":null,"endpoints":["POST /v2/viewcast/measurements/purchase/:type","POST /v2/viewcast/measurements/purchase/:type/batch","GET /v2/viewcast/profiles/:display_id"],"status":"production","note":"MA-128 / ADR-0045: base 1-cr op for the measurement + profile surface on the viewcast worker (op renamed back from displays_asset_crud). Carries the base CREDIT_COSTS claim for the conditional purchase endpoints. The asset-library CRUD routes stay on the displays worker under displays_asset_crud. MA-139 / ADR-0046: the purchase route refactored from /v2/viewcast/measurements/:asset_id/purchase to /v2/viewcast/measurements/purchase/:type (codegen normalizes :type to :id; the retired key is dropped here so the router billing middleware keeps charging the 1-cr base on the new path). MA-168 / ADR-0053 (2026-09-08): the measurement latest-poll went free (0 cr, op viewcast_measurement_poll under reference_operations); polling with no data is free. MA-192 / ADR-0058 (2026-09-11): the batch purchase route /purchase/:type/batch carries the same 1-cr base ONCE per call; per-item charges ride the conditional purchase ops."},{"id":"viewcast_viewshed_purchase_direct","display_name":"Viewcast Viewshed Purchase (Direct Add)","credits_per_call":300,"usd_per_call":15,"qualifier":null,"endpoints":["POST /v2/viewcast/measurements/purchase/:type","POST /v2/viewcast/measurements/purchase/:type/batch"],"status":"production","note":"MA-143 (2026-09-04): the direct-add purchase was STRIPPED from GET /v2/viewcast/profiles/:display_id, which is now a pure licensed read (403 FEATURE_NOT_LICENSED when unowned, pointing here). This op's surface is now POST /v2/viewcast/measurements/purchase/{type} (MA-139 / ADR-0046), its first real consumer. Direct-add purchase (300 cr when the caller org does not own the display). Does NOT claim the endpoint in CREDIT_COSTS; the base 1 cr via viewcast_asset_crud is the CREDIT_COSTS entry. The op id is retained (append-only discipline) for ledger continuity (ADR-0045 D6); deletion is deferred to a later cleanup card once MA-139 is live and ledger history is cold. MA-128 / ADR-0045: the direct-add profile purchase moved to /v2/viewcast/profiles/:display_id (op renamed back from displays_viewshed_purchase_direct). MA-192 / ADR-0058 (2026-09-11): batch purchase surface; batch calls charge this op PER QUEUED ITEM (the 299-cr delta = 300 rate minus the 1-cr base share, x queued_count; the base rides viewcast_asset_crud once per call)."}],"skus":[{"id":"displays_t1","billing_cadence":"annual","price_usd":5000,"weekly_impression_tier":"1M","included_calls_per_year":333,"status":"production"},{"id":"displays_t2","billing_cadence":"annual","price_usd":10750,"weekly_impression_tier":"5M","included_calls_per_year":717,"status":"production"},{"id":"displays_t3","billing_cadence":"annual","price_usd":12000,"weekly_impression_tier":"10M","included_calls_per_year":800,"status":"production"},{"id":"displays_t4","billing_cadence":"annual","price_usd":18000,"weekly_impression_tier":"25M","included_calls_per_year":1200,"status":"production"},{"id":"displays_t5","billing_cadence":"annual","price_usd":45500,"weekly_impression_tier":"100M","included_calls_per_year":3033,"status":"production"},{"id":"displays_t6","billing_cadence":"annual","price_usd":90000,"weekly_impression_tier":"250M","included_calls_per_year":6000,"status":"production"},{"id":"displays_t7","billing_cadence":"annual","price_usd":146500,"weekly_impression_tier":"500M","included_calls_per_year":9767,"status":"production"},{"id":"displays_t8","billing_cadence":"annual","price_usd":194000,"weekly_impression_tier":"1B","included_calls_per_year":12933,"status":"production"},{"id":"displays_t9","billing_cadence":"annual","price_usd":417000,"weekly_impression_tier":"3B","included_calls_per_year":27800,"status":"production"},{"id":"displays_t10","billing_cadence":"annual","price_usd":500000,"weekly_impression_tier":"6B","included_calls_per_year":33333,"status":"production"},{"id":"displays_t11","billing_cadence":"annual","price_usd":600000,"weekly_impression_tier":"12B","included_calls_per_year":40000,"cap":"all_you_can_eat","status":"production","note":"Ceiling tier — largest US operator @ ~12B weekly impressions. Intentional all-you-can-eat cap."}]},"viewcast_select":{"display_name":"Viewcast Select","kicker":"Viewcast Select — Deduplicated Reach + Frequency","status":"production","operations":[{"id":"scenario_campaign_crud","display_name":"Scenario Campaign CRUD","credits_per_call":1,"usd_per_call":0.05,"qualifier":null,"endpoints":["POST /v2/scenarios/campaigns","GET /v2/scenarios/campaigns","GET /v2/scenarios/campaigns/summary","GET /v2/scenarios/campaigns/:id","PATCH /v2/scenarios/campaigns/:id","DELETE /v2/scenarios/campaigns/:id"],"status":"production","note":"MA-193 / MA-194 (ADR-0055, superseded by ADR-0056 for the external naming correction). Shipped by MA-196 (2026-09-14) on a new mw-api-scenarios worker (asset library, mirrors mw-api-displays) — Scenarios is Motionworks' asset-management surface for scenario-based products; Campaign is the first. Renamed from campaign_asset_crud / re-pathed from /v2/campaigns/assets* (external naming correction, 2026-09-14). Distinct from legacy Set Dynamics. Flipped from 'planned' by the MA-202 console-wiring review (www#788), which found the docs/openapi/scenarios.yaml x-motionworks-status still said 'roadmap' weeks after the worker shipped."},{"id":"viewcast_select_purchase","display_name":"Viewcast Select Purchase","credits_per_call":5000,"usd_per_call":250,"qualifier":"per purchase","endpoints":["POST /v2/viewcast/measurements/purchase/select"],"status":"production","note":"MA-193 / MA-194 (ADR-0055, superseded by ADR-0056 for the external naming correction). Shipped by MA-197 (2026-09-15) on a new mw-api-viewcast-select worker (measurement surface, kept separate from the live mw-api-viewcast worker for blast-radius isolation — a bug in this heavier, campaign-scale analysis path cannot destabilize live display-purchase traffic). asset_id carried in the request body, not the path. Auto-refunded, less the router's 1-credit base charge for the API call itself, on a failed run (4,999 of 5,000 — see orphan.ts / engine.ts's REFUND_DELTA; MA-260 caught this note still claiming 'in full', mirroring the api#729 fix on placecast_select_purchase). Renamed from campaign_measurement_purchase / re-pathed from /v2/campaign-analysis/measurements/purchase (external naming correction, 2026-09-14)."},{"id":"viewcast_select_report","display_name":"Viewcast Select Report","credits_per_call":1,"usd_per_call":0.05,"qualifier":null,"endpoints":["GET /v2/viewcast/select/:id"],"status":"production","note":"Renamed from campaign_report_retrieve / re-pathed from /v2/campaign-analysis/report/:id (external naming correction, 2026-09-14). Shipped by MA-198 (2026-09-15) on mw-api-viewcast-select. Serves the report while the campaign asset is in_flight (interim, updated weekly) or completed (final)."},{"id":"viewcast_select_share","display_name":"Viewcast Select Share Link","credits_per_call":1,"usd_per_call":0.05,"qualifier":null,"endpoints":["POST /v2/viewcast/select/:id/share","POST /v2/viewcast/select/:id/share/renew","GET /v2/viewcast/select/:id/share"],"status":"production","note":"MA-325 / ADR-0073. Create (or regenerate), renew and check the 90-day public link to a completed campaign report. The link is returned once, on create. Shipped by MA-326 on mw-api-viewcast-select; production with the public read (MA-327)."}],"skus_subscription":[{"id":"cm_sub_t1","billing_cadence":"annual","price_usd":36000,"weekly_impression_tier":"1M","included_campaigns_per_year":144,"status":"planned"},{"id":"cm_sub_t2","billing_cadence":"annual","price_usd":72000,"weekly_impression_tier":"5M","included_campaigns_per_year":288,"status":"planned"},{"id":"cm_sub_t3","billing_cadence":"annual","price_usd":108000,"weekly_impression_tier":"10M","included_campaigns_per_year":432,"status":"planned"},{"id":"cm_sub_t4","billing_cadence":"annual","price_usd":180000,"weekly_impression_tier":"25M","included_campaigns_per_year":720,"status":"planned"},{"id":"cm_sub_t5","billing_cadence":"annual","price_usd":300000,"weekly_impression_tier":"100M","included_campaigns_per_year":1200,"status":"planned"},{"id":"cm_sub_t6","billing_cadence":"annual","price_usd":500000,"weekly_impression_tier":"500M","included_campaigns_per_year":2000,"status":"planned"},{"id":"cm_sub_t7","billing_cadence":"annual","price_usd":750000,"weekly_impression_tier":"1B","included_campaigns_per_year":3000,"status":"planned"}],"skus_per_event":[{"id":"cm_event_le_50","billing_cadence":"one-time","max_events":50,"price_usd_per_event":1650,"pricing_basis":"Pathcast Select + 10%","status":"planned"},{"id":"cm_event_le_250","billing_cadence":"one-time","max_events":250,"price_usd_per_event":825,"pricing_basis":"Pathcast Select + 10%","status":"planned"},{"id":"cm_event_le_1000","billing_cadence":"one-time","max_events":1000,"price_usd_per_event":440,"pricing_basis":"Pathcast Select + 10%","status":"planned"},{"id":"cm_event_le_5000","billing_cadence":"one-time","max_events":5000,"price_usd_per_event":220,"pricing_basis":"Pathcast Select + 10%","status":"planned"},{"id":"cm_event_le_10000","billing_cadence":"one-time","max_events":10000,"price_usd_per_event":137.5,"pricing_basis":"Pathcast Select + 10%","status":"planned"},{"id":"cm_event_le_25000","billing_cadence":"one-time","max_events":25000,"price_usd_per_event":82.5,"pricing_basis":"Pathcast Select + 10%","status":"planned"},{"id":"cm_event_le_50000","billing_cadence":"one-time","max_events":50000,"price_usd_per_event":55,"pricing_basis":"Pathcast Select + 10%","status":"planned"},{"id":"cm_event_unlimited","billing_cadence":"one-time","max_events":null,"price_usd_per_event":27.5,"pricing_basis":"Pathcast Select + 10%","status":"planned"}],"legacy_endpoints":{"note":"set-dynamics endpoints (POST /v2/set-dynamics/scenarios, GET ...) remain in docs/openapi/set-dynamics.yaml as legacy/internal; Campaign is a forward-looking surface, not a rename."}},"placecast_select":{"display_name":"Placecast Select","kicker":"Placecast Select — Event Reach + Frequency","status":"production","operations":[{"id":"scenario_event_crud","display_name":"Scenario Event CRUD","credits_per_call":1,"usd_per_call":0.05,"qualifier":null,"endpoints":["POST /v2/scenarios/events","GET /v2/scenarios/events","GET /v2/scenarios/events/summary","GET /v2/scenarios/events/:id","PATCH /v2/scenarios/events/:id","DELETE /v2/scenarios/events/:id"],"status":"production","note":"MA-250 / MA-251 (ADR-0062, schema reconciled by ADR-0065). Shipped by MA-253 (Story 3, 2026-09-21) on the existing mw-api-scenarios worker (services/scenarios/src/events.ts), mirroring scenario_campaign_crud's handler shape field-for-field — periods[]/place_ids[]/name/description/timezone in place of flight/spots[]/campaign (ADR-0065), not a places[]/place_id rename as originally planned in ADR-0062 §2.6."},{"id":"placecast_select_purchase","display_name":"Placecast Select Purchase","credits_per_call":30000,"usd_per_call":1500,"qualifier":"per purchase","endpoints":["POST /v2/placecast/measurements/purchase/select"],"status":"production","note":"MA-250 / MA-251 (ADR-0062 §1). 30,000cr ($1,500) matches the pre-existing placecast_select_event SKU (moved here from products.placecast, see skus[] below) exactly — that SKU had no op billing against it since the op it was presumably scoped for (placecast_select_submit) was a pure 501 stub, retired by this same ADR. asset_id carried in the request body, not the path. Auto-refunded, less the router's 1-credit base charge for the API call itself, on a failed run (29,999 of 30,000 — see orphan.ts's REFUND_DELTA; MA-258 www#794 review caught this note still claiming 'in full'). Served by a new mw-api-placecast-select worker, kept separate from the live mw-api-placecast worker for blast-radius isolation, mirroring the viewcast_select_purchase / mw-api-viewcast-select precedent. MA-254 (Story 4, 2026-09-21) stood up mw-api-placecast-select and shipped the real purchase handler; MA-255 (Story 5, 2026-09-21) shipped poll + report alongside it, so this op flips to 'production' together with them, mirroring how viewcast_select_purchase and viewcast_select_report flipped to 'production' TOGETHER in the MA-197+MA-198 timeframe, not individually."},{"id":"placecast_select_poll","display_name":"Placecast Select Poll","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["GET /v2/placecast/measurements/:id"],"status":"production","note":"MA-250 / MA-251 (ADR-0062 §2.3). Unlike viewcast_measurement_poll (a reference_operations freebie Viewcast Select merely reuses), this is a REAL, new op on the new worker — Placecast has no existing per-asset measurement-poll route to fold into. Shipped by MA-255 (Story 5, 2026-09-21) — reports event_assets.state honestly across all five values (no synthetic 'queued' fallback for a never-purchased asset; the campaign-scenario precedent in measurements-latest.ts already resolved that exact question the same way)."},{"id":"placecast_select_report","display_name":"Placecast Select Report","credits_per_call":1,"usd_per_call":0.05,"qualifier":null,"endpoints":["GET /v2/placecast/select/:id"],"status":"production","note":"MA-250 / MA-251 (ADR-0062 §1). Reuses the path template of the retired placecast_select_retrieve stub (never wired to a real backend). Serves the report while the event asset is in_flight (interim, updated weekly) or completed (final). Shipped by MA-255 (Story 5, 2026-09-21) on mw-api-placecast-select, ported near-verbatim from services/viewcast-select/src/report.ts (MA-198)."},{"id":"place_set_crud","display_name":"Place Set CRUD","credits_per_call":1,"usd_per_call":0.05,"qualifier":null,"endpoints":["POST /v2/sets/places","GET /v2/sets/places","GET /v2/sets/places/:id","PUT /v2/sets/places/:id","DELETE /v2/sets/places/:id","GET /v2/sets/places/:id/items","POST /v2/sets/places/:id/items","POST /v2/sets/places/:id/items/remove","GET /v2/sets/places/:id/download"],"status":"production","note":"MA-278 (phase 1 2026-10-07, phase 2 2026-10-10): reusable place sets on the existing mw-api-scenarios worker (services/scenarios/src/place-sets.ts, place-set-loads.ts), so Placecast Select events can reference large place lists by id instead of inline place_ids (capped by the procedure input, MA-276). A set is created from a CSV upload (signed cloud-storage URL; the upload is confirmed by an internal GCS notification, never billed) or an inline list of up to 10,000 ids, loaded into BigQuery (DATA-5845 members table), and can then be browsed, edited 10,000 ids at a time, replaced, downloaded as one CSV and deleted. Every call is 1 credit; production from the first deploy because the router bills every call (PR #750 review)."}],"skus":[{"id":"placecast_select_event","billing_cadence":"one-time","price_usd_per_event":1500,"status":"production","note":"Default per-event rate; tiered discount table TBD. Moved from products.placecast (product_key reassignment, ADR-0062 §1) — the op it was originally scoped for (placecast_select_submit) never shipped a real backend. Flips to production alongside placecast_select_purchase (MA-255) — this is the exact $1,500 rate the now-live purchase op charges, not a hypothetical future tier."}]},"segments":{"display_name":"Segments","kicker":"Audience Segments — search, purchase, library","status":"roadmap","operations":[{"id":"segments_search","display_name":"Segment Search","credits_per_call":1,"usd_per_call":0.05,"qualifier":null,"endpoints":["POST /v2/segments/search"],"status":"production","note":"MA-310 / ADR-0072 §3. Plain-text (q) or Elasticsearch query (es_query) search of the audience segment catalog; each item carries every catalog field, its price and whether the org already owns it. Shipped by MA-314 on mw-api-segments, with the free autocomplete."},{"id":"segments_asset_crud","display_name":"Segment Library","credits_per_call":1,"usd_per_call":0.05,"qualifier":null,"endpoints":["GET /v2/segments/assets","GET /v2/segments/assets/summary","GET /v2/segments/assets/:asset_id","POST /v2/segments/purchase"],"status":"roadmap","note":"MA-310 / ADR-0072 §5. List, summary and read of the org's purchased segments. Carries the base CREDIT_COSTS claim for the conditional purchase endpoint (the displays_asset_crud / viewcast_asset_crud pattern, ADR-0037): every purchase pays this 1 credit at the router, and the handler deducts the rest of the tier price. Route wired by MA-313; handlers land with MA-315 (purchase) and MA-316 (library)."},{"id":"segments_purchase_free","display_name":"Segment Purchase (Free)","credits_per_call":1,"usd_per_call":0.05,"qualifier":"per segment","endpoints":["POST /v2/segments/purchase"],"status":"roadmap","note":"ADR-0072 §4. Total for a segment in the free tier: just the 1-credit call charge (the handler deducts nothing more). A segment's tier, and any per-segment credits_override, comes from segment_pricing (MA-315). Buying a segment the org already owns also costs only the 1-credit call charge."},{"id":"segments_purchase_standard","display_name":"Segment Purchase (Standard)","credits_per_call":1,"usd_per_call":0.05,"qualifier":"per segment","endpoints":["POST /v2/segments/purchase"],"status":"roadmap","note":"ADR-0072 §4. PLACEHOLDER pending product: total for a standard-tier segment, including the 1-credit call charge; the handler deducts total − 1. A segment with no segment_pricing row is standard. Must be set before MA-315 ships."},{"id":"segments_purchase_premium","display_name":"Segment Purchase (Premium)","credits_per_call":1,"usd_per_call":0.05,"qualifier":"per segment","endpoints":["POST /v2/segments/purchase"],"status":"roadmap","note":"ADR-0072 §4. PLACEHOLDER pending product: total for a premium-tier segment, including the 1-credit call charge; the handler deducts total − 1. Must be set before MA-315 ships."}]}},"reference_operations":[{"id":"popcast_reference_call","display_name":"Popcast Reference Call","credits_per_call":1,"usd_per_call":0.05,"qualifier":null,"endpoints":["POST /v2/popcast/segments","GET /v2/popcast/segments","GET /v2/popcast/segments/:id"],"note":"Audience segment list + detail. Cross-cutting reference data for Popcast queries."},{"id":"markets_reference_call","display_name":"Markets Reference Call","credits_per_call":1,"usd_per_call":0.05,"qualifier":null,"endpoints":["GET /v2/markets","GET /v2/markets/:id"],"note":"DMA list + detail. Cross-cutting reference data for geography-scoped operations."},{"id":"places_reference_call","display_name":"Places Reference Call","credits_per_call":1,"usd_per_call":0.05,"qualifier":null,"endpoints":["GET /v2/places","GET /v2/places/:poi_id"],"group_label":"Placecast Library","note":"POI-anchored Places Library lookup + filtered retrieval (ADR-024)."},{"id":"places_brand_detail","display_name":"Places Brand Detail","credits_per_call":1,"usd_per_call":0.05,"qualifier":null,"endpoints":["GET /v2/places/brands/:brand_id"],"group_label":"Placecast Library","note":"Brand-level footprint roll-up (count, top states + cities, centroid) backed by the brand_rollup materialized view (ADR-024 amendment, app-mworks-com#156)."},{"id":"paths_tiles_fetch","display_name":"Paths Vector Tile Fetch","credits_per_call":1,"usd_per_call":0.05,"qualifier":"per 1000 tiles served","meter_divisor":1000,"endpoints":["GET /v2/paths/tiles/{layer}/{z}/{x}/{y}.mvt"],"status":"production","group_label":"Pathcast Maptiles Access","note":"Motionworks Paths roadway-volume vector tiles. Metered at 1 credit per 1,000 tiles served. The grant/tilejson control-plane endpoints below are free."},{"id":"paths_tiles_grant_create","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["POST /v2/paths/tiles/grants"],"group_label":"Pathcast Maptiles Access"},{"id":"paths_tiles_grant_list","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["GET /v2/paths/tiles/grants"],"group_label":"Pathcast Maptiles Access"},{"id":"paths_tiles_tilesets","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["GET /v2/paths/tiles/tilesets"],"group_label":"Pathcast Maptiles Access"},{"id":"paths_tiles_grant_get","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["GET /v2/paths/tiles/grants/:id"],"group_label":"Pathcast Maptiles Access"},{"id":"paths_tiles_grant_revoke","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["POST /v2/paths/tiles/grants/:id/revoke"],"group_label":"Pathcast Maptiles Access"},{"id":"paths_tiles_tilejson","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["GET /v2/paths/tiles/grants/:id/tilejson"],"group_label":"Pathcast Maptiles Access"},{"id":"placecast_tiles_fetch","display_name":"Placecast Vector Tile Fetch","credits_per_call":1,"usd_per_call":0.05,"qualifier":"per 1000 tiles served","meter_divisor":1000,"endpoints":["GET /v2/placecast/tiles/{layer}/{z}/{x}/{y}.mvt"],"status":"production","group_label":"Placecast Maptiles Access","note":"Motionworks Placecast place-intelligence vector tiles (buildings + DCA polygons). Metered at 1 credit per 1,000 tiles served. The grant/tilejson control-plane endpoints below are free."},{"id":"placecast_tiles_grant_create","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["POST /v2/placecast/tiles/grants"],"group_label":"Placecast Maptiles Access"},{"id":"placecast_tiles_grant_list","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["GET /v2/placecast/tiles/grants"],"group_label":"Placecast Maptiles Access"},{"id":"placecast_tiles_tilesets","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["GET /v2/placecast/tiles/tilesets"],"group_label":"Placecast Maptiles Access"},{"id":"placecast_tiles_grant_get","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["GET /v2/placecast/tiles/grants/:id"],"group_label":"Placecast Maptiles Access"},{"id":"placecast_tiles_grant_revoke","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["POST /v2/placecast/tiles/grants/:id/revoke"],"group_label":"Placecast Maptiles Access"},{"id":"placecast_tiles_tilejson","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["GET /v2/placecast/tiles/grants/:id/tilejson"],"group_label":"Placecast Maptiles Access"},{"id":"places_tiles_fetch","display_name":"Placecast Vector Tile Fetch","credits_per_call":1,"usd_per_call":0.05,"qualifier":"per 1000 tiles served","meter_divisor":1000,"endpoints":["GET /v2/places/tiles/{layer}/{z}/{x}/{y}.mvt"],"status":"production","group_label":"Placecast Maptiles Access","note":"Motionworks Places place-intelligence vector tiles. Metered at 1 credit per 1,000 tiles served. The grant/tilejson control-plane endpoints below are free."},{"id":"places_tiles_grant_create","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["POST /v2/places/tiles/grants"],"group_label":"Placecast Maptiles Access"},{"id":"places_tiles_grant_list","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["GET /v2/places/tiles/grants"],"group_label":"Placecast Maptiles Access"},{"id":"places_tiles_tilesets","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["GET /v2/places/tiles/tilesets"],"group_label":"Placecast Maptiles Access"},{"id":"places_tiles_grant_get","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["GET /v2/places/tiles/grants/:id"],"group_label":"Placecast Maptiles Access"},{"id":"places_tiles_grant_revoke","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["POST /v2/places/tiles/grants/:id/revoke"],"group_label":"Placecast Maptiles Access"},{"id":"places_tiles_tilejson","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["GET /v2/places/tiles/grants/:id/tilejson"],"group_label":"Placecast Maptiles Access"},{"id":"displays_tiles_fetch","display_name":"OOH Displays Vector Tile Fetch","credits_per_call":1,"usd_per_call":0.05,"qualifier":"per 1000 tiles served","meter_divisor":1000,"endpoints":["GET /v2/displays/tiles/{layer}/{z}/{x}/{y}.mvt"],"status":"production","group_label":"OOH Displays Maptiles Access","note":"Motionworks OOH Displays inventory face vector tiles. Metered at 1 credit per 1,000 tiles served. The grant/tilejson control-plane endpoints below are free."},{"id":"displays_tiles_grant_create","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["POST /v2/displays/tiles/grants"],"group_label":"OOH Displays Maptiles Access"},{"id":"displays_tiles_grant_list","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["GET /v2/displays/tiles/grants"],"group_label":"OOH Displays Maptiles Access"},{"id":"displays_tiles_tilesets","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["GET /v2/displays/tiles/tilesets"],"group_label":"OOH Displays Maptiles Access"},{"id":"displays_tiles_grant_get","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["GET /v2/displays/tiles/grants/:id"],"group_label":"OOH Displays Maptiles Access"},{"id":"displays_tiles_grant_revoke","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["POST /v2/displays/tiles/grants/:id/revoke"],"group_label":"OOH Displays Maptiles Access"},{"id":"displays_tiles_tilejson","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["GET /v2/displays/tiles/grants/:id/tilejson"],"group_label":"OOH Displays Maptiles Access"},{"id":"markets_tiles_fetch","display_name":"Markets Reference Vector Tile Fetch","credits_per_call":1,"usd_per_call":0.05,"qualifier":"per 1000 tiles served","meter_divisor":1000,"endpoints":["GET /v2/markets/tiles/{layer}/{z}/{x}/{y}.mvt"],"status":"production","group_label":"Markets Reference Maptiles Access","note":"Motionworks Markets Reference geography vector tiles — blockgroup / county / metro_division / metro / micro / state / zipcode polygons. Metered at 1 credit per 1,000 tiles served. The grant/tilejson control-plane endpoints below are free."},{"id":"markets_tiles_grant_create","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["POST /v2/markets/tiles/grants"],"group_label":"Markets Reference Maptiles Access"},{"id":"markets_tiles_grant_list","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["GET /v2/markets/tiles/grants"],"group_label":"Markets Reference Maptiles Access"},{"id":"markets_tiles_tilesets","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["GET /v2/markets/tiles/tilesets"],"group_label":"Markets Reference Maptiles Access"},{"id":"markets_tiles_grant_get","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["GET /v2/markets/tiles/grants/:id"],"group_label":"Markets Reference Maptiles Access"},{"id":"markets_tiles_grant_revoke","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["POST /v2/markets/tiles/grants/:id/revoke"],"group_label":"Markets Reference Maptiles Access"},{"id":"markets_tiles_tilejson","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["GET /v2/markets/tiles/grants/:id/tilejson"],"group_label":"Markets Reference Maptiles Access"},{"id":"popcast_anytime_tiles_fetch","display_name":"Popcast Anytime Vector Tile Fetch","credits_per_call":1,"usd_per_call":0.05,"qualifier":"per 1000 tiles served","meter_divisor":1000,"endpoints":["GET /v2/popcast/tiles/anytime/{layer}/{z}/{x}/{y}.mvt"],"status":"production","group_label":"Popcast Anytime Maptiles Access","note":"Motionworks Popcast Anytime Population vector tiles — one grant covers all audience-segment tilesets in the published v2.3 family (`tiles_anytime_v2_3_<16hex>_<yyyymm>_<yyyymm>_{bg,zcta}_v1`, 372 tilesets as of the 2026-08-11 DATA-5324 rename). Metered at 1 credit per 1,000 tiles served. The grant/tilejson/tilesets control-plane endpoints are free."},{"id":"popcast_anytime_tiles_grant_create","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["POST /v2/popcast/tiles/anytime/grants"],"group_label":"Popcast Anytime Maptiles Access"},{"id":"popcast_anytime_tiles_grant_list","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["GET /v2/popcast/tiles/anytime/grants"],"group_label":"Popcast Anytime Maptiles Access"},{"id":"popcast_anytime_tiles_tilesets","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["GET /v2/popcast/tiles/anytime/tilesets"],"group_label":"Popcast Anytime Maptiles Access"},{"id":"popcast_anytime_tiles_grant_get","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["GET /v2/popcast/tiles/anytime/grants/:id"],"group_label":"Popcast Anytime Maptiles Access"},{"id":"popcast_anytime_tiles_grant_revoke","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["POST /v2/popcast/tiles/anytime/grants/:id/revoke"],"group_label":"Popcast Anytime Maptiles Access"},{"id":"popcast_anytime_tiles_tilejson","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["GET /v2/popcast/tiles/anytime/grants/:id/tilejson"],"group_label":"Popcast Anytime Maptiles Access"},{"id":"viewcast_measurement_poll","display_name":"Viewcast Measurement Poll","credits_per_call":0,"usd_per_call":0,"qualifier":null,"endpoints":["GET /v2/viewcast/measurements/:asset_id"],"status":"production","note":"MA-168 / ADR-0053 (2026-09-08): readiness polling after a paid measurement purchase is free; charges resume only when pulling data. MA-198 / ADR-0056 §2.5 (2026-09-15): this endpoint also serves Viewcast Select (campaign scenario) status polling, differentiated by asset_id prefix (vca vs camp) — no new op, this one already covers it at 0 cr."}],"free_operations":[{"id":"free_call","credits_per_call":0,"endpoints":["GET /v2/health","GET /v2/health/data","GET /v2/billing/credits","POST /v2/billing/credits","GET /v2/billing/credit-schedule","GET /v2/billing/pricing","GET /v2/billing/wallet","POST /v2/billing/checkout","POST /v2/redemption/validate","POST /v2/redemption/complete","GET /v2/billing/subscription","POST /v2/billing/portal","GET /v2/organizations/me","GET /v2/workspace/orgs","POST /v2/workspace/orgs/:id/activate","GET /v2/workspace/sharing/orgs","GET /v2/workspace/projects","POST /v2/workspace/projects","GET /v2/workspace/projects/:id","PATCH /v2/workspace/projects/:id","DELETE /v2/workspace/projects/:id","GET /v2/workspace/projects/:id/sharing","PATCH /v2/workspace/projects/:id/sharing","GET /v2/workspace/projects/:id/scenarios","POST /v2/workspace/projects/:id/scenarios","GET /v2/workspace/scenarios","POST /v2/workspace/scenarios","GET /v2/workspace/scenarios/:id","PATCH /v2/workspace/scenarios/:id","DELETE /v2/workspace/scenarios/:id","POST /v2/workspace/scenarios/:id/clone","POST /v2/workspace/scenarios/:id/move","GET /v2/workspace/scenarios/:id/sharing","PATCH /v2/workspace/scenarios/:id/sharing"]},{"id":"places_autocomplete","credits_per_call":0,"endpoints":["GET /v2/places/autocomplete"]},{"id":"segments_autocomplete","credits_per_call":0,"endpoints":["GET /v2/segments/autocomplete"]},{"id":"viewcast_select_shared_read","credits_per_call":0,"endpoints":["GET /v2/viewcast/select/shared/:token"]}],"rate_limits":{"unit":"requests_per_minute","by_tier":{"guest":{"per_min":2,"burst":5},"free":{"per_min":12},"payg":{"per_min":60}},"unrestricted_features":["placecast.places.autocomplete","placecast.places.poi_place_tiles","placecast.profiles.building_dca_tiles","oohdisplays.displays.face_point_tiles","oohdisplays.displays.inventory_tiles","pathcast.paths.path_line_tiles","markets.reference.geography_tiles","popcast.at_home.segment_pop_tiles","popcast.anytime.segment_occ_tiles","audience.segments.autocomplete"],"notes":"Limits are per feature, per minute. The ceiling follows the org plan, not the auth surface (a paid org gets the payg rate on both its API key and its console JWT). Tiles and autocomplete are unrestricted at every tier. An explicit feature grant promotes a bought feature to unlimited."}},"meta":{"request_id":"req_4b091d1b181e","credits_used":0,"credits_remaining":0,"product":"platform","version":"2.0.0","provenance":{"source":"pricing-manifest","source_doc":"https://docs.mworks.com/reference/billing","methodology_version":"2.0.0","data_vintage":"2026-10-30","data_freshness":"static","data_latency_days":0,"data_maturity":"production"}}}