{"openapi":"3.1.0","info":{"title":"Parful Golf Calculators API","version":"1.0.0","summary":"Golf handicap and scoring calculations, with the working shown.","description":"Pure, stateless, deterministic calculations — the same code Parful runs on real outings. Every endpoint accepts GET with query parameters and POST with a JSON body, and returns the answer, the parsed inputs, the worked steps as text, one sentence stating the relationship, and the URL of the rule it applies. These endpoints never read course data. To resolve a course and tee into slope, rating and par, use the calculator pages, which accept the same parameters plus course= and tee=. Free. No key. 60 requests per minute and 2,000 per day per IP; the HTML pages have no quota.","contact":{"name":"Parful","url":"https://www.parful.io/support"}},"servers":[{"url":"https://www.parful.io"}],"tags":[{"name":"Tier 1","description":"Handicaps and scoring"},{"name":"Tier 2","description":"Guest-day systems: Callaway, Peoria, System 36"},{"name":"Tier 3","description":"Team and match formats"},{"name":"Tier 4","description":"Adjustments and utilities"}],"paths":{"/api/calc/course-handicap":{"get":{"operationId":"get_course_handicap","summary":"Golf Course Handicap Calculator","description":"What do I play off at this course, from these tees? Course Handicap = Handicap Index × (Slope Rating ÷ 113) + (Course Rating − Par), rounded once at the end. The slope term scales your index to the difficulty of the tee; the rating term adds the difference between how hard the tee plays and its par.","tags":["Tier 1"],"parameters":[{"name":"handicapIndex","in":"query","required":true,"schema":{"description":"Handicap Index. From +10 to 54. Type a plus handicap with a plus sign, e.g. +2.4. A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"14.2"},"description":"Handicap Index. From +10 to 54. Type a plus handicap with a plus sign, e.g. +2.4. A plus handicap is written with a plus sign, e.g. +2.4."},{"name":"slope","in":"query","required":true,"schema":{"description":"Slope Rating. On the scorecard, 55 to 155. 113 is standard difficulty.","type":"integer","minimum":55,"maximum":155},"description":"Slope Rating. On the scorecard, 55 to 155. 113 is standard difficulty."},{"name":"courseRating","in":"query","required":true,"schema":{"description":"Course Rating. On the scorecard, to one decimal, e.g. 72.2 (or 36.1 for nine holes).","type":"number","minimum":20,"maximum":90},"description":"Course Rating. On the scorecard, to one decimal, e.g. 72.2 (or 36.1 for nine holes)."},{"name":"par","in":"query","required":true,"schema":{"description":"Par","type":"integer","minimum":27,"maximum":80},"description":"Par"}],"responses":{"200":{"description":"The answer, the inputs, the worked steps and the rule.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}},"example":{"primary":{"label":"Course Handicap","value":17,"display":"17"},"result":{"courseHandicap":17},"explain":["14.2 × (132 ÷ 113) = 16.588","16.588 + (72.2 − 72) = 16.788","rounds to 17"],"sentence":"A handicap index of 14.2 from a tee with a slope of 132, a course rating of 72.2 and a par of 72 gives a course handicap of 17."}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"60 per minute and 2,000 per day per IP. Retry-After is set."}}},"post":{"operationId":"post_course_handicap","summary":"Golf Course Handicap Calculator (JSON body)","description":"The same calculation with a JSON body — for long inputs such as an 18-hole card. Arrays may be sent as JSON arrays or comma-separated strings.","tags":["Tier 1"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["handicapIndex","slope","courseRating","par"],"properties":{"handicapIndex":{"description":"Handicap Index. From +10 to 54. Type a plus handicap with a plus sign, e.g. +2.4. A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"14.2"},"slope":{"description":"Slope Rating. On the scorecard, 55 to 155. 113 is standard difficulty.","type":"integer","minimum":55,"maximum":155},"courseRating":{"description":"Course Rating. On the scorecard, to one decimal, e.g. 72.2 (or 36.1 for nine holes).","type":"number","minimum":20,"maximum":90},"par":{"description":"Par","type":"integer","minimum":27,"maximum":80}}},"example":{"handicapIndex":14.2,"slope":132,"courseRating":72.2,"par":72}}}},"responses":{"200":{"description":"The answer.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"Rate limited. Retry-After is set."}}}},"/api/calc/playing-handicap":{"get":{"operationId":"get_playing_handicap","summary":"Golf Playing Handicap and Allowance Calculator","description":"What allowance applies in this format, and what do I play off? Playing Handicap = Course Handicap × allowance, rounded. The allowance is set by the format: 100% for individual stroke play and Stableford, 85% for four-ball stroke play, 90% for four-ball match play, 50% of the combined Course Handicaps for team formats. Parful applies these same percentages in its competitions.","tags":["Tier 1"],"parameters":[{"name":"handicapIndex","in":"query","required":true,"schema":{"description":"Handicap Index. From +10 to 54. Type a plus handicap with a plus sign, e.g. +2.4. A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"14.2"},"description":"Handicap Index. From +10 to 54. Type a plus handicap with a plus sign, e.g. +2.4. A plus handicap is written with a plus sign, e.g. +2.4."},{"name":"format","in":"query","required":false,"schema":{"description":"Format","type":"string","enum":["individual","stableford","fourball","fourballMatch","team","custom"],"default":"individual"},"description":"Format"},{"name":"allowance","in":"query","required":false,"schema":{"description":"Allowance %. Only needed for a custom allowance.","type":"integer","minimum":0,"maximum":100},"description":"Allowance %. Only needed for a custom allowance."},{"name":"slope","in":"query","required":true,"schema":{"description":"Slope Rating. On the scorecard, 55 to 155. 113 is standard difficulty.","type":"integer","minimum":55,"maximum":155},"description":"Slope Rating. On the scorecard, 55 to 155. 113 is standard difficulty."},{"name":"courseRating","in":"query","required":true,"schema":{"description":"Course Rating. On the scorecard, to one decimal, e.g. 72.2 (or 36.1 for nine holes).","type":"number","minimum":20,"maximum":90},"description":"Course Rating. On the scorecard, to one decimal, e.g. 72.2 (or 36.1 for nine holes)."},{"name":"par","in":"query","required":true,"schema":{"description":"Par","type":"integer","minimum":27,"maximum":80},"description":"Par"}],"responses":{"200":{"description":"The answer, the inputs, the worked steps and the rule.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}},"example":{"primary":{"label":"Playing Handicap","value":14,"display":"14"},"result":{"courseHandicap":17,"allowance":85,"playingHandicap":14,"format":"fourball"},"explain":["14.2 × (132 ÷ 113) = 16.588","16.588 + (72.2 − 72) = 16.788","rounds to 17","17 × 85% = 14.45, rounds to 14"],"sentence":"A handicap index of 14.2 from a tee with a slope of 132, a course rating of 72.2 and a par of 72 is a course handicap of 17, and at the 85% four-ball allowance a playing handicap of 14."}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"60 per minute and 2,000 per day per IP. Retry-After is set."}}},"post":{"operationId":"post_playing_handicap","summary":"Golf Playing Handicap and Allowance Calculator (JSON body)","description":"The same calculation with a JSON body — for long inputs such as an 18-hole card. Arrays may be sent as JSON arrays or comma-separated strings.","tags":["Tier 1"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["handicapIndex","slope","courseRating","par"],"properties":{"handicapIndex":{"description":"Handicap Index. From +10 to 54. Type a plus handicap with a plus sign, e.g. +2.4. A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"14.2"},"format":{"description":"Format","type":"string","enum":["individual","stableford","fourball","fourballMatch","team","custom"],"default":"individual"},"allowance":{"description":"Allowance %. Only needed for a custom allowance.","type":"integer","minimum":0,"maximum":100},"slope":{"description":"Slope Rating. On the scorecard, 55 to 155. 113 is standard difficulty.","type":"integer","minimum":55,"maximum":155},"courseRating":{"description":"Course Rating. On the scorecard, to one decimal, e.g. 72.2 (or 36.1 for nine holes).","type":"number","minimum":20,"maximum":90},"par":{"description":"Par","type":"integer","minimum":27,"maximum":80}}},"example":{"handicapIndex":14.2,"format":"fourball","slope":132,"courseRating":72.2,"par":72}}}},"responses":{"200":{"description":"The answer.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"Rate limited. Retry-After is set."}}}},"/api/calc/stableford":{"get":{"operationId":"get_stableford","summary":"Stableford Points Calculator","description":"How many Stableford points is this card? Your Playing Handicap is spread across the holes by stroke index, hardest hole first, wrapping round for handicaps above the hole count. On each hole, net score is gross minus the strokes you receive there, and points come from net against par: two for net par, three for a net birdie, one for a net bogey, nothing for worse. Parful scores Stableford with exactly this arithmetic.","tags":["Tier 1"],"parameters":[{"name":"handicapIndex","in":"query","required":true,"schema":{"description":"Handicap Index. From +10 to 54. Type a plus handicap with a plus sign, e.g. +2.4. A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"14.2"},"description":"Handicap Index. From +10 to 54. Type a plus handicap with a plus sign, e.g. +2.4. A plus handicap is written with a plus sign, e.g. +2.4."},{"name":"table","in":"query","required":false,"schema":{"description":"Points table","type":"string","enum":["stableford","modified","par_bogey"],"default":"stableford"},"description":"Points table"},{"name":"allowance","in":"query","required":false,"schema":{"description":"Allowance %","type":"integer","minimum":0,"maximum":100},"description":"Allowance %"},{"name":"slope","in":"query","required":true,"schema":{"description":"Slope Rating. On the scorecard, 55 to 155. 113 is standard difficulty.","type":"integer","minimum":55,"maximum":155},"description":"Slope Rating. On the scorecard, 55 to 155. 113 is standard difficulty."},{"name":"courseRating","in":"query","required":true,"schema":{"description":"Course Rating. On the scorecard, to one decimal, e.g. 72.2 (or 36.1 for nine holes).","type":"number","minimum":20,"maximum":90},"description":"Course Rating. On the scorecard, to one decimal, e.g. 72.2 (or 36.1 for nine holes)."},{"name":"par","in":"query","required":true,"schema":{"description":"Par","type":"integer","minimum":27,"maximum":80},"description":"Par"},{"name":"pars","in":"query","required":true,"schema":{"description":"Hole pars Comma-separated, 9 or 18 entries; an empty entry means not yet entered.","type":"string","pattern":"^-?\\d*(,-?\\d*){8}$|^-?\\d*(,-?\\d*){17}$"},"description":"Hole pars Comma-separated, 9 or 18 entries; an empty entry means not yet entered."},{"name":"strokeIndex","in":"query","required":true,"schema":{"description":"Stroke index Comma-separated, 9 or 18 entries; an empty entry means not yet entered.","type":"string","pattern":"^-?\\d*(,-?\\d*){8}$|^-?\\d*(,-?\\d*){17}$"},"description":"Stroke index Comma-separated, 9 or 18 entries; an empty entry means not yet entered."},{"name":"scores","in":"query","required":true,"schema":{"description":"Scores Comma-separated, 9 or 18 entries; an empty entry means not yet entered.","type":"string","pattern":"^-?\\d*(,-?\\d*){8}$|^-?\\d*(,-?\\d*){17}$","example":"5,4,4,6,3,4,5,4,4,4,5,3,4,4,5,4,3,5"},"description":"Scores Comma-separated, 9 or 18 entries; an empty entry means not yet entered."}],"responses":{"200":{"description":"The answer, the inputs, the worked steps and the rule.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}},"example":{"primary":{"label":"Stableford points","value":36,"display":"36"},"secondary":{"label":"Playing Handicap","value":17,"display":"17"},"result":{"points":36,"courseHandicap":17,"playingHandicap":17,"gross":89,"played":18,"holes":[{"hole":1,"par":4,"strokes":1,"score":5,"net":4,"points":2},{"hole":2,"par":4,"strokes":1,"score":5,"net":4,"points":2},{"hole":3,"par":3,"strokes":1,"score":4,"net":3,"points":2},{"hole":4,"par":4,"strokes":1,"score":5,"net":4,"points":2},{"hole":5,"par":5,"strokes":1,"score":6,"net":5,"points":2},{"hole":6,"par":4,"strokes":1,"score":5,"net":4,"points":2},{"hole":7,"par":3,"strokes":1,"score":3,"net":2,"points":3},{"hole":8,"par":4,"strokes":1,"score":5,"net":4,"points":2},{"hole":9,"par":5,"strokes":1,"score":6,"net":5,"points":2},{"hole":10,"par":3,"strokes":1,"score":4,"net":3,"points":2},{"hole":11,"par":4,"strokes":1,"score":5,"net":4,"points":2},{"hole":12,"par":5,"strokes":1,"score":6,"net":5,"points":2},{"hole":13,"par":3,"strokes":1,"score":4,"net":3,"points":2},{"hole":14,"par":4,"strokes":1,"score":5,"net":4,"points":2},{"hole":15,"par":4,"strokes":1,"score":5,"net":4,"points":2},{"hole":16,"par":5,"strokes":1,"score":6,"net":5,"points":2},{"hole":17,"par":4,"strokes":0,"score":5,"net":5,"points":1},{"hole":18,"par":4,"strokes":1,"score":5,"net":4,"points":2}]},"explain":["14.2 × (132 ÷ 113) = 16.588","16.588 + (72.2 − 72) = 16.788","rounds to 17","17 strokes fall on the 17 holes with the lowest stroke index","each hole: net score − par → points from the Stableford table","18 of 18 holes played: 36 points (36 is playing to handicap)"],"sentence":"A handicap index of 14.2 from a tee with a slope of 132, a course rating of 72.2 and a par of 72 plays off 17 and scores 36 Stableford points from a gross of 89 over 18 holes."}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"60 per minute and 2,000 per day per IP. Retry-After is set."}}},"post":{"operationId":"post_stableford","summary":"Stableford Points Calculator (JSON body)","description":"The same calculation with a JSON body — for long inputs such as an 18-hole card. Arrays may be sent as JSON arrays or comma-separated strings.","tags":["Tier 1"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["handicapIndex","slope","courseRating","par","pars","strokeIndex","scores"],"properties":{"handicapIndex":{"description":"Handicap Index. From +10 to 54. Type a plus handicap with a plus sign, e.g. +2.4. A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"14.2"},"table":{"description":"Points table","type":"string","enum":["stableford","modified","par_bogey"],"default":"stableford"},"allowance":{"description":"Allowance %","type":"integer","minimum":0,"maximum":100},"slope":{"description":"Slope Rating. On the scorecard, 55 to 155. 113 is standard difficulty.","type":"integer","minimum":55,"maximum":155},"courseRating":{"description":"Course Rating. On the scorecard, to one decimal, e.g. 72.2 (or 36.1 for nine holes).","type":"number","minimum":20,"maximum":90},"par":{"description":"Par","type":"integer","minimum":27,"maximum":80},"pars":{"description":"Hole pars Comma-separated, 9 or 18 entries; an empty entry means not yet entered.","type":"string","pattern":"^-?\\d*(,-?\\d*){8}$|^-?\\d*(,-?\\d*){17}$"},"strokeIndex":{"description":"Stroke index Comma-separated, 9 or 18 entries; an empty entry means not yet entered.","type":"string","pattern":"^-?\\d*(,-?\\d*){8}$|^-?\\d*(,-?\\d*){17}$"},"scores":{"description":"Scores Comma-separated, 9 or 18 entries; an empty entry means not yet entered.","type":"string","pattern":"^-?\\d*(,-?\\d*){8}$|^-?\\d*(,-?\\d*){17}$","example":"5,4,4,6,3,4,5,4,4,4,5,3,4,4,5,4,3,5"}}},"example":{"handicapIndex":14.2,"table":"stableford","slope":132,"courseRating":72.2,"par":72,"pars":"4,4,3,4,5,4,3,4,5,3,4,5,3,4,4,5,4,4","strokeIndex":"1,11,5,15,3,13,7,17,9,2,12,6,16,4,14,8,18,10","scores":"5,5,4,5,6,5,3,5,6,4,5,6,4,5,5,6,5,5"}}}},"responses":{"200":{"description":"The answer.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"Rate limited. Retry-After is set."}}}},"/api/calc/handicap-index":{"get":{"operationId":"get_handicap_index","summary":"Golf Handicap Index Calculator","description":"What is my Handicap Index from these rounds? With twenty rounds, the eight lowest Score Differentials are averaged and rounded to one decimal. With fewer rounds the number that counts falls: three rounds use the lowest one with a −2 adjustment, six use the lowest two with −1, and so on up the WHS table. Parful uses this exact table.","tags":["Tier 1"],"parameters":[{"name":"differentials","in":"query","required":true,"schema":{"description":"Score Differentials. Most recent first or last, order does not matter. From 3 to 20 rounds. Comma-separated decimals, 3 to 20 entries.","type":"string"},"description":"Score Differentials. Most recent first or last, order does not matter. From 3 to 20 rounds. Comma-separated decimals, 3 to 20 entries."}],"responses":{"200":{"description":"The answer, the inputs, the worked steps and the rule.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}},"example":{"primary":{"label":"Handicap Index","value":13.7,"display":"13.7"},"result":{"index":13.7,"counted":8,"adjustment":0,"rounds":20,"used":[12.4,12.9,13.1,13.7,13.9,14.2,14.5,14.7]},"explain":["20 rounds: the best 8 count","best 8: 12.4, 12.9, 13.1, 13.7, 13.9, 14.2, 14.5, 14.7","average = 13.68","rounds to 13.7"],"sentence":"The best 8 of 20 score differentials average 13.68, giving a handicap index of 13.7."}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"60 per minute and 2,000 per day per IP. Retry-After is set."}}},"post":{"operationId":"post_handicap_index","summary":"Golf Handicap Index Calculator (JSON body)","description":"The same calculation with a JSON body — for long inputs such as an 18-hole card. Arrays may be sent as JSON arrays or comma-separated strings.","tags":["Tier 1"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["differentials"],"properties":{"differentials":{"description":"Score Differentials. Most recent first or last, order does not matter. From 3 to 20 rounds. Comma-separated decimals, 3 to 20 entries.","type":"string"}}},"example":{"differentials":"14.8,16.2,12.9,18.5,15.1,13.7,17.3,14.2,19,16.6,13.1,15.8,14.5,20.3,12.4,16.9,15.5,17.8,13.9,14.7"}}}},"responses":{"200":{"description":"The answer.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"Rate limited. Retry-After is set."}}}},"/api/calc/score-differential":{"get":{"operationId":"get_score_differential","summary":"Golf Score Differential Calculator","description":"What did this round score for handicap? Score Differential = (113 ÷ Slope Rating) × (Adjusted Gross Score − Course Rating − PCC), rounded to one decimal. It expresses how well you played relative to the tee's difficulty, on the same scale as a Handicap Index.","tags":["Tier 1"],"parameters":[{"name":"adjustedGross","in":"query","required":true,"schema":{"description":"Adjusted gross score. Your gross after every hole is capped at net double bogey. Use the Net Double Bogey calculator if you are unsure.","type":"integer","minimum":40,"maximum":200},"description":"Adjusted gross score. Your gross after every hole is capped at net double bogey. Use the Net Double Bogey calculator if you are unsure."},{"name":"slope","in":"query","required":true,"schema":{"description":"Slope Rating","type":"integer","minimum":55,"maximum":155},"description":"Slope Rating"},{"name":"courseRating","in":"query","required":true,"schema":{"description":"Course Rating","type":"number","minimum":40,"maximum":90},"description":"Course Rating"},{"name":"pcc","in":"query","required":false,"schema":{"description":"PCC adjustment. Playing Conditions Calculation, −1 to +3. Usually 0.","type":"integer","minimum":-1,"maximum":3},"description":"PCC adjustment. Playing Conditions Calculation, −1 to +3. Usually 0."}],"responses":{"200":{"description":"The answer, the inputs, the worked steps and the rule.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}},"example":{"primary":{"label":"Score Differential","value":13.5,"display":"13.5"},"result":{"differential":13.5,"pcc":0},"explain":["(113 ÷ 132) × (88 − 72.2)","0.8561 × 15.8 = 13.526","rounds to 13.5"],"sentence":"An adjusted gross score of 88 on a tee with a course rating of 72.2 and a slope of 132 gives a score differential of 13.5."}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"60 per minute and 2,000 per day per IP. Retry-After is set."}}},"post":{"operationId":"post_score_differential","summary":"Golf Score Differential Calculator (JSON body)","description":"The same calculation with a JSON body — for long inputs such as an 18-hole card. Arrays may be sent as JSON arrays or comma-separated strings.","tags":["Tier 1"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["adjustedGross","slope","courseRating"],"properties":{"adjustedGross":{"description":"Adjusted gross score. Your gross after every hole is capped at net double bogey. Use the Net Double Bogey calculator if you are unsure.","type":"integer","minimum":40,"maximum":200},"slope":{"description":"Slope Rating","type":"integer","minimum":55,"maximum":155},"courseRating":{"description":"Course Rating","type":"number","minimum":40,"maximum":90},"pcc":{"description":"PCC adjustment. Playing Conditions Calculation, −1 to +3. Usually 0.","type":"integer","minimum":-1,"maximum":3}}},"example":{"adjustedGross":88,"slope":132,"courseRating":72.2}}}},"responses":{"200":{"description":"The answer.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"Rate limited. Retry-After is set."}}}},"/api/calc/scramble-handicap":{"get":{"operationId":"get_scramble_handicap","summary":"Golf Scramble Team Handicap Calculator","description":"What is our scramble team handicap? Each player's Handicap Index becomes a Course Handicap for the tee. Sort them lowest first and apply the tiered allowance: 35% and 15% for two players, 25/20/15 for three, 25/20/15/10 for four. Add the terms and round. These are the USGA Appendix C recommendations and the percentages Parful uses.","tags":["Tier 1"],"parameters":[{"name":"index1","in":"query","required":true,"schema":{"description":"Player 1 index A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"12"},"description":"Player 1 index A plus handicap is written with a plus sign, e.g. +2.4."},{"name":"index2","in":"query","required":true,"schema":{"description":"Player 2 index A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"12"},"description":"Player 2 index A plus handicap is written with a plus sign, e.g. +2.4."},{"name":"index3","in":"query","required":false,"schema":{"description":"Player 3 index A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"12"},"description":"Player 3 index A plus handicap is written with a plus sign, e.g. +2.4."},{"name":"index4","in":"query","required":false,"schema":{"description":"Player 4 index A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"12"},"description":"Player 4 index A plus handicap is written with a plus sign, e.g. +2.4."},{"name":"slope","in":"query","required":true,"schema":{"description":"Slope Rating. On the scorecard, 55 to 155. 113 is standard difficulty.","type":"integer","minimum":55,"maximum":155},"description":"Slope Rating. On the scorecard, 55 to 155. 113 is standard difficulty."},{"name":"courseRating","in":"query","required":true,"schema":{"description":"Course Rating. On the scorecard, to one decimal, e.g. 72.2 (or 36.1 for nine holes).","type":"number","minimum":20,"maximum":90},"description":"Course Rating. On the scorecard, to one decimal, e.g. 72.2 (or 36.1 for nine holes)."},{"name":"par","in":"query","required":true,"schema":{"description":"Par","type":"integer","minimum":27,"maximum":80},"description":"Par"}],"responses":{"200":{"description":"The answer, the inputs, the worked steps and the rule.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}},"example":{"primary":{"label":"Team handicap","value":11,"display":"11"},"result":{"teamHandicap":11,"players":4,"courseHandicaps":[10,14,20,25],"tiers":[25,20,15,10]},"explain":["course handicaps: 10, 14.0, 20.00, 25.000","lowest first: 10 × 25% + 14 × 20% + 20 × 15% + 25 × 10%","= 10.8, rounds to 11"],"sentence":"A 4-player scramble team with course handicaps of 10, 14.0, 20.00, 25.000 from a tee with a slope of 132, a course rating of 72.2 and a par of 72 gets a team handicap of 11 under the 25/20/15/10 allowance."}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"60 per minute and 2,000 per day per IP. Retry-After is set."}}},"post":{"operationId":"post_scramble_handicap","summary":"Golf Scramble Team Handicap Calculator (JSON body)","description":"The same calculation with a JSON body — for long inputs such as an 18-hole card. Arrays may be sent as JSON arrays or comma-separated strings.","tags":["Tier 1"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["index1","index2","slope","courseRating","par"],"properties":{"index1":{"description":"Player 1 index A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"12"},"index2":{"description":"Player 2 index A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"12"},"index3":{"description":"Player 3 index A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"12"},"index4":{"description":"Player 4 index A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"12"},"slope":{"description":"Slope Rating. On the scorecard, 55 to 155. 113 is standard difficulty.","type":"integer","minimum":55,"maximum":155},"courseRating":{"description":"Course Rating. On the scorecard, to one decimal, e.g. 72.2 (or 36.1 for nine holes).","type":"number","minimum":20,"maximum":90},"par":{"description":"Par","type":"integer","minimum":27,"maximum":80}}},"example":{"index1":8.4,"index2":12.1,"index3":16.7,"index4":21,"slope":132,"courseRating":72.2,"par":72}}}},"responses":{"200":{"description":"The answer.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"Rate limited. Retry-After is set."}}}},"/api/calc/net-double-bogey":{"get":{"operationId":"get_net_double_bogey","summary":"Net Double Bogey and Adjusted Gross Score Calculator","description":"What is my adjusted gross score after net double bogey? Your Course Handicap sets the strokes you receive on each hole by stroke index. Net double bogey on a hole is par + 2 + those strokes: an 18 handicap on a par 4 with one stroke caps at 7. Any hole above its cap is reduced to it. The adjusted gross is the sum, and it can be lower than the card but never higher. That number, not the raw gross, feeds the Score Differential. Parful applies net double bogey as a cap rule on outings that use it.","tags":["Tier 1"],"parameters":[{"name":"handicapIndex","in":"query","required":true,"schema":{"description":"Handicap Index. From +10 to 54. Type a plus handicap with a plus sign, e.g. +2.4. A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"14.2"},"description":"Handicap Index. From +10 to 54. Type a plus handicap with a plus sign, e.g. +2.4. A plus handicap is written with a plus sign, e.g. +2.4."},{"name":"slope","in":"query","required":true,"schema":{"description":"Slope Rating. On the scorecard, 55 to 155. 113 is standard difficulty.","type":"integer","minimum":55,"maximum":155},"description":"Slope Rating. On the scorecard, 55 to 155. 113 is standard difficulty."},{"name":"courseRating","in":"query","required":true,"schema":{"description":"Course Rating. On the scorecard, to one decimal, e.g. 72.2 (or 36.1 for nine holes).","type":"number","minimum":20,"maximum":90},"description":"Course Rating. On the scorecard, to one decimal, e.g. 72.2 (or 36.1 for nine holes)."},{"name":"par","in":"query","required":true,"schema":{"description":"Par","type":"integer","minimum":27,"maximum":80},"description":"Par"},{"name":"pars","in":"query","required":true,"schema":{"description":"Hole pars Comma-separated, 9 or 18 entries; an empty entry means not yet entered.","type":"string","pattern":"^-?\\d*(,-?\\d*){8}$|^-?\\d*(,-?\\d*){17}$"},"description":"Hole pars Comma-separated, 9 or 18 entries; an empty entry means not yet entered."},{"name":"strokeIndex","in":"query","required":true,"schema":{"description":"Stroke index Comma-separated, 9 or 18 entries; an empty entry means not yet entered.","type":"string","pattern":"^-?\\d*(,-?\\d*){8}$|^-?\\d*(,-?\\d*){17}$"},"description":"Stroke index Comma-separated, 9 or 18 entries; an empty entry means not yet entered."},{"name":"scores","in":"query","required":true,"schema":{"description":"Scores Comma-separated, 9 or 18 entries; an empty entry means not yet entered.","type":"string","pattern":"^-?\\d*(,-?\\d*){8}$|^-?\\d*(,-?\\d*){17}$","example":"5,4,4,6,3,4,5,4,4,4,5,3,4,4,5,4,3,5"},"description":"Scores Comma-separated, 9 or 18 entries; an empty entry means not yet entered."}],"responses":{"200":{"description":"The answer, the inputs, the worked steps and the rule.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}},"example":{"primary":{"label":"Adjusted gross","value":93,"display":"93"},"result":{"adjusted":93,"gross":96,"capped":2,"courseHandicap":17,"holes":[{"hole":1,"gross":5,"cap":7,"adjusted":5,"capped":false},{"hole":2,"gross":5,"cap":7,"adjusted":5,"capped":false},{"hole":3,"gross":4,"cap":6,"adjusted":4,"capped":false},{"hole":4,"gross":9,"cap":7,"adjusted":7,"capped":true},{"hole":5,"gross":6,"cap":8,"adjusted":6,"capped":false},{"hole":6,"gross":5,"cap":7,"adjusted":5,"capped":false},{"hole":7,"gross":3,"cap":6,"adjusted":3,"capped":false},{"hole":8,"gross":5,"cap":7,"adjusted":5,"capped":false},{"hole":9,"gross":6,"cap":8,"adjusted":6,"capped":false},{"hole":10,"gross":4,"cap":6,"adjusted":4,"capped":false},{"hole":11,"gross":5,"cap":7,"adjusted":5,"capped":false},{"hole":12,"gross":6,"cap":8,"adjusted":6,"capped":false},{"hole":13,"gross":4,"cap":6,"adjusted":4,"capped":false},{"hole":14,"gross":8,"cap":7,"adjusted":7,"capped":true},{"hole":15,"gross":5,"cap":7,"adjusted":5,"capped":false},{"hole":16,"gross":6,"cap":8,"adjusted":6,"capped":false},{"hole":17,"gross":5,"cap":6,"adjusted":5,"capped":false},{"hole":18,"gross":5,"cap":7,"adjusted":5,"capped":false}]},"explain":["14.2 × (132 ÷ 113) = 16.588","16.588 + (72.2 − 72) = 16.788","rounds to 17","cap on each hole = par + 2 + strokes received there","capped: hole 4 9→7, hole 14 8→7","gross 96 → adjusted gross 93"],"sentence":"A handicap index of 14.2 from a tee with a slope of 132, a course rating of 72.2 and a par of 72 plays off 17; a gross of 96 becomes an adjusted gross score of 93 after 2 holes are capped at net double bogey."}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"60 per minute and 2,000 per day per IP. Retry-After is set."}}},"post":{"operationId":"post_net_double_bogey","summary":"Net Double Bogey and Adjusted Gross Score Calculator (JSON body)","description":"The same calculation with a JSON body — for long inputs such as an 18-hole card. Arrays may be sent as JSON arrays or comma-separated strings.","tags":["Tier 1"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["handicapIndex","slope","courseRating","par","pars","strokeIndex","scores"],"properties":{"handicapIndex":{"description":"Handicap Index. From +10 to 54. Type a plus handicap with a plus sign, e.g. +2.4. A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"14.2"},"slope":{"description":"Slope Rating. On the scorecard, 55 to 155. 113 is standard difficulty.","type":"integer","minimum":55,"maximum":155},"courseRating":{"description":"Course Rating. On the scorecard, to one decimal, e.g. 72.2 (or 36.1 for nine holes).","type":"number","minimum":20,"maximum":90},"par":{"description":"Par","type":"integer","minimum":27,"maximum":80},"pars":{"description":"Hole pars Comma-separated, 9 or 18 entries; an empty entry means not yet entered.","type":"string","pattern":"^-?\\d*(,-?\\d*){8}$|^-?\\d*(,-?\\d*){17}$"},"strokeIndex":{"description":"Stroke index Comma-separated, 9 or 18 entries; an empty entry means not yet entered.","type":"string","pattern":"^-?\\d*(,-?\\d*){8}$|^-?\\d*(,-?\\d*){17}$"},"scores":{"description":"Scores Comma-separated, 9 or 18 entries; an empty entry means not yet entered.","type":"string","pattern":"^-?\\d*(,-?\\d*){8}$|^-?\\d*(,-?\\d*){17}$","example":"5,4,4,6,3,4,5,4,4,4,5,3,4,4,5,4,3,5"}}},"example":{"handicapIndex":14.2,"slope":132,"courseRating":72.2,"par":72,"pars":"4,4,3,4,5,4,3,4,5,3,4,5,3,4,4,5,4,4","strokeIndex":"1,11,5,15,3,13,7,17,9,2,12,6,16,4,14,8,18,10","scores":"5,5,4,9,6,5,3,5,6,4,5,6,4,8,5,6,5,5"}}}},"responses":{"200":{"description":"The answer.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"Rate limited. Retry-After is set."}}}},"/api/calc/callaway":{"get":{"operationId":"get_callaway","summary":"Callaway Handicap System Calculator","description":"What is this golfer's Callaway handicap and net score? Find the gross score in the Callaway table to see how many of the worst holes to deduct and what adjustment to apply. Deduct the highest hole scores (a half means half that hole) with two rules: no hole is deducted at more than double its par, and the last two holes are never deducted. Add the adjustment, round, and that is the handicap. Net is gross minus handicap. Parful runs guest days with exactly this table.","tags":["Tier 2"],"parameters":[{"name":"pars","in":"query","required":true,"schema":{"description":"Hole pars Comma-separated, 9 or 18 entries; an empty entry means not yet entered.","type":"string","pattern":"^-?\\d*(,-?\\d*){8}$|^-?\\d*(,-?\\d*){17}$"},"description":"Hole pars Comma-separated, 9 or 18 entries; an empty entry means not yet entered."},{"name":"scores","in":"query","required":true,"schema":{"description":"Scores Comma-separated, 9 or 18 entries; an empty entry means not yet entered.","type":"string","pattern":"^-?\\d*(,-?\\d*){8}$|^-?\\d*(,-?\\d*){17}$","example":"5,4,4,6,3,4,5,4,4,4,5,3,4,4,5,4,3,5"},"description":"Scores Comma-separated, 9 or 18 entries; an empty entry means not yet entered."}],"responses":{"200":{"description":"The answer, the inputs, the worked steps and the rule.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}},"example":{"primary":{"label":"Net score","value":78,"display":"78"},"secondary":{"label":"Callaway handicap","value":22,"display":"22"},"result":{"handicap":22,"gross":100,"net":78,"deducted":[{"hole":8,"gross":8,"counted":8,"share":1},{"hole":4,"gross":7,"counted":7,"share":1},{"hole":12,"gross":7,"counted":7,"share":1}],"adjustment":0,"deductAllowance":3},"explain":["gross 100: the table deducts 3 worst holes with a +0 adjustment","worst holes (capped at double par, holes 17 and 18 excluded): hole 8: 8, hole 4: 7, hole 12: 7","22 + 0 rounds to 22","net = 100 − 22 = 78"],"sentence":"A gross score of 100 gives a Callaway handicap of 22 and a net score of 78."}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"60 per minute and 2,000 per day per IP. Retry-After is set."}}},"post":{"operationId":"post_callaway","summary":"Callaway Handicap System Calculator (JSON body)","description":"The same calculation with a JSON body — for long inputs such as an 18-hole card. Arrays may be sent as JSON arrays or comma-separated strings.","tags":["Tier 2"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["pars","scores"],"properties":{"pars":{"description":"Hole pars Comma-separated, 9 or 18 entries; an empty entry means not yet entered.","type":"string","pattern":"^-?\\d*(,-?\\d*){8}$|^-?\\d*(,-?\\d*){17}$"},"scores":{"description":"Scores Comma-separated, 9 or 18 entries; an empty entry means not yet entered.","type":"string","pattern":"^-?\\d*(,-?\\d*){8}$|^-?\\d*(,-?\\d*){17}$","example":"5,4,4,6,3,4,5,4,4,4,5,3,4,4,5,4,3,5"}}},"example":{"pars":"4,4,3,4,5,4,3,4,5,3,4,5,3,4,4,5,4,4","scores":"6,5,4,7,6,5,4,8,6,4,5,7,5,6,5,6,5,6"}}}},"responses":{"200":{"description":"The answer.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"Rate limited. Retry-After is set."}}}},"/api/calc/peoria":{"get":{"operationId":"get_peoria","summary":"Peoria Handicap System Calculator","description":"What is this golfer's Peoria handicap and net score? Add the scores on the six drawn holes, each capped at double its par. Multiply by three to scale six holes to eighteen, subtract the course par, and take eighty percent. Round, and that is the handicap. The six holes must be chosen before anyone plays. On Parful they are drawn from the outing itself so nobody can pick them afterwards.","tags":["Tier 2"],"parameters":[{"name":"pars","in":"query","required":true,"schema":{"description":"Hole pars Comma-separated, 9 or 18 entries; an empty entry means not yet entered.","type":"string","pattern":"^-?\\d*(,-?\\d*){8}$|^-?\\d*(,-?\\d*){17}$"},"description":"Hole pars Comma-separated, 9 or 18 entries; an empty entry means not yet entered."},{"name":"holes","in":"query","required":true,"schema":{"description":"The six Peoria holes. Tap the six holes that were drawn before play. Comma-separated whole numbers, 6 to 6 entries.","type":"string"},"description":"The six Peoria holes. Tap the six holes that were drawn before play. Comma-separated whole numbers, 6 to 6 entries."},{"name":"scores","in":"query","required":true,"schema":{"description":"Scores Comma-separated, 9 or 18 entries; an empty entry means not yet entered.","type":"string","pattern":"^-?\\d*(,-?\\d*){8}$|^-?\\d*(,-?\\d*){17}$","example":"5,4,4,6,3,4,5,4,4,4,5,3,4,4,5,4,3,5"},"description":"Scores Comma-separated, 9 or 18 entries; an empty entry means not yet entered."}],"responses":{"200":{"description":"The answer, the inputs, the worked steps and the rule.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}},"example":{"primary":{"label":"Net score","value":74,"display":"74"},"secondary":{"label":"Peoria handicap","value":26,"display":"26"},"result":{"handicap":26,"gross":100,"net":74,"selected":35,"coursePar":72,"used":[{"hole":2,"gross":5,"counted":5,"capped":false},{"hole":5,"gross":6,"counted":6,"capped":false},{"hole":8,"gross":8,"counted":8,"capped":false},{"hole":11,"gross":5,"counted":5,"capped":false},{"hole":14,"gross":6,"counted":6,"capped":false},{"hole":17,"gross":5,"counted":5,"capped":false}]},"explain":["holes 2, 5, 8, 11, 14, 17: 5 + 6 + 8 + 5 + 6 + 5 = 35","35 × 3 = 105; − par 72 = 33","× 80% = 26.4, rounds to 26","net = 100 − 26 = 74"],"sentence":"Six Peoria holes scoring 35 on a par-72 course give a handicap of 26, and a net score of 74 from a gross of 100."}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"60 per minute and 2,000 per day per IP. Retry-After is set."}}},"post":{"operationId":"post_peoria","summary":"Peoria Handicap System Calculator (JSON body)","description":"The same calculation with a JSON body — for long inputs such as an 18-hole card. Arrays may be sent as JSON arrays or comma-separated strings.","tags":["Tier 2"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["pars","holes","scores"],"properties":{"pars":{"description":"Hole pars Comma-separated, 9 or 18 entries; an empty entry means not yet entered.","type":"string","pattern":"^-?\\d*(,-?\\d*){8}$|^-?\\d*(,-?\\d*){17}$"},"holes":{"description":"The six Peoria holes. Tap the six holes that were drawn before play. Comma-separated whole numbers, 6 to 6 entries.","type":"string"},"scores":{"description":"Scores Comma-separated, 9 or 18 entries; an empty entry means not yet entered.","type":"string","pattern":"^-?\\d*(,-?\\d*){8}$|^-?\\d*(,-?\\d*){17}$","example":"5,4,4,6,3,4,5,4,4,4,5,3,4,4,5,4,3,5"}}},"example":{"pars":"4,4,3,4,5,4,3,4,5,3,4,5,3,4,4,5,4,4","holes":"2,5,8,11,14,17","scores":"6,5,4,7,6,5,4,8,6,4,5,7,5,6,5,6,5,6"}}}},"responses":{"200":{"description":"The answer.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"Rate limited. Retry-After is set."}}}},"/api/calc/system-36":{"get":{"operationId":"get_system_36","summary":"System 36 Handicap Calculator","description":"What is this golfer's System 36 handicap and net score? Score each hole: par or better is two points, a bogey is one, anything worse is nothing. Add them up and subtract from 36. A player who bogeys every hole scores 18 points and gets an 18 handicap. Net score is gross minus the handicap. Parful runs System 36 exactly this way.","tags":["Tier 2"],"parameters":[{"name":"pars","in":"query","required":true,"schema":{"description":"Hole pars Comma-separated, 9 or 18 entries; an empty entry means not yet entered.","type":"string","pattern":"^-?\\d*(,-?\\d*){8}$|^-?\\d*(,-?\\d*){17}$"},"description":"Hole pars Comma-separated, 9 or 18 entries; an empty entry means not yet entered."},{"name":"scores","in":"query","required":true,"schema":{"description":"Scores Comma-separated, 9 or 18 entries; an empty entry means not yet entered.","type":"string","pattern":"^-?\\d*(,-?\\d*){8}$|^-?\\d*(,-?\\d*){17}$","example":"5,4,4,6,3,4,5,4,4,4,5,3,4,4,5,4,3,5"},"description":"Scores Comma-separated, 9 or 18 entries; an empty entry means not yet entered."}],"responses":{"200":{"description":"The answer, the inputs, the worked steps and the rule.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}},"example":{"primary":{"label":"Net score","value":75,"display":"75"},"secondary":{"label":"System 36 handicap","value":25,"display":"25"},"result":{"handicap":25,"points":11,"gross":100,"net":75,"perHole":[0,1,1,0,1,1,1,0,1,1,1,0,0,0,1,1,1,0],"holesCounted":18},"explain":["0 holes at par or better × 2 = 0","11 bogeys × 1 = 11","7 worse × 0 = 0; total 11 points","36 − 11 = 25; net = 100 − 25 = 75"],"sentence":"A card scoring 11 System 36 points gives a handicap of 25 and a net score of 75 from a gross of 100."}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"60 per minute and 2,000 per day per IP. Retry-After is set."}}},"post":{"operationId":"post_system_36","summary":"System 36 Handicap Calculator (JSON body)","description":"The same calculation with a JSON body — for long inputs such as an 18-hole card. Arrays may be sent as JSON arrays or comma-separated strings.","tags":["Tier 2"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["pars","scores"],"properties":{"pars":{"description":"Hole pars Comma-separated, 9 or 18 entries; an empty entry means not yet entered.","type":"string","pattern":"^-?\\d*(,-?\\d*){8}$|^-?\\d*(,-?\\d*){17}$"},"scores":{"description":"Scores Comma-separated, 9 or 18 entries; an empty entry means not yet entered.","type":"string","pattern":"^-?\\d*(,-?\\d*){8}$|^-?\\d*(,-?\\d*){17}$","example":"5,4,4,6,3,4,5,4,4,4,5,3,4,4,5,4,3,5"}}},"example":{"pars":"4,4,3,4,5,4,3,4,5,3,4,5,3,4,4,5,4,4","scores":"6,5,4,7,6,5,4,8,6,4,5,7,5,6,5,6,5,6"}}}},"responses":{"200":{"description":"The answer.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"Rate limited. Retry-After is set."}}}},"/api/calc/match-play-strokes":{"get":{"operationId":"get_match_play_strokes","summary":"Match Play Strokes Calculator","description":"How many strokes does the higher handicap get in this match? Convert both indexes to Course Handicaps for the tee. The higher handicap receives the difference, multiplied by the allowance and rounded. Full difference at 100% is the WHS recommendation for singles match play; 90% is a common club choice. The strokes fall on the lowest stroke-index holes. Use the Strokes Per Hole calculator to see where.","tags":["Tier 3"],"parameters":[{"name":"indexA","in":"query","required":true,"schema":{"description":"Player A index A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"12"},"description":"Player A index A plus handicap is written with a plus sign, e.g. +2.4."},{"name":"indexB","in":"query","required":true,"schema":{"description":"Player B index A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"12"},"description":"Player B index A plus handicap is written with a plus sign, e.g. +2.4."},{"name":"allowance","in":"query","required":false,"schema":{"description":"Allowance","type":"string","enum":["100","90","75"],"default":"100"},"description":"Allowance"},{"name":"slope","in":"query","required":true,"schema":{"description":"Slope Rating. On the scorecard, 55 to 155. 113 is standard difficulty.","type":"integer","minimum":55,"maximum":155},"description":"Slope Rating. On the scorecard, 55 to 155. 113 is standard difficulty."},{"name":"courseRating","in":"query","required":true,"schema":{"description":"Course Rating. On the scorecard, to one decimal, e.g. 72.2 (or 36.1 for nine holes).","type":"number","minimum":20,"maximum":90},"description":"Course Rating. On the scorecard, to one decimal, e.g. 72.2 (or 36.1 for nine holes)."},{"name":"par","in":"query","required":true,"schema":{"description":"Par","type":"integer","minimum":27,"maximum":80},"description":"Par"}],"responses":{"200":{"description":"The answer, the inputs, the worked steps and the rule.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}},"example":{"primary":{"label":"Player B receives","value":12,"display":"12"},"result":{"strokes":12,"receiver":"Player B","courseHandicapA":10,"courseHandicapB":22,"allowance":100},"explain":["course handicaps: A 10, B 22","difference 12","rounds to 12, received by Player B"],"sentence":"With course handicaps of 10 and 22 from a tee with a slope of 132, a course rating of 72.2 and a par of 72, Player B receives 12 strokes at 100%."}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"60 per minute and 2,000 per day per IP. Retry-After is set."}}},"post":{"operationId":"post_match_play_strokes","summary":"Match Play Strokes Calculator (JSON body)","description":"The same calculation with a JSON body — for long inputs such as an 18-hole card. Arrays may be sent as JSON arrays or comma-separated strings.","tags":["Tier 3"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["indexA","indexB","slope","courseRating","par"],"properties":{"indexA":{"description":"Player A index A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"12"},"indexB":{"description":"Player B index A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"12"},"allowance":{"description":"Allowance","type":"string","enum":["100","90","75"],"default":"100"},"slope":{"description":"Slope Rating. On the scorecard, 55 to 155. 113 is standard difficulty.","type":"integer","minimum":55,"maximum":155},"courseRating":{"description":"Course Rating. On the scorecard, to one decimal, e.g. 72.2 (or 36.1 for nine holes).","type":"number","minimum":20,"maximum":90},"par":{"description":"Par","type":"integer","minimum":27,"maximum":80}}},"example":{"indexA":8.4,"indexB":18.9,"allowance":100,"slope":132,"courseRating":72.2,"par":72}}}},"responses":{"200":{"description":"The answer.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"Rate limited. Retry-After is set."}}}},"/api/calc/four-ball-handicap":{"get":{"operationId":"get_four_ball_handicap","summary":"Four-Ball Handicap Allowance Calculator","description":"What does each of us play off in four-ball? Each player's Handicap Index becomes a Course Handicap for the tee, then the four-ball allowance is applied: 85% in stroke play, 90% in match play. In match play the lowest player then plays off scratch and the others receive the difference. These are the percentages Parful applies in its four-ball competitions.","tags":["Tier 3"],"parameters":[{"name":"index1","in":"query","required":true,"schema":{"description":"Player 1 index A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"12"},"description":"Player 1 index A plus handicap is written with a plus sign, e.g. +2.4."},{"name":"index2","in":"query","required":true,"schema":{"description":"Player 2 index A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"12"},"description":"Player 2 index A plus handicap is written with a plus sign, e.g. +2.4."},{"name":"index3","in":"query","required":false,"schema":{"description":"Player 3 index A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"12"},"description":"Player 3 index A plus handicap is written with a plus sign, e.g. +2.4."},{"name":"index4","in":"query","required":false,"schema":{"description":"Player 4 index A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"12"},"description":"Player 4 index A plus handicap is written with a plus sign, e.g. +2.4."},{"name":"scoring","in":"query","required":false,"schema":{"description":"Scoring","type":"string","enum":["stroke","match"],"default":"stroke"},"description":"Scoring"},{"name":"slope","in":"query","required":true,"schema":{"description":"Slope Rating. On the scorecard, 55 to 155. 113 is standard difficulty.","type":"integer","minimum":55,"maximum":155},"description":"Slope Rating. On the scorecard, 55 to 155. 113 is standard difficulty."},{"name":"courseRating","in":"query","required":true,"schema":{"description":"Course Rating. On the scorecard, to one decimal, e.g. 72.2 (or 36.1 for nine holes).","type":"number","minimum":20,"maximum":90},"description":"Course Rating. On the scorecard, to one decimal, e.g. 72.2 (or 36.1 for nine holes)."},{"name":"par","in":"query","required":true,"schema":{"description":"Par","type":"integer","minimum":27,"maximum":80},"description":"Par"}],"responses":{"200":{"description":"The answer, the inputs, the worked steps and the rule.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}},"example":{"primary":{"label":"Playing handicaps","value":[6,13,16,22],"display":"6 · 13 · 16 · 22"},"result":{"allowance":90,"players":[{"player":1,"index":6.2,"courseHandicap":7,"playingHandicap":6,"relative":0},{"player":2,"index":11.8,"courseHandicap":14,"playingHandicap":13,"relative":7},{"player":3,"index":15.4,"courseHandicap":18,"playingHandicap":16,"relative":10},{"player":4,"index":20.1,"courseHandicap":24,"playingHandicap":22,"relative":16}]},"explain":["course handicaps: 7, 14, 18, 24","× 90%: 6, 13, 16, 22","relative to the lowest (6): 0, 7, 10, 16 strokes"],"sentence":"In four-ball at 90% from a tee with a slope of 132, a course rating of 72.2 and a par of 72, the players play off 6, 13, 16, 22, receiving 0, 7, 10, 16 strokes relative to the lowest."}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"60 per minute and 2,000 per day per IP. Retry-After is set."}}},"post":{"operationId":"post_four_ball_handicap","summary":"Four-Ball Handicap Allowance Calculator (JSON body)","description":"The same calculation with a JSON body — for long inputs such as an 18-hole card. Arrays may be sent as JSON arrays or comma-separated strings.","tags":["Tier 3"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["index1","index2","slope","courseRating","par"],"properties":{"index1":{"description":"Player 1 index A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"12"},"index2":{"description":"Player 2 index A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"12"},"index3":{"description":"Player 3 index A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"12"},"index4":{"description":"Player 4 index A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"12"},"scoring":{"description":"Scoring","type":"string","enum":["stroke","match"],"default":"stroke"},"slope":{"description":"Slope Rating. On the scorecard, 55 to 155. 113 is standard difficulty.","type":"integer","minimum":55,"maximum":155},"courseRating":{"description":"Course Rating. On the scorecard, to one decimal, e.g. 72.2 (or 36.1 for nine holes).","type":"number","minimum":20,"maximum":90},"par":{"description":"Par","type":"integer","minimum":27,"maximum":80}}},"example":{"index1":6.2,"index2":11.8,"index3":15.4,"index4":20.1,"scoring":"match","slope":132,"courseRating":72.2,"par":72}}}},"responses":{"200":{"description":"The answer.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"Rate limited. Retry-After is set."}}}},"/api/calc/foursomes-handicap":{"get":{"operationId":"get_foursomes_handicap","summary":"Foursomes Team Handicap Calculator","description":"What is our foursomes team handicap? Convert both indexes to Course Handicaps for the tee, add them, and take half. Rounded once. That is the recommended foursomes allowance and the one Parful applies.","tags":["Tier 3"],"parameters":[{"name":"index1","in":"query","required":true,"schema":{"description":"Player 1 index A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"12"},"description":"Player 1 index A plus handicap is written with a plus sign, e.g. +2.4."},{"name":"index2","in":"query","required":true,"schema":{"description":"Player 2 index A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"12"},"description":"Player 2 index A plus handicap is written with a plus sign, e.g. +2.4."},{"name":"slope","in":"query","required":true,"schema":{"description":"Slope Rating. On the scorecard, 55 to 155. 113 is standard difficulty.","type":"integer","minimum":55,"maximum":155},"description":"Slope Rating. On the scorecard, 55 to 155. 113 is standard difficulty."},{"name":"courseRating","in":"query","required":true,"schema":{"description":"Course Rating. On the scorecard, to one decimal, e.g. 72.2 (or 36.1 for nine holes).","type":"number","minimum":20,"maximum":90},"description":"Course Rating. On the scorecard, to one decimal, e.g. 72.2 (or 36.1 for nine holes)."},{"name":"par","in":"query","required":true,"schema":{"description":"Par","type":"integer","minimum":27,"maximum":80},"description":"Par"}],"responses":{"200":{"description":"The answer, the inputs, the worked steps and the rule.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}},"example":{"primary":{"label":"Team handicap","value":16,"display":"16"},"result":{"teamHandicap":16,"courseHandicaps":[11,20]},"explain":["course handicaps: 11 and 20","(11 + 20) × 50% = 15.5","rounds to 16"],"sentence":"A foursomes pair with course handicaps of 11 and 20 from a tee with a slope of 132, a course rating of 72.2 and a par of 72 plays off a team handicap of 16."}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"60 per minute and 2,000 per day per IP. Retry-After is set."}}},"post":{"operationId":"post_foursomes_handicap","summary":"Foursomes Team Handicap Calculator (JSON body)","description":"The same calculation with a JSON body — for long inputs such as an 18-hole card. Arrays may be sent as JSON arrays or comma-separated strings.","tags":["Tier 3"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["index1","index2","slope","courseRating","par"],"properties":{"index1":{"description":"Player 1 index A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"12"},"index2":{"description":"Player 2 index A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"12"},"slope":{"description":"Slope Rating. On the scorecard, 55 to 155. 113 is standard difficulty.","type":"integer","minimum":55,"maximum":155},"courseRating":{"description":"Course Rating. On the scorecard, to one decimal, e.g. 72.2 (or 36.1 for nine holes).","type":"number","minimum":20,"maximum":90},"par":{"description":"Par","type":"integer","minimum":27,"maximum":80}}},"example":{"index1":9.6,"index2":17.3,"slope":132,"courseRating":72.2,"par":72}}}},"responses":{"200":{"description":"The answer.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"Rate limited. Retry-After is set."}}}},"/api/calc/greensomes-handicap":{"get":{"operationId":"get_greensomes_handicap","summary":"Greensomes Team Handicap Calculator","description":"What is our greensomes or Chapman team handicap? Convert both indexes to Course Handicaps, then take 60% of the lower and 40% of the higher and add them. Rounded once. Greensomes and Chapman (Pinehurst) both use this split, because the choice of drive favours the better player. Parful applies the same 60/40.","tags":["Tier 3"],"parameters":[{"name":"index1","in":"query","required":true,"schema":{"description":"Player 1 index A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"12"},"description":"Player 1 index A plus handicap is written with a plus sign, e.g. +2.4."},{"name":"index2","in":"query","required":true,"schema":{"description":"Player 2 index A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"12"},"description":"Player 2 index A plus handicap is written with a plus sign, e.g. +2.4."},{"name":"slope","in":"query","required":true,"schema":{"description":"Slope Rating. On the scorecard, 55 to 155. 113 is standard difficulty.","type":"integer","minimum":55,"maximum":155},"description":"Slope Rating. On the scorecard, 55 to 155. 113 is standard difficulty."},{"name":"courseRating","in":"query","required":true,"schema":{"description":"Course Rating. On the scorecard, to one decimal, e.g. 72.2 (or 36.1 for nine holes).","type":"number","minimum":20,"maximum":90},"description":"Course Rating. On the scorecard, to one decimal, e.g. 72.2 (or 36.1 for nine holes)."},{"name":"par","in":"query","required":true,"schema":{"description":"Par","type":"integer","minimum":27,"maximum":80},"description":"Par"}],"responses":{"200":{"description":"The answer, the inputs, the worked steps and the rule.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}},"example":{"primary":{"label":"Team handicap","value":15,"display":"15"},"result":{"teamHandicap":15,"courseHandicaps":[11,20]},"explain":["course handicaps: 11 (lower) and 20 (higher)","11 × 60% + 20 × 40% = 14.6","rounds to 15"],"sentence":"A greensomes pair with course handicaps of 11 and 20 from a tee with a slope of 132, a course rating of 72.2 and a par of 72 plays off a team handicap of 15."}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"60 per minute and 2,000 per day per IP. Retry-After is set."}}},"post":{"operationId":"post_greensomes_handicap","summary":"Greensomes Team Handicap Calculator (JSON body)","description":"The same calculation with a JSON body — for long inputs such as an 18-hole card. Arrays may be sent as JSON arrays or comma-separated strings.","tags":["Tier 3"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["index1","index2","slope","courseRating","par"],"properties":{"index1":{"description":"Player 1 index A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"12"},"index2":{"description":"Player 2 index A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"12"},"slope":{"description":"Slope Rating. On the scorecard, 55 to 155. 113 is standard difficulty.","type":"integer","minimum":55,"maximum":155},"courseRating":{"description":"Course Rating. On the scorecard, to one decimal, e.g. 72.2 (or 36.1 for nine holes).","type":"number","minimum":20,"maximum":90},"par":{"description":"Par","type":"integer","minimum":27,"maximum":80}}},"example":{"index1":9.6,"index2":17.3,"slope":132,"courseRating":72.2,"par":72}}}},"responses":{"200":{"description":"The answer.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"Rate limited. Retry-After is set."}}}},"/api/calc/strokes-per-hole":{"get":{"operationId":"get_strokes_per_hole","summary":"Handicap Strokes Per Hole Calculator","description":"Which holes do I get a stroke on? Stroke index 1 is the hardest hole and the first to receive a stroke. A Playing Handicap of 12 gets one stroke on stroke index 1 to 12. Above the hole count the allocation wraps: every hole takes one stroke before any hole takes a second, so 24 is one everywhere plus a second on index 1 to 6. A plus handicap works in reverse, giving strokes back on the hardest holes first. Parful allocates strokes with exactly this rule on every card.","tags":["Tier 4"],"parameters":[{"name":"playingHandicap","in":"query","required":true,"schema":{"description":"Playing Handicap. The strokes you receive in this competition. Type a plus handicap with a plus sign. A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"12"},"description":"Playing Handicap. The strokes you receive in this competition. Type a plus handicap with a plus sign. A plus handicap is written with a plus sign, e.g. +2.4."},{"name":"strokeIndex","in":"query","required":true,"schema":{"description":"Stroke index Comma-separated, 9 or 18 entries; an empty entry means not yet entered.","type":"string","pattern":"^-?\\d*(,-?\\d*){8}$|^-?\\d*(,-?\\d*){17}$"},"description":"Stroke index Comma-separated, 9 or 18 entries; an empty entry means not yet entered."}],"responses":{"200":{"description":"The answer, the inputs, the worked steps and the rule.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}},"example":{"primary":{"label":"Strokes","value":24,"display":"24"},"result":{"playingHandicap":24,"total":24,"holes":[{"hole":1,"strokeIndex":1,"strokes":2},{"hole":2,"strokeIndex":11,"strokes":1},{"hole":3,"strokeIndex":5,"strokes":2},{"hole":4,"strokeIndex":15,"strokes":1},{"hole":5,"strokeIndex":3,"strokes":2},{"hole":6,"strokeIndex":13,"strokes":1},{"hole":7,"strokeIndex":7,"strokes":1},{"hole":8,"strokeIndex":17,"strokes":1},{"hole":9,"strokeIndex":9,"strokes":1},{"hole":10,"strokeIndex":2,"strokes":2},{"hole":11,"strokeIndex":12,"strokes":1},{"hole":12,"strokeIndex":6,"strokes":2},{"hole":13,"strokeIndex":16,"strokes":1},{"hole":14,"strokeIndex":4,"strokes":2},{"hole":15,"strokeIndex":14,"strokes":1},{"hole":16,"strokeIndex":8,"strokes":1},{"hole":17,"strokeIndex":18,"strokes":1},{"hole":18,"strokeIndex":10,"strokes":1}]},"explain":["24 over 18 holes: 1 on every hole, then 6 more on stroke index 1 to 6","hardest hole first, so stroke index 1 is always the first to receive one"],"sentence":"A playing handicap of 24 receives 1 stroke on every hole and an extra stroke on the 6 holes with stroke index 1 to 6."}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"60 per minute and 2,000 per day per IP. Retry-After is set."}}},"post":{"operationId":"post_strokes_per_hole","summary":"Handicap Strokes Per Hole Calculator (JSON body)","description":"The same calculation with a JSON body — for long inputs such as an 18-hole card. Arrays may be sent as JSON arrays or comma-separated strings.","tags":["Tier 4"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["playingHandicap","strokeIndex"],"properties":{"playingHandicap":{"description":"Playing Handicap. The strokes you receive in this competition. Type a plus handicap with a plus sign. A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"12"},"strokeIndex":{"description":"Stroke index Comma-separated, 9 or 18 entries; an empty entry means not yet entered.","type":"string","pattern":"^-?\\d*(,-?\\d*){8}$|^-?\\d*(,-?\\d*){17}$"}}},"example":{"playingHandicap":24,"strokeIndex":"1,11,5,15,3,13,7,17,9,2,12,6,16,4,14,8,18,10"}}}},"responses":{"200":{"description":"The answer.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"Rate limited. Retry-After is set."}}}},"/api/calc/mixed-tees":{"get":{"operationId":"get_mixed_tees","summary":"Mixed Tees Handicap Adjustment Calculator","description":"We play different tees. What adjustment applies? Under WHS Rule 6.2b a player on a tee with a higher par than the reference tee receives the par difference as extra strokes; a lower par gives strokes back. Nothing else is added: the Course Handicap already contains the Course Rating, so adjusting for rating again would double-count it. Parful applies this on club outings by default and, for Events, the strict form referenced to the lowest par in the field.","tags":["Tier 4"],"parameters":[{"name":"myPar","in":"query","required":true,"schema":{"description":"Par of my tee","type":"integer","minimum":27,"maximum":80},"description":"Par of my tee"},{"name":"referencePar","in":"query","required":true,"schema":{"description":"Par of the reference tee","type":"integer","minimum":27,"maximum":80},"description":"Par of the reference tee"},{"name":"myCourseRating","in":"query","required":false,"schema":{"description":"My tee's Course Rating","type":"number","minimum":40,"maximum":90},"description":"My tee's Course Rating"},{"name":"referenceCourseRating","in":"query","required":false,"schema":{"description":"Reference tee's Course Rating","type":"number","minimum":40,"maximum":90},"description":"Reference tee's Course Rating"}],"responses":{"200":{"description":"The answer, the inputs, the worked steps and the rule.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}},"example":{"primary":{"label":"Adjustment","value":2,"display":"+2"},"result":{"adjustment":2,"strictAdjustment":2,"parDifference":2,"courseRatingDifference":2.4000000000000057},"explain":["par difference: 72 − 70 = +2","course rating difference 2.4 is NOT added, the Course Handicap already carries it","adjustment = +2 strokes"],"sentence":"A tee with par 72 against a reference tee with par 70 gives a mixed-tee adjustment of +2 strokes."}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"60 per minute and 2,000 per day per IP. Retry-After is set."}}},"post":{"operationId":"post_mixed_tees","summary":"Mixed Tees Handicap Adjustment Calculator (JSON body)","description":"The same calculation with a JSON body — for long inputs such as an 18-hole card. Arrays may be sent as JSON arrays or comma-separated strings.","tags":["Tier 4"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["myPar","referencePar"],"properties":{"myPar":{"description":"Par of my tee","type":"integer","minimum":27,"maximum":80},"referencePar":{"description":"Par of the reference tee","type":"integer","minimum":27,"maximum":80},"myCourseRating":{"description":"My tee's Course Rating","type":"number","minimum":40,"maximum":90},"referenceCourseRating":{"description":"Reference tee's Course Rating","type":"number","minimum":40,"maximum":90}}},"example":{"myPar":72,"referencePar":70,"myCourseRating":72.2,"referenceCourseRating":69.8}}}},"responses":{"200":{"description":"The answer.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"Rate limited. Retry-After is set."}}}},"/api/calc/max-course-handicap":{"get":{"operationId":"get_max_course_handicap","summary":"Club Maximum Course Handicap Calculator","description":"My club caps handicaps. What do I actually play off? Convert the index to a Course Handicap for the tee. If it exceeds the club maximum, it plays as the maximum. THEN the format allowance is applied to the capped number. A cap of 30 on a player off 38 at 75% is 30 × 0.75 = 23 strokes, not 29. Applying the allowance first would let the cap bind on the wrong number. Plus handicaps are never capped. This is the order Parful applies.","tags":["Tier 4"],"parameters":[{"name":"handicapIndex","in":"query","required":true,"schema":{"description":"Handicap Index. From +10 to 54. Type a plus handicap with a plus sign, e.g. +2.4. A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"14.2"},"description":"Handicap Index. From +10 to 54. Type a plus handicap with a plus sign, e.g. +2.4. A plus handicap is written with a plus sign, e.g. +2.4."},{"name":"maximum","in":"query","required":true,"schema":{"description":"Club maximum. The cap in the club's competition rules, e.g. 28.","type":"integer","minimum":1,"maximum":54},"description":"Club maximum. The cap in the club's competition rules, e.g. 28."},{"name":"allowance","in":"query","required":false,"schema":{"description":"Allowance %","type":"integer","minimum":0,"maximum":100},"description":"Allowance %"},{"name":"slope","in":"query","required":true,"schema":{"description":"Slope Rating. On the scorecard, 55 to 155. 113 is standard difficulty.","type":"integer","minimum":55,"maximum":155},"description":"Slope Rating. On the scorecard, 55 to 155. 113 is standard difficulty."},{"name":"courseRating","in":"query","required":true,"schema":{"description":"Course Rating. On the scorecard, to one decimal, e.g. 72.2 (or 36.1 for nine holes).","type":"number","minimum":20,"maximum":90},"description":"Course Rating. On the scorecard, to one decimal, e.g. 72.2 (or 36.1 for nine holes)."},{"name":"par","in":"query","required":true,"schema":{"description":"Par","type":"integer","minimum":27,"maximum":80},"description":"Par"}],"responses":{"200":{"description":"The answer, the inputs, the worked steps and the rule.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}},"example":{"primary":{"label":"Playing Handicap","value":21,"display":"21"},"result":{"courseHandicap":41,"capped":28,"wasCapped":true,"maximum":28,"allowance":75,"playingHandicap":21},"explain":["34.6 × (132 ÷ 113) = 40.418","40.418 + (72.2 − 72) = 40.618","rounds to 41","41 is above the club maximum of 28, so plays as 28","28 × 75% = 21, rounds to 21"],"sentence":"A handicap index of 34.6 from a tee with a slope of 132, a course rating of 72.2 and a par of 72 is a course handicap of 41, capped at the club maximum of 28, giving a playing handicap of 21 at 75%."}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"60 per minute and 2,000 per day per IP. Retry-After is set."}}},"post":{"operationId":"post_max_course_handicap","summary":"Club Maximum Course Handicap Calculator (JSON body)","description":"The same calculation with a JSON body — for long inputs such as an 18-hole card. Arrays may be sent as JSON arrays or comma-separated strings.","tags":["Tier 4"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["handicapIndex","maximum","slope","courseRating","par"],"properties":{"handicapIndex":{"description":"Handicap Index. From +10 to 54. Type a plus handicap with a plus sign, e.g. +2.4. A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"14.2"},"maximum":{"description":"Club maximum. The cap in the club's competition rules, e.g. 28.","type":"integer","minimum":1,"maximum":54},"allowance":{"description":"Allowance %","type":"integer","minimum":0,"maximum":100},"slope":{"description":"Slope Rating. On the scorecard, 55 to 155. 113 is standard difficulty.","type":"integer","minimum":55,"maximum":155},"courseRating":{"description":"Course Rating. On the scorecard, to one decimal, e.g. 72.2 (or 36.1 for nine holes).","type":"number","minimum":20,"maximum":90},"par":{"description":"Par","type":"integer","minimum":27,"maximum":80}}},"example":{"handicapIndex":34.6,"maximum":28,"allowance":75,"slope":132,"courseRating":72.2,"par":72}}}},"responses":{"200":{"description":"The answer.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"Rate limited. Retry-After is set."}}}},"/api/calc/handicap-adjustment":{"get":{"operationId":"get_handicap_adjustment","summary":"Per-Outing Handicap Adjustment Calculator","description":"What does a 90% or minus-two adjustment do to my handicap? The adjustment is applied to the raw Handicap Index, multiplied by a percentage or offset by points, then rounded to one decimal and held between +10.0 and 54.0. Only then is the Course Handicap worked out for the tee, and only after that does any format allowance apply. The player's source index is never changed. This is the order Parful uses on every outing with an adjustment.","tags":["Tier 4"],"parameters":[{"name":"handicapIndex","in":"query","required":true,"schema":{"description":"Handicap Index. From +10 to 54. Type a plus handicap with a plus sign, e.g. +2.4. A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"14.2"},"description":"Handicap Index. From +10 to 54. Type a plus handicap with a plus sign, e.g. +2.4. A plus handicap is written with a plus sign, e.g. +2.4."},{"name":"kind","in":"query","required":false,"schema":{"description":"Adjustment","type":"string","enum":["percent","points"],"default":"percent"},"description":"Adjustment"},{"name":"amount","in":"query","required":true,"schema":{"description":"Amount. A percentage from 1 to 200, or points from −20 to +20.","type":"number","minimum":-20,"maximum":200},"description":"Amount. A percentage from 1 to 200, or points from −20 to +20."},{"name":"slope","in":"query","required":true,"schema":{"description":"Slope Rating. On the scorecard, 55 to 155. 113 is standard difficulty.","type":"integer","minimum":55,"maximum":155},"description":"Slope Rating. On the scorecard, 55 to 155. 113 is standard difficulty."},{"name":"courseRating","in":"query","required":true,"schema":{"description":"Course Rating. On the scorecard, to one decimal, e.g. 72.2 (or 36.1 for nine holes).","type":"number","minimum":20,"maximum":90},"description":"Course Rating. On the scorecard, to one decimal, e.g. 72.2 (or 36.1 for nine holes)."},{"name":"par","in":"query","required":true,"schema":{"description":"Par","type":"integer","minimum":27,"maximum":80},"description":"Par"}],"responses":{"200":{"description":"The answer, the inputs, the worked steps and the rule.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}},"example":{"primary":{"label":"Adjusted index","value":12.8,"display":"12.8"},"secondary":{"label":"Course Handicap","value":15,"display":"15"},"result":{"adjustedIndex":12.8,"courseHandicap":15,"kind":"percent","amount":90,"clamped":false},"explain":["14.2 × 90% = 12.78, to one decimal 12.8","within +10.0 to 54.0, no clamp","12.8 × (132 ÷ 113) = 14.952","14.952 + (72.2 − 72) = 15.152","rounds to 15"],"sentence":"A 90% adjustment turns a handicap index of 14.2 into 12.8, which from a tee with a slope of 132, a course rating of 72.2 and a par of 72 is a course handicap of 15."}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"60 per minute and 2,000 per day per IP. Retry-After is set."}}},"post":{"operationId":"post_handicap_adjustment","summary":"Per-Outing Handicap Adjustment Calculator (JSON body)","description":"The same calculation with a JSON body — for long inputs such as an 18-hole card. Arrays may be sent as JSON arrays or comma-separated strings.","tags":["Tier 4"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["handicapIndex","amount","slope","courseRating","par"],"properties":{"handicapIndex":{"description":"Handicap Index. From +10 to 54. Type a plus handicap with a plus sign, e.g. +2.4. A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"14.2"},"kind":{"description":"Adjustment","type":"string","enum":["percent","points"],"default":"percent"},"amount":{"description":"Amount. A percentage from 1 to 200, or points from −20 to +20.","type":"number","minimum":-20,"maximum":200},"slope":{"description":"Slope Rating. On the scorecard, 55 to 155. 113 is standard difficulty.","type":"integer","minimum":55,"maximum":155},"courseRating":{"description":"Course Rating. On the scorecard, to one decimal, e.g. 72.2 (or 36.1 for nine holes).","type":"number","minimum":20,"maximum":90},"par":{"description":"Par","type":"integer","minimum":27,"maximum":80}}},"example":{"handicapIndex":14.2,"kind":"percent","amount":90,"slope":132,"courseRating":72.2,"par":72}}}},"responses":{"200":{"description":"The answer.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"Rate limited. Retry-After is set."}}}},"/api/calc/esc":{"get":{"operationId":"get_esc","summary":"Equitable Stroke Control (ESC) Calculator","description":"What was my adjusted gross under Equitable Stroke Control? Find the Course Handicap band: 9 or less caps at double bogey, 10 to 19 at 7, 20 to 29 at 8, 30 to 39 at 9, 40 or more at 10. Every hole above the cap is reduced to it. The adjusted gross is the sum. ESC was the USGA rule until the end of 2019 and was replaced by net double bogey under the World Handicap System.","tags":["Tier 4"],"parameters":[{"name":"courseHandicap","in":"query","required":true,"schema":{"description":"Course Handicap A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"12"},"description":"Course Handicap A plus handicap is written with a plus sign, e.g. +2.4."},{"name":"pars","in":"query","required":true,"schema":{"description":"Hole pars Comma-separated, 9 or 18 entries; an empty entry means not yet entered.","type":"string","pattern":"^-?\\d*(,-?\\d*){8}$|^-?\\d*(,-?\\d*){17}$"},"description":"Hole pars Comma-separated, 9 or 18 entries; an empty entry means not yet entered."},{"name":"scores","in":"query","required":true,"schema":{"description":"Scores Comma-separated, 9 or 18 entries; an empty entry means not yet entered.","type":"string","pattern":"^-?\\d*(,-?\\d*){8}$|^-?\\d*(,-?\\d*){17}$","example":"5,4,4,6,3,4,5,4,4,4,5,3,4,4,5,4,3,5"},"description":"Scores Comma-separated, 9 or 18 entries; an empty entry means not yet entered."}],"responses":{"200":{"description":"The answer, the inputs, the worked steps and the rule.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}},"example":{"primary":{"label":"Adjusted gross","value":93,"display":"93"},"result":{"adjusted":93,"gross":96,"capped":2,"maximum":7,"band":"10 to 19","holes":[{"hole":1,"gross":5,"cap":7,"adjusted":5,"capped":false},{"hole":2,"gross":5,"cap":7,"adjusted":5,"capped":false},{"hole":3,"gross":4,"cap":7,"adjusted":4,"capped":false},{"hole":4,"gross":9,"cap":7,"adjusted":7,"capped":true},{"hole":5,"gross":6,"cap":7,"adjusted":6,"capped":false},{"hole":6,"gross":5,"cap":7,"adjusted":5,"capped":false},{"hole":7,"gross":3,"cap":7,"adjusted":3,"capped":false},{"hole":8,"gross":5,"cap":7,"adjusted":5,"capped":false},{"hole":9,"gross":6,"cap":7,"adjusted":6,"capped":false},{"hole":10,"gross":4,"cap":7,"adjusted":4,"capped":false},{"hole":11,"gross":5,"cap":7,"adjusted":5,"capped":false},{"hole":12,"gross":6,"cap":7,"adjusted":6,"capped":false},{"hole":13,"gross":4,"cap":7,"adjusted":4,"capped":false},{"hole":14,"gross":8,"cap":7,"adjusted":7,"capped":true},{"hole":15,"gross":5,"cap":7,"adjusted":5,"capped":false},{"hole":16,"gross":6,"cap":7,"adjusted":6,"capped":false},{"hole":17,"gross":5,"cap":7,"adjusted":5,"capped":false},{"hole":18,"gross":5,"cap":7,"adjusted":5,"capped":false}]},"explain":["course handicap 17 is in the 10 to 19 band: maximum 7 on any hole","capped: hole 4 9→7, hole 14 8→7","gross 96 → adjusted gross 93"],"sentence":"Under Equitable Stroke Control a course handicap of 17 caps every hole at 7, turning a gross of 96 into an adjusted gross score of 93."}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"60 per minute and 2,000 per day per IP. Retry-After is set."}}},"post":{"operationId":"post_esc","summary":"Equitable Stroke Control (ESC) Calculator (JSON body)","description":"The same calculation with a JSON body — for long inputs such as an 18-hole card. Arrays may be sent as JSON arrays or comma-separated strings.","tags":["Tier 4"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["courseHandicap","pars","scores"],"properties":{"courseHandicap":{"description":"Course Handicap A plus handicap is written with a plus sign, e.g. +2.4.","type":"string","pattern":"^[+-]?\\d+(\\.\\d+)?$","example":"12"},"pars":{"description":"Hole pars Comma-separated, 9 or 18 entries; an empty entry means not yet entered.","type":"string","pattern":"^-?\\d*(,-?\\d*){8}$|^-?\\d*(,-?\\d*){17}$"},"scores":{"description":"Scores Comma-separated, 9 or 18 entries; an empty entry means not yet entered.","type":"string","pattern":"^-?\\d*(,-?\\d*){8}$|^-?\\d*(,-?\\d*){17}$","example":"5,4,4,6,3,4,5,4,4,4,5,3,4,4,5,4,3,5"}}},"example":{"courseHandicap":17,"pars":"4,4,3,4,5,4,3,4,5,3,4,5,3,4,4,5,4,4","scores":"5,5,4,9,6,5,3,5,6,4,5,6,4,8,5,6,5,5"}}}},"responses":{"200":{"description":"The answer.","content":{"application/json":{"schema":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}}}}},"400":{"description":"A missing or invalid input, named.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"Rate limited. Retry-After is set."}}}}},"components":{"schemas":{"CalculationResult":{"type":"object","required":["calculator","result","primary","inputs","explain","sentence","source","page"],"properties":{"calculator":{"type":"string","description":"The calculator slug."},"result":{"type":"object","description":"Named outputs. Fields are added over time; an existing field never changes meaning.","additionalProperties":true},"primary":{"type":"object","description":"The headline answer.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string","description":"The answer as a golfer reads it, e.g. \"17\" or \"+3\"."}}},"secondary":{"type":"object","description":"A second figure shown beside the headline, when a calculator has one: the handicap on a guest-day system whose headline is the net score. Absent otherwise.","properties":{"label":{"type":"string"},"value":{},"display":{"type":"string"}}},"inputs":{"type":"object","description":"The parsed inputs the answer was computed from.","additionalProperties":true},"explain":{"type":"array","items":{"type":"string"},"description":"The worked steps, one per line, in order. Quote these."},"sentence":{"type":"string","description":"One natural-language sentence stating inputs → output. Quotable and correct."},"source":{"type":"string","format":"uri","description":"The Parful library page for the rule this calculator applies."},"page":{"type":"string","format":"uri","description":"The calculator page, which also accepts these inputs as query parameters."}}},"CalculationError":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A readable message naming the field."},"field":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}}}}},"externalDocs":{"description":"The Parful library — the rules these calculators apply.","url":"https://www.parful.io/library"}}