{"service":"P34 PARML model API","protocol":"parml-wire/2 (menus/sales sheets, see sample_api_input/)","auth":"open","models":["default","rc012.2","rc012.3","rc015"],"endpoints":["POST /validate","POST /fit","GET /result/{session_id}","POST /predict","DELETE /session/{id}","GET /health","GET /queue","GET /account/balance","GET /account/ledger","POST /account/transfer"],"free":"POST /validate checks a /fit payload — structure, columns, menu-0 rules, volume floors — without grounding, queueing or charging anything, and needs no key at all. A free- key (handed to you with your workspace link) may also use mock=true to input-test any market. Actual free fits run only for the markets available to free workspaces, within published rate limits; other markets and model calculations need tokens: pay as you go (a free account plus tokens bought from $15) or a membership.","tokens":"1 token = 1 USD. Calculations are charged for the compute they use, first to the week's PLAN CREDITS (a subscription's weekly allowance: a quarter of its monthly grant, replenished every Monday 00:00 UTC, not carried over) and then to the TOKEN BALANCE — pay-as-you-go tokens any account can buy in the console (from $15; they never expire). An account without a subscription simply pays as it goes. Balances and ledger amounts are in tokens, with the exact internal integer alongside in the *_units fields. GET /account/balance shows plan_credits, balance and available; GET /account/ledger lists every movement (plan credits, usage, top-ups, transfers); POST /account/transfer sends balance tokens to another account by email.","mock":"POST /fit with \"mock\": true runs fit input validation for free and paid keys without grounding, prediction, sponsorship, cluster work or wallet charges. /result contains deterministic placeholders marked \"mock\": true and explicitly not predictions. A free- key, and an account with no tokens to pay with, run mock fits and validations within the free tier's rate limits and row caps.","business_description":"every fit must resolve to a non-empty business description: the optional \"business_description\" field of POST /fit, else the account's saved Business profile (management console), else the description last sent by the account; none of the three -> 422 (simulator-style synthetic payloads fall back to a built-in default instead). Describe the business AND how its unit economics is computed (fees, accumulated costs, holding costs; approximations are fine).","grounding_modes":{"available":["client_grounded","business_led"],"default":"business_led","business_led":"enabled","client_grounded":"send your own profit on every historical option row; P34 publishes those labels verbatim and derives nothing"},"checks":{"default":"on","off":"skips plausibility checks only (volume floors, historically_available consistency, replay horizon); structural and safety checks always run"},"fit_window":"The Invite tier and Starter include a number of fits of each kind — quick, statistical and full — per window; the window opens with your first fit and refills when it ends (3 days on the Invite tier, 7 on Starter). A /fit beyond it answers 429 with detail.code \"fit_window\", Retry-After and detail.resets_at — wait until then, it is neither a data problem nor the wallet; a v2 fit whose deeper analysis is beyond it ends final with final_reason \"fit_window\" and keeps its portfolio. GET /account/balance -> fit_window shows what is left. Other plans and pay as you go have no fit limit."}