{"service":"desk tools","open_this":"/docs","endpoints":{"POST /collect/fx":"pull daily USD/CAD from the Bank of Canada","GET  /fx/{date}":"rate on a date, or the last one before it","POST /quotes":"store a captured quote","GET  /quotes":"list captured quotes","POST /trades":"stage 1 — the trader confirms a trade","POST /trades/{id}/invoice":"what the document says, against the ticket","POST /trades/{id}/settle":"stage 2 — finance records cash received","GET  /trades":"every trade with its attribution (?trader=&month=YYYY-MM)","GET  /pnl":"gross vs actual, by trader (?trader=&month=YYYY-MM)","PUT  /limits/{trader}":"set a credit line — an administrative action","GET  /limits":"credit lines, with change history for one trader","GET  /exposure":"committed capital against both lines","POST /spreads":"open a spread — two legs, a gap, no settlement","POST /spreads/{id}/mark":"record where the gap is, and where the mark came from","POST /spreads/{id}/unwind":"close it at a gap","GET  /spreads":"open and closed spreads with P&L (?trader=&open_only=)","GET  /spreads/kinds":"which spreads have two live legs, and which do not","POST /events":"add a scheduled event","GET  /events":"the calendar ahead (?days=30)","POST /collect/calendar":"US release dates from FRED — key goes in the BODY — UNVERIFIED","POST /events/{id}/outcome":"what the meeting decided, written by a person","POST /trades/{id}/mark":"where a carried position stands today","POST /duties":"record a rate against an exporter and a date","POST /duties/bulk":"load a researched list — nothing loads without a citation","GET  /duties":"rates on file (?exporter=&on_date=)","GET  /duties/compare":"every exporter against the benchmark, in points and per mbf","GET  /duty/terms":"when duty leaves the bank under each structure","GET  /duty/quote":"what duty adds to a value on a movement","POST /market":"today's price for a product IN A REGION","GET  /market":"recent market prints, offers and bids (?days=&region=&kind=)","GET  /inventory":"every carried lot and its P&L — any signed-in user; colleagues' names hidden","GET  /position":"what is carried and what it is worth now (?trader=&role=)","GET  /pnl/by-trader":"realised P&L per person — manager/owner with PIN + authenticator","GET  /impact-rules":"which releases are judged to move a lumber book, and why","PUT  /events/{id}/impact":"override one row","POST /events/reclassify":"apply the rules to rows already held","GET  /calendar/schedule":"last trading days from the rule, with desk coverage","POST /calendar/seed-expiries":"write them in (this year and next)","GET  /calendar/expiry":"the nearest exchange deadline — dates are entered, not fetched","GET  /calendar/brief":"the popup: what is inside the window, and recent outcomes","GET  /products":"the product catalogue the UI cascades from","GET  /export/trades.csv":"?scope=own|all&month=YYYY-MM — traders get their own book; all needs a manager","GET  /export/spreads.csv":"same parameters","GET  /health":"row counts and how current the FX table is"}}