# formulas-and-strategies

Look up the formulas, strategies and recipes behind the calculations.

| Method | Path | Title | Access | Price | MCP tool |
| --- | --- | --- | --- | --- | --- |
| GET | [`/v1/strategies`](#list-strategies) | List strategies | public | 1 | none |
| GET | [`/v1/strategies/{strategy_id}`](#get-strategy) | Get a strategy | public | 1 | none |
| POST | [`/v1/strategies/{strategy_id}:check`](#check-strategy) | Check a strategy on your numbers | public | 1 | `check_strategy` |
| GET | [`/v1/recipes`](#list-recipes) | List recipes | public | 1 | none |
| GET | [`/v1/recipes/{recipe_id}`](#get-recipe) | Get a recipe | public | 1 | none |

`GET /v1/strategies`

## List strategies
public, no key needed · 1 credit, not charged during the beta · status live

Strategy records in ledger order (family, then ledger row), filterable by family, verdict and route: each with its verdict, decisive figure, evidence date and grade, inputs, checks and chains. No edges and no rankings.

### Parameters
- `family` string · query  
  Only this family, B1 to B14 or F1 to F9.  
  pattern ^[BF][0-9]{1,2}$
- `verdict` string · query  
  Only this verdict.  
  One of: `robust`, `conditional`, `weak`, `myth`, `prohibited` (open: new values may be added).
- `route` string · query  
  Only this route.  
  One of: `execute`, `check_then_execute`, `warn_first`, `decline`, `refuse` (open: new values may be added).

### Response
`200` Every matching strategy, in ledger order.

- `data` array of object · required  
  The strategies, by family then ledger row; never ordered by a betting measure.
  - `id` string · required  
    The registry ID, a slug such as line-shopping.
  - `public_id` string  
    The Kelly ID (stg_…), stable for ever.
  - `name` string · required  
    The strategy's name.
  - `ledger_row` integer · nullable  
    Its row in the verdict ledger (1 to 134), or null for a Part I verdict without a row.
  - `family` string  
    The family: B1 to B14 for betting, F1 to F9 for fantasy.
  - `family_name` string  
    The family's name.
  - `verdict` string · required  
    The verdict.  
    One of: `robust`, `conditional`, `weak`, `myth`, `prohibited` (open: new values may be added).
  - `verdict_text` string  
    The ledger's full wording, such as Robust, limited.
  - `route` string · required  
    What a check does: run it, check then run, warn first, decline with the evidence, or refuse.  
    One of: `execute`, `check_then_execute`, `warn_first`, `decline`, `refuse` (open: new values may be added).
  - `route_by_rule` string · nullable  
    The rule that sets the route, when a rule does rather than the verdict.
  - `decisive_figure` string · required  
    The figure the verdict rests on, in words.
  - `evidence` object · required  
    The grade (and the grade in words), the month the evidence runs through, review dates, a summary and the sources.
  - `flip_conditions` array of object  
    The evidence that would change the verdict, each with the verdict it would flip to.
  - `inputs` array of object  
    The inputs it takes: execution_input true means never assumed (D28).
  - `preconditions` array of object  
    The typed checks it runs, with the sentence shown when one fails.
  - `chains` array of object  
    The decision chains that run it (C1 to C46), each with its name and whether it runs today.
  - `formulas` array of string  
    The formula cards it uses, by card ID.
  - `price_basis` string  
    user (your own price), consensus or none (D27).
  - `alternative` object · nullable  
    For a Weak or Myth strategy: the robust one to run instead and what Kelly never produces.
  - `aliases` array of string  
    Other names it goes by.
  - `version` integer · required  
    The verdict's version, bumped when the verdict or its evidence changes.
- `has_more` boolean · required  
  Always false: every match comes in one page.
- `next_cursor` string · required · nullable  
  Always null: every match comes in one page.
- `registry_version` string · required  
  The registry's version.
- `as_of` string  
  The registry's as-of date, at midnight UTC.  
  format date-time

### Errors
[`invalid_request`](/problems/invalid_request) · [`credential_in_url`](/problems/credential_in_url) · [`unsupported_api_version`](/problems/unsupported_api_version) · [`unauthenticated`](/problems/unauthenticated) · [`method_not_allowed`](/problems/method_not_allowed) · [`rate_limited`](/problems/rate_limited) · [`internal_error`](/problems/internal_error) · [`service_unavailable`](/problems/service_unavailable) · [`quota_exhausted`](/problems/quota_exhausted)

### Example
```http
GET https://api.askkelly.ai/v1/strategies?family=B1&verdict=robust
Authorization: Bearer $KELLY_API_KEY
```

```json
{
  "data": [
    {
      "id": "line-shopping",
      "public_id": "stg_8ermmkdkdash36dpv8t4",
      "name": "Line shopping and reduced juice",
      "ledger_row": 1,
      "family": "B1",
      "family_name": "Price shopping and market-relative betting",
      "verdict": "robust",
      "verdict_text": "Robust",
      "route": "execute",
      "route_by_rule": null,
      "decisive_figure": "−110 to −105 cuts the break-even from 52.38% to 51.22%.",
      "evidence": {
        "grade": "peer_reviewed",
        "grade_words": "peer-reviewed",
        "through": "2026-10",
        "reviewed_at": "2026-10-16",
        "review_due": "2027-10-16",
        "summary": "exact arithmetic",
        "sources": [
          "sports-betting-and-fantasy-strategies.md Part I ledger, row 1",
          "strategy-playbooks.md §6 B1"
        ],
        "stale": false
      },
      "flip_conditions": [
        {
          "id": "none-arithmetic",
          "evidence": "None; the break-even is arithmetic. Only a change in how books price (no hold) would reopen it.",
          "to": null
        }
      ],
      "inputs": [
        {
          "id": "selection",
          "execution_input": true,
          "what": "The selection or options the user names (D21, D29: never inferred from a slate)",
          "note": null
        },
        {
          "id": "slip_price",
          "execution_input": true,
          "what": "The price on the user's slip, with its time",
          "note": "off-site: the prices the user sees, pasted with their time"
        },
        {
          "id": "jurisdiction",
          "execution_input": true,
          "what": "The state, and any per-bet fee",
          "note": "books the user can legally use"
        },
        {
          "id": "market_reference",
          "execution_input": false,
          "what": "The sharp-weighted no-vig consensus, or Pinnacle where available",
          "note": null
        },
        {
          "id": "odds_format",
          "execution_input": false,
          "what": "American odds as the display format",
          "note": null
        }
      ],
      "preconditions": [
        {
          "id": "price-pasted-off-site",
          "check": "user_price_given",
          "threshold": null,
          "card": null,
          "on_fail": "Paste the prices you see, and Kelly runs the comparison; live per-book prices are on askkelly.ai."
        }
      ],
      "chains": [
        {
          "id": "C1",
          "name": "bet a side at a soft book",
          "runs": true
        }
      ],
      "formulas": [
        "F1.1",
        "F1.4",
        "F1.7",
        "F1.8",
        "F3.1"
      ],
      "price_basis": "user",
      "alternative": null,
      "aliases": [
        "line shopping",
        "reduced juice",
        "best price",
        "shop the line"
      ],
      "version": 1
    },
    {
      "id": "soft-books-against-de-vigged",
      "public_id": "stg_967dcdhf4hcz459zp1y8",
      "name": "Soft books against de-vigged sharp or consensus prices",
      "ledger_row": 2,
      "family": "B1",
      "family_name": "Price shopping and market-relative betting",
      "verdict": "robust",
      "verdict_text": "Robust, limited",
      "route": "check_then_execute",
      "route_by_rule": null,
      "decisive_figure": "The named bet must stay +EV under the least favourable de-vig method; winning this way gets accounts limited: 0.64% of Massachusetts bettors were limited in data shown to regulators in September 2025.",
      "evidence": {
        "grade": "unrefereed",
        "grade_words": "unrefereed or one season",
        "through": "2025-12",
        "reviewed_at": "2026-10-16",
        "review_due": "2027-10-16",
        "summary": "one unrefereed academic test (Kaunitz 2017), practitioner backtests (Pinho)",
        "sources": [
          "sports-betting-and-fantasy-strategies.md Part I ledger, row 2",
          "strategy-playbooks.md §6 B1",
          "strategy-map.md §1a, #2"
        ],
        "stale": false
      },
      "flip_conditions": [
        {
          "id": "refereed-null",
          "evidence": "A refereed out-of-sample test in which bets beating the worst-case no-vig consensus fail to return above zero after the hold",
          "to": "conditional"
        }
      ],
      "inputs": [
        {
          "id": "selection",
          "execution_input": true,
          "what": "The selection or options the user names (D21, D29: never inferred from a slate)",
          "note": null
        },
        {
          "id": "slip_price",
          "execution_input": true,
          "what": "The price on the user's slip, with its time",
          "note": "the soft-book price, with its time"
        },
        {
          "id": "jurisdiction",
          "execution_input": true,
          "what": "The state, and any per-bet fee",
          "note": "books the user can legally use"
        },
        {
          "id": "user_probability",
          "execution_input": true,
          "what": "The user's own probability",
          "note": "only if a stake is wanted (B3)"
        },
        {
          "id": "market_reference",
          "execution_input": false,
          "what": "The sharp-weighted no-vig consensus, or Pinnacle where available",
          "note": null
        },
        {
          "id": "devig_method",
          "execution_input": false,
          "what": "The de-vig method by market shape, named, with a worst-case screen",
          "note": null
        },
        {
          "id": "odds_format",
          "execution_input": false,
          "what": "American odds as the display format",
          "note": null
        }
      ],
      "preconditions": [
        {
          "id": "selection-named",
          "check": "selection_named",
          "threshold": null,
          "card": null,
          "on_fail": "Kelly checks selections you name; it doesn't screen slates. Name the bet and Kelly checks it against the no-vig market."
        },
        {
          "id": "sharp-reference",
          "check": "sharp_reference_exists",
          "threshold": null,
          "card": null,
          "on_fail": "There's no sharp no-vig market for this selection, so Kelly shows the hold and your break-even only."
        },
        {
          "id": "devig-fits",
          "check": "devig_method_fits",
          "threshold": null,
          "card": "F2.10",
          "on_fail": "Both de-vig methods are shown and the power figure is used on a longshot board."
        },
        {
          "id": "worst-case-ev",
          "check": "worst_case_ev_positive",
          "threshold": null,
          "card": "F2.9",
          "on_fail": "No bet at {price}: the break-even {be} sits above the worst-case no-vig {p}."
        },
        {
          "id": "price-live",
          "check": "price_fresh",
          "threshold": null,
          "card": null,
          "on_fail": "Price from {time}; recheck the slip."
        },
        {
          "id": "kelly-probability-off-site",
          "check": "first_party_surface",
          "threshold": null,
          "card": null,
          "on_fail": "Here the no-vig market gives {m}%, and your price of {price} needs {break-even}%; `edge_status` is {status}. Kelly's own probability is on askkelly.ai."
        }
      ],
      "chains": [
        {
          "id": "C1",
          "name": "bet a side at a soft book",
          "runs": true
        }
      ],
      "formulas": [
        "F1.1",
        "F1.4",
        "F1.7",
        "F1.8",
        "F2.2",
        "F2.4",
        "F2.5",
        "F2.9",
        "F2.10",
        "F3.1",
        "F3.6"
      ],
      "price_basis": "user",
      "alternative": null,
      "aliases": [
        "+EV betting",
        "positive EV betting",
        "beat the soft book",
        "sharp vs soft",
        "value betting"
      ],
      "version": 1
    },
    {
      "id": "power-shin-devig",
      "public_id": "stg_jcsf1rj62t6h5nxd79r0",
      "name": "Power or Shin de-vig for n-way markets",
      "ledger_row": 4,
      "family": "B1",
      "family_name": "Price shopping and market-relative betting",
      "verdict": "robust",
      "verdict_text": "Robust",
      "route": "execute",
      "route_by_rule": null,
      "decisive_figure": "On a +120/+250/+400/+600 board the +600 outcome is fair at +696 by power against +658 multiplicative.",
      "evidence": {
        "grade": "peer_reviewed",
        "grade_words": "peer-reviewed",
        "through": "2026-10",
        "reviewed_at": "2026-10-16",
        "review_due": "2027-10-16",
        "summary": "peer-reviewed comparison of de-vig methods (Clarke et al. 2017)",
        "sources": [
          "sports-betting-and-fantasy-strategies.md Part I ledger, row 4"
        ],
        "stale": false
      },
      "flip_conditions": [
        {
          "id": "method-calibration-reversal",
          "evidence": "A peer-reviewed calibration study in which multiplicative de-vig beats power and Shin on n-way boards",
          "to": "conditional"
        }
      ],
      "inputs": [
        {
          "id": "selection",
          "execution_input": true,
          "what": "The selection or options the user names (D21, D29: never inferred from a slate)",
          "note": null
        },
        {
          "id": "slip_price",
          "execution_input": true,
          "what": "The price on the user's slip, with its time",
          "note": null
        },
        {
          "id": "devig_method",
          "execution_input": false,
          "what": "The de-vig method by market shape, named, with a worst-case screen",
          "note": null
        }
      ],
      "preconditions": [],
      "chains": [
        {
          "id": "C2",
          "name": "future or outright",
          "runs": true
        },
        {
          "id": "C9",
          "name": "cross-market, alternate, derivative or live line",
          "runs": true
        }
      ],
      "formulas": [
        "F2.4",
        "F2.5",
        "F2.10",
        "F8.1"
      ],
      "price_basis": "user",
      "alternative": null,
      "aliases": [
        "power de-vig",
        "Shin de-vig",
        "de-vig this board"
      ],
      "version": 1
    },
    {
      "id": "early-lines-news-latency",
      "public_id": "stg_cetsmqj4qems795cb8bn",
      "name": "Early lines and news latency",
      "ledger_row": 37,
      "family": "B1",
      "family_name": "Price shopping and market-relative betting",
      "verdict": "robust",
      "verdict_text": "Robust for informed bettors; limited at retail",
      "route": "check_then_execute",
      "route_by_rule": null,
      "decisive_figure": "Runs on the user's post-news probability; a stale −110 is worth 0.70% of a unit per opportunity at 3 points of dispersion (RT).",
      "evidence": {
        "grade": "research_team",
        "grade_words": "research-team computation (RT)",
        "through": "2026-10",
        "reviewed_at": "2026-10-16",
        "review_due": "2027-10-16",
        "summary": "Thorp–Walden theorem (peer-reviewed), window values a research-team computation (RT); F25.3 theoretical only",
        "sources": [
          "sports-betting-and-fantasy-strategies.md Part I ledger, row 37",
          "strategy-playbooks.md §6 B1"
        ],
        "stale": false
      },
      "flip_conditions": [
        {
          "id": "latency-voided",
          "evidence": "Dated evidence that books now void or reprice stale-line bets placed before their own update as a rule, so the window cannot be taken at retail",
          "to": "conditional"
        }
      ],
      "inputs": [
        {
          "id": "selection",
          "execution_input": true,
          "what": "The selection or options the user names (D21, D29: never inferred from a slate)",
          "note": null
        },
        {
          "id": "slip_price",
          "execution_input": true,
          "what": "The price on the user's slip, with its time",
          "note": "the price taken or available, with its time"
        },
        {
          "id": "user_probability",
          "execution_input": true,
          "what": "The user's own probability",
          "note": "the user's post-news probability; Kelly's news-adjusted probability is never the input off-site"
        },
        {
          "id": "market_reference",
          "execution_input": false,
          "what": "The sharp-weighted no-vig consensus, or Pinnacle where available",
          "note": null
        }
      ],
      "preconditions": [
        {
          "id": "selection-named",
          "check": "selection_named",
          "threshold": null,
          "card": null,
          "on_fail": "Kelly checks bets you name; it doesn't scan the board or rank edges. Name the bet and Kelly runs the stale-price check on it."
        },
        {
          "id": "post-news-probability",
          "check": "post_news_probability",
          "threshold": null,
          "card": null,
          "on_fail": "A stale-price check needs your post-news probability; Kelly's own isn't used here."
        },
        {
          "id": "price-live",
          "check": "price_fresh",
          "threshold": null,
          "card": null,
          "on_fail": "Price from {time}; recheck the slip."
        },
        {
          "id": "kelly-probability-off-site",
          "check": "first_party_surface",
          "threshold": null,
          "card": null,
          "on_fail": "Here the no-vig market gives {m}%, and your price of {price} needs {break-even}%; `edge_status` is {status}. Kelly's own probability is on askkelly.ai."
        }
      ],
      "chains": [
        {
          "id": "C1",
          "name": "bet a side at a soft book",
          "runs": true
        },
        {
          "id": "C9",
          "name": "cross-market, alternate, derivative or live line",
          "runs": true
        },
        {
          "id": "C17",
          "name": "add after a line move, or wait",
          "runs": true
        }
      ],
      "formulas": [
        "F2.2",
        "F13.11",
        "F3.1",
        "F3.6",
        "F3.11",
        "F25.3"
      ],
      "price_basis": "user",
      "alternative": null,
      "aliases": [
        "bet before the news hits",
        "stale line after injury news",
        "beat the line move"
      ],
      "version": 1
    },
    {
      "id": "cross-market-consistency-screens-implied",
      "public_id": "stg_0s0kd6zhntk580afkhjf",
      "name": "Cross-market consistency screens (implied σ, intensities, ladders, props)",
      "ledger_row": 56,
      "family": "B1",
      "family_name": "Price shopping and market-relative betting",
      "verdict": "robust",
      "verdict_text": "Robust as screens; conditional as edges",
      "route": "check_then_execute",
      "route_by_rule": null,
      "decisive_figure": "Checks the named market's ladder and implied σ; normal-model alternates misprice crossings of 3 and 7 by 5–8 points (RT).",
      "evidence": {
        "grade": "research_team",
        "grade_words": "research-team computation (RT)",
        "through": "2026-02",
        "reviewed_at": "2026-10-16",
        "review_due": "2027-10-16",
        "summary": "research-team computation on nflverse closes (RT); whether US books still use smooth curves is unsourced",
        "sources": [
          "sports-betting-and-fantasy-strategies.md Part I ledger, row 56",
          "strategy-playbooks.md §6 B1"
        ],
        "stale": false
      },
      "flip_conditions": [
        {
          "id": "books-use-empirical-pmf",
          "evidence": "Dated evidence that US books price alternates from an empirical key-number distribution, or an out-of-sample record of flagged rungs that fails against the close",
          "to": "conditional"
        }
      ],
      "inputs": [
        {
          "id": "selection",
          "execution_input": true,
          "what": "The selection or options the user names (D21, D29: never inferred from a slate)",
          "note": "the related markets or rungs the user names"
        },
        {
          "id": "slip_price",
          "execution_input": true,
          "what": "The price on the user's slip, with its time",
          "note": null
        },
        {
          "id": "market_reference",
          "execution_input": false,
          "what": "The sharp-weighted no-vig consensus, or Pinnacle where available",
          "note": null
        },
        {
          "id": "devig_method",
          "execution_input": false,
          "what": "The de-vig method by market shape, named, with a worst-case screen",
          "note": null
        }
      ],
      "preconditions": [
        {
          "id": "selection-named",
          "check": "selection_named",
          "threshold": null,
          "card": null,
          "on_fail": "Kelly checks bets you name; it doesn't scan the board or rank edges. Name the market and its rungs, and Kelly checks them for consistency."
        },
        {
          "id": "related-consistent",
          "check": "related_prices_consistent",
          "threshold": null,
          "card": "F19.12",
          "on_fail": "The rung at {line} breaks the ladder: a stale price, or across two books an arbitrage handed to the arbitrage check."
        }
      ],
      "chains": [
        {
          "id": "C9",
          "name": "cross-market, alternate, derivative or live line",
          "runs": true
        }
      ],
      "formulas": [
        "F2.4",
        "F36.5",
        "F16.15",
        "F19.12",
        "F4.10",
        "F4.7",
        "F6.1",
        "F3.1"
      ],
      "price_basis": "user",
      "alternative": null,
      "aliases": [
        "alt line pricing",
        "ladder check",
        "implied sigma",
        "related markets disagree"
      ],
      "version": 1
    }
  ],
  "has_more": false,
  "next_cursor": null,
  "registry_version": "2026.10.2",
  "as_of": "2026-10-17T00:00:00Z"
}
```

`GET /v1/strategies/{strategy_id}`

## Get a strategy
public, no key needed · 1 credit, not charged during the beta · status live

One strategy: what it claims, the evidence and its verdict, the evidence that would change it, the inputs it needs and the chains that run it.

### Parameters
- `strategy_id` string · path · required  
  The registry ID (line-shopping), from the list.  
  pattern ^[a-z0-9]+(-[a-z0-9]+)*$ · max length 80

### Response
`200` The strategy.

- `id` string · required  
  The registry ID, a slug such as line-shopping.
- `public_id` string  
  The Kelly ID (stg_…), stable for ever.
- `name` string · required  
  The strategy's name.
- `ledger_row` integer · nullable  
  Its row in the verdict ledger (1 to 134), or null for a Part I verdict without a row.
- `family` string  
  The family: B1 to B14 for betting, F1 to F9 for fantasy.
- `family_name` string  
  The family's name.
- `verdict` string · required  
  The verdict.  
  One of: `robust`, `conditional`, `weak`, `myth`, `prohibited` (open: new values may be added).
- `verdict_text` string  
  The ledger's full wording, such as Robust, limited.
- `route` string · required  
  What a check does: run it, check then run, warn first, decline with the evidence, or refuse.  
  One of: `execute`, `check_then_execute`, `warn_first`, `decline`, `refuse` (open: new values may be added).
- `route_by_rule` string · nullable  
  The rule that sets the route, when a rule does rather than the verdict.
- `decisive_figure` string · required  
  The figure the verdict rests on, in words.
- `evidence` object · required  
  The grade (and the grade in words), the month the evidence runs through, review dates, a summary and the sources.
- `flip_conditions` array of object  
  The evidence that would change the verdict, each with the verdict it would flip to.
- `inputs` array of object  
  The inputs it takes: execution_input true means never assumed (D28).
- `preconditions` array of object  
  The typed checks it runs, with the sentence shown when one fails.
- `chains` array of object  
  The decision chains that run it (C1 to C46), each with its name and whether it runs today.
- `formulas` array of string  
  The formula cards it uses, by card ID.
- `price_basis` string  
  user (your own price), consensus or none (D27).
- `alternative` object · nullable  
  For a Weak or Myth strategy: the robust one to run instead and what Kelly never produces.
- `aliases` array of string  
  Other names it goes by.
- `version` integer · required  
  The verdict's version, bumped when the verdict or its evidence changes.

### Errors
[`invalid_request`](/problems/invalid_request) · [`credential_in_url`](/problems/credential_in_url) · [`unsupported_api_version`](/problems/unsupported_api_version) · [`unauthenticated`](/problems/unauthenticated) · [`method_not_allowed`](/problems/method_not_allowed) · [`rate_limited`](/problems/rate_limited) · [`internal_error`](/problems/internal_error) · [`service_unavailable`](/problems/service_unavailable) · [`quota_exhausted`](/problems/quota_exhausted) · [`not_found`](/problems/not_found)

### Example
```http
GET https://api.askkelly.ai/v1/strategies/no-such-thing
Authorization: Bearer $KELLY_API_KEY
```

```json
{
  "type": "https://docs.askkelly.ai/problems/not_found",
  "title": "Not found",
  "status": 404,
  "code": "not_found",
  "detail": "No strategy has that ID; GET /v1/strategies lists them.",
  "param": "strategy_id",
  "doc_url": "https://docs.askkelly.ai/problems/not_found",
  "request_id": "req_5e3ee64267173eb87368ab0d",
  "retryable": false,
  "display_message": "That could not be found."
}
```

```http
GET https://api.askkelly.ai/v1/strategies/line-shopping
Authorization: Bearer $KELLY_API_KEY
```

```json
{
  "id": "line-shopping",
  "public_id": "stg_8ermmkdkdash36dpv8t4",
  "name": "Line shopping and reduced juice",
  "ledger_row": 1,
  "family": "B1",
  "family_name": "Price shopping and market-relative betting",
  "verdict": "robust",
  "verdict_text": "Robust",
  "route": "execute",
  "route_by_rule": null,
  "decisive_figure": "−110 to −105 cuts the break-even from 52.38% to 51.22%.",
  "evidence": {
    "grade": "peer_reviewed",
    "grade_words": "peer-reviewed",
    "through": "2026-10",
    "reviewed_at": "2026-10-16",
    "review_due": "2027-10-16",
    "summary": "exact arithmetic",
    "sources": [
      "sports-betting-and-fantasy-strategies.md Part I ledger, row 1",
      "strategy-playbooks.md §6 B1"
    ],
    "stale": false
  },
  "flip_conditions": [
    {
      "id": "none-arithmetic",
      "evidence": "None; the break-even is arithmetic. Only a change in how books price (no hold) would reopen it.",
      "to": null
    }
  ],
  "inputs": [
    {
      "id": "selection",
      "execution_input": true,
      "what": "The selection or options the user names (D21, D29: never inferred from a slate)",
      "note": null
    },
    {
      "id": "slip_price",
      "execution_input": true,
      "what": "The price on the user's slip, with its time",
      "note": "off-site: the prices the user sees, pasted with their time"
    },
    {
      "id": "jurisdiction",
      "execution_input": true,
      "what": "The state, and any per-bet fee",
      "note": "books the user can legally use"
    },
    {
      "id": "market_reference",
      "execution_input": false,
      "what": "The sharp-weighted no-vig consensus, or Pinnacle where available",
      "note": null
    },
    {
      "id": "odds_format",
      "execution_input": false,
      "what": "American odds as the display format",
      "note": null
    }
  ],
  "preconditions": [
    {
      "id": "price-pasted-off-site",
      "check": "user_price_given",
      "threshold": null,
      "card": null,
      "on_fail": "Paste the prices you see, and Kelly runs the comparison; live per-book prices are on askkelly.ai."
    }
  ],
  "chains": [
    {
      "id": "C1",
      "name": "bet a side at a soft book",
      "runs": true
    }
  ],
  "formulas": [
    "F1.1",
    "F1.4",
    "F1.7",
    "F1.8",
    "F3.1"
  ],
  "price_basis": "user",
  "alternative": null,
  "aliases": [
    "line shopping",
    "reduced juice",
    "best price",
    "shop the line"
  ],
  "version": 1
}
```

`POST /v1/strategies/{strategy_id}:check`

## Check a strategy on your numbers
public, no key needed · 1 credit, not charged during the beta · MCP tool `check_strategy` · status live

Runs one strategy's chain on the inputs you send and returns its verdict first, then your inputs and what was assumed, each check, each step and the values. `purpose=execute` needs every execution input, and a missing one answers 422 missing_execution_input naming all of them; betting chains run on your own price with its time. A Myth returns the evidence and the alternative, never its output. stake is null for API callers (D34).

### Parameters
- `strategy_id` string · path · required  
  The registry ID (line-shopping), from the list.  
  pattern ^[a-z0-9]+(-[a-z0-9]+)*$ · max length 80

Body, `application/json`:

- `purpose` string  
  execute needs every execution input; learn runs the steps it can and names the rest.  
  One of: `learn`, `execute` (open: new values may be added).  
  default "execute"
- `inputs` object  
  The chain's inputs, by ID, in the shapes GET /v1/strategies/{strategy_id} lists: a price is {"american": -110, "as_of": "…"}, a bankroll {"amount": 2000, "currency": "USD"}.
- `chain` string  
  One of the strategy's chains; default its first.  
  pattern ^C[0-9]{1,2}$
- `market_id` string  
  A market whose Kelly consensus becomes the reference, listed under assumed.  
  pattern ^mkt_[0123456789abcdefghjkmnpqrstvwxyz]{20}$

### Response
`200` The check, verdict first. A check that didn't pass is a result, not an error.

- `block` string · required  
  The answer block, verdict first: show it as written.
- `outcome` string · required  
  What happened.  
  One of: `ok`, `failed_check`, `blocked`, `refused`, `declined` (open: new values may be added).
- `purpose` string · required  
  learn or execute.
- `lead_line` string · nullable  
  The rebuttal's lead line, when the route has one.
- `registry_version` string · required  
  The registry's version.
- `strategy` object · required  
  The verdict, decisive figure, evidence and alternative.
- `result` object · nullable  
  The chain's run: chain and status, your_inputs and assumed kept apart, read_as, checks, steps, value, valid_at_or_better, stake (null here, D34) and stake_reason, price_basis, fallback, unavailable_inputs, warnings and formulas. Null when nothing ran.

### Errors
[`invalid_request`](/problems/invalid_request) · [`credential_in_url`](/problems/credential_in_url) · [`unsupported_api_version`](/problems/unsupported_api_version) · [`unauthenticated`](/problems/unauthenticated) · [`method_not_allowed`](/problems/method_not_allowed) · [`rate_limited`](/problems/rate_limited) · [`internal_error`](/problems/internal_error) · [`service_unavailable`](/problems/service_unavailable) · [`quota_exhausted`](/problems/quota_exhausted) · [`not_found`](/problems/not_found) · [`payload_too_large`](/problems/payload_too_large) · [`missing_execution_input`](/problems/missing_execution_input) · [`invalid_inputs`](/problems/invalid_inputs)

### Example
```http
POST https://api.askkelly.ai/v1/strategies/longshot-bias-spreads:check
Authorization: Bearer $KELLY_API_KEY
Content-Type: application/json

{
  "purpose": "execute",
  "inputs": {}
}
```

```json
{
  "strategy": {
    "id": "longshot-bias-spreads",
    "name": "Longshot-bias corrections on spreads and totals",
    "ledger_row": 5,
    "family": "B1",
    "verdict": "myth",
    "verdict_text": "Myth",
    "route": "decline",
    "decisive_figure": "The favourite–longshot bias lives in moneylines: extreme moneyline underdogs returned −22.6%, while spread deciles ran −2.8% to −6.3% with no pattern (2005–13).",
    "alternative": {
      "id": "power-shin-devig",
      "name": "Power or Shin de-vig for n-way markets",
      "verdict": "robust",
      "never_produced": "A longshot-adjusted fair price for a spread or total"
    },
    "version": 1,
    "evidence": {
      "grade": "peer_reviewed",
      "grade_words": "peer-reviewed",
      "through": "2013-12",
      "review_due": "2027-10-16",
      "stale": false
    }
  },
  "purpose": "execute",
  "registry_version": "2026.10.2",
  "outcome": "declined",
  "lead_line": "The favourite–longshot bias lives in moneylines: extreme moneyline underdogs returned −22.6%, while spread deciles ran −2.8% to −6.3% with no pattern (2005–13).",
  "result": null,
  "block": "Longshot-bias corrections on spreads and totals: Myth. The favourite–longshot bias lives in moneylines: extreme moneyline underdogs returned −22.6%, while spread deciles ran −2.8% to −6.3% with no pattern (2005–13).\nEvidence: peer-reviewed, through 2013-12.\nKelly doesn't produce a longshot-adjusted fair price for a spread or total. What runs instead: Power or Shin de-vig for n-way markets (power-shin-devig)."
}
```

```http
POST https://api.askkelly.ai/v1/strategies/line-shopping:check
Authorization: Bearer $KELLY_API_KEY
Content-Type: application/json

{
  "purpose": "execute",
  "inputs": {}
}
```

```json
{
  "type": "https://docs.askkelly.ai/problems/missing_execution_input",
  "title": "Missing execution input",
  "status": 422,
  "code": "missing_execution_input",
  "detail": "selection is required to execute this chain. Kelly never assumes these (D28).",
  "param": "inputs.selection",
  "doc_url": "https://docs.askkelly.ai/problems/missing_execution_input",
  "request_id": "req_59cfc319f3827540fe950fa6",
  "retryable": false,
  "display_message": "One more number is needed from you before this can be worked out.",
  "missing": [
    {
      "id": "selection",
      "what": "The selection or options the user names (D21, D29: never inferred from a slate)",
      "note": null,
      "example": "Chiefs −3"
    },
    {
      "id": "slip_price",
      "what": "The price on the user's slip, with its time",
      "note": "off-site: the prices the user sees, pasted with their time",
      "example": {
        "american": -110,
        "as_of": "2026-10-18T17:00:00Z"
      }
    }
  ]
}
```

```http
POST https://api.askkelly.ai/v1/strategies/line-shopping:check
Authorization: Bearer $KELLY_API_KEY
Content-Type: application/json

{
  "purpose": "execute",
  "inputs": {
    "selection": "Chiefs",
    "slip_price": {
      "american": 120,
      "as_of": "2026-10-04T17:00:00Z"
    },
    "market_reference": {
      "prices": {
        "Chiefs": {
          "american": -125
        },
        "Bills": {
          "american": 105
        }
      },
      "side": "Chiefs"
    }
  }
}
```

```json
{
  "strategy": {
    "id": "line-shopping",
    "name": "Line shopping and reduced juice",
    "ledger_row": 1,
    "family": "B1",
    "verdict": "robust",
    "verdict_text": "Robust",
    "route": "execute",
    "decisive_figure": "−110 to −105 cuts the break-even from 52.38% to 51.22%.",
    "alternative": null,
    "version": 1,
    "evidence": {
      "grade": "peer_reviewed",
      "grade_words": "peer-reviewed",
      "through": "2026-10",
      "review_due": "2027-10-16",
      "stale": false
    }
  },
  "purpose": "execute",
  "registry_version": "2026.10.2",
  "outcome": "ok",
  "lead_line": null,
  "result": {
    "chain": "C1",
    "status": "ok",
    "read_as": [
      [
        "selection",
        "Chiefs"
      ],
      [
        "slip_price",
        "+120 (decimal 2.200)"
      ],
      [
        "market_reference",
        "reference market Chiefs −125 / Bills +105"
      ],
      [
        "devig_method",
        "de-vig worst_case (two-way)"
      ]
    ],
    "your_inputs": {
      "selection": "Chiefs",
      "slip_price": {
        "american": 120,
        "as_of": "2026-10-04T17:00:00Z"
      }
    },
    "assumed": {
      "market_reference": {
        "prices": {
          "Chiefs": {
            "american": -125
          },
          "Bills": {
            "american": 105
          }
        },
        "side": "Chiefs",
        "source": null
      },
      "devig_method": "worst_case"
    },
    "checks": [
      {
        "id": "selection_named",
        "check": "selection_named",
        "value": "Chiefs",
        "threshold": "named by the user",
        "status": "pass",
        "card": null
      },
      {
        "id": "user_price_given",
        "check": "user_price_given",
        "value": "+120",
        "threshold": "the user's price with its time",
        "status": "pass",
        "card": null
      },
      {
        "id": "sharp_reference_exists",
        "check": "sharp_reference_exists",
        "value": 2,
        "threshold": "a two-way or complete n-way reference",
        "status": "pass",
        "card": null
      },
      {
        "id": "devig_method_fits",
        "check": "devig_method_fits",
        "value": "worst_case",
        "threshold": "F2.10 by market shape",
        "status": "pass",
        "card": "F2.10"
      },
      {
        "id": "worst_case_ev_positive",
        "check": "worst_case_ev_positive",
        "value": 0.1714285714285717,
        "threshold": 0,
        "status": "pass",
        "card": "F2.9"
      }
    ],
    "steps": [
      {
        "name": "break_even",
        "value": 0.45454545454545453,
        "formula": "break_even = 1 / O",
        "inputs": {
          "price": {
            "american": 120
          },
          "decimal": 2.2
        },
        "formulas": [
          "F1.4@1"
        ],
        "details": {},
        "warnings": []
      },
      {
        "name": "reference_hold",
        "value": {
          "booksum": 1.043360433604336,
          "overround": 0.04336043360433606,
          "hold": 0.04155844155844157
        },
        "formula": "Σr = Σ 1/O_i; M = Σr − 1; H = 1 − 1/Σr",
        "inputs": {
          "prices": {
            "Chiefs": {
              "american": -125
            },
            "Bills": {
              "american": 105
            }
          }
        },
        "formulas": [
          "F1.7@1"
        ],
        "details": {},
        "warnings": []
      },
      {
        "name": "worst_case_devig",
        "value": {
          "selection": "Chiefs",
          "fair_prob": 0.5324675324675325,
          "fair_method": "multiplicative",
          "break_even": 0.45454545454545453,
          "ev_per_unit": 0.1714285714285717,
          "prob_over_break_even": 0.077922077922078,
          "min_price": {
            "american": -113.88888888888893,
            "decimal": 1.8780487804878045
          },
          "reference_hold": 0.04155844155844157,
          "by_method": {
            "multiplicative": 0.5324675324675325,
            "additive": 0.5338753387533876,
            "power": 0.5345862274328823,
            "odds_ratio": 0.533939444035328,
            "probit": 0.5339256899467332
          }
        },
        "formula": "EV = p·O − 1; break_even = 1/O; O_min = (1 + e)/p",
        "inputs": {
          "price": {
            "american": 120
          },
          "decimal": 2.2,
          "reference_prices": {
            "Chiefs": {
              "american": -125
            },
            "Bills": {
              "american": 105
            }
          },
          "selection": "Chiefs",
          "devig_method": "worst_case",
          "p_push": 0,
          "required_edge": 0
        },
        "formulas": [
          "F1.1@1",
          "F1.4@1",
          "F1.5@1",
          "F1.7@1",
          "F2.1@1",
          "F2.2@1",
          "F2.4@1",
          "F2.6@1",
          "F2.8@1",
          "F2.9@1",
          "F3.1@1",
          "F3.5@1"
        ],
        "details": {
          "booksum": 1.043360433604336,
          "overround": 0.04336043360433606,
          "method_params": {
            "power_k": 1.065458397378173,
            "odds_ratio_c": 1.0910894511799618,
            "probit_c": 0.054568449530477806
          },
          "ev_by_method": {
            "multiplicative": 0.1714285714285717,
            "additive": 0.17452574525745268,
            "power": 0.17608970035234117,
            "odds_ratio": 0.1746667768777217,
            "probit": 0.1746365178828131
          },
          "excluded_methods": []
        },
        "warnings": []
      },
      {
        "name": "ev_vs_no_vig",
        "value": {
          "ev_per_unit": 0.1714285714285717,
          "break_even": 0.45454545454545453,
          "win_prob": 0.5324675324675325,
          "push_prob": 0,
          "loss_prob": 0.46753246753246747,
          "win_prob_no_push": 0.5324675324675325,
          "prob_over_break_even": 0.077922077922078
        },
        "formula": "EV = p·O − 1",
        "inputs": {
          "p": 0.5324675324675325,
          "price": {
            "american": 120
          },
          "decimal": 2.2,
          "p_push": 0
        },
        "formulas": [
          "F3.1@1",
          "F1.4@1"
        ],
        "details": {},
        "warnings": []
      }
    ],
    "value": {
      "break_even": 0.45454545454545453,
      "worst_case_prob": 0.5324675324675325,
      "worst_case_method": "multiplicative",
      "no_vig_by_method": {
        "multiplicative": 0.5324675324675325,
        "additive": 0.5338753387533876,
        "power": 0.5345862274328823,
        "odds_ratio": 0.533939444035328,
        "probit": 0.5339256899467332
      },
      "shape_method": "additive",
      "no_vig": 0.5338753387533876,
      "reference_hold": 0.04155844155844157,
      "ev_vs_no_vig": 0.1714285714285717,
      "ev_by_method": {
        "multiplicative": 0.1714285714285717,
        "additive": 0.17452574525745268,
        "power": 0.17608970035234117,
        "odds_ratio": 0.1746667768777217,
        "probit": 0.1746365178828131
      },
      "valid_at_or_better": {
        "american": -113
      }
    },
    "valid_at_or_better": [
      {
        "leg": "Chiefs",
        "valid_at_or_better": {
          "american": -113
        },
        "expires": "kickoff"
      }
    ],
    "stake": null,
    "price_basis": "user",
    "fallback": null,
    "unavailable_inputs": [],
    "warnings": [],
    "formulas": [
      "F1.4@1",
      "F1.7@1",
      "F1.1@1",
      "F1.5@1",
      "F2.1@1",
      "F2.2@1",
      "F2.4@1",
      "F2.6@1",
      "F2.8@1",
      "F2.9@1",
      "F3.1@1",
      "F3.5@1"
    ],
    "chain_name": "bet a side at a soft book",
    "stake_reason": null
  },
  "block": "Line shopping and reduced juice: Robust. −110 to −105 cuts the break-even from 52.38% to 51.22%.\nEvidence: peer-reviewed, through 2026-10.\nEvery check passed on bet a side at a soft book (C1)."
}
```

`GET /v1/recipes`

## List recipes
public, no key needed · 1 credit, not charged during the beta · status live

One recipe per decision chain (C1 to C46): the question it answers, the strategies that run on it, the inputs they take and the calls for MCP and for the API.

### Response
`200` Every recipe, C1 to C46.

- `data` array of object · required  
  C1 to C46, in order.
  - `id` string · required  
    The chain's ID, C1 to C46.
  - `name` string · required  
    The question it answers.
  - `runs` boolean · required  
    Whether it runs today (C27 doesn't yet).
  - `strategies` array of string  
    The strategies on this chain, in ledger order.
  - `execution_inputs` array of string  
    Inputs never assumed (D28).
  - `assumed_inputs` array of string  
    Inputs Kelly may assume and lists as assumed.
  - `calls` object  
    The MCP tool call and the API call that run it.
- `has_more` boolean · required  
  Always false: every recipe comes in one page.
- `next_cursor` string · required · nullable  
  Always null: every recipe comes in one page.

### Errors
[`invalid_request`](/problems/invalid_request) · [`credential_in_url`](/problems/credential_in_url) · [`unsupported_api_version`](/problems/unsupported_api_version) · [`unauthenticated`](/problems/unauthenticated) · [`method_not_allowed`](/problems/method_not_allowed) · [`rate_limited`](/problems/rate_limited) · [`internal_error`](/problems/internal_error) · [`service_unavailable`](/problems/service_unavailable) · [`quota_exhausted`](/problems/quota_exhausted)

### Example
```http
GET https://api.askkelly.ai/v1/recipes
Authorization: Bearer $KELLY_API_KEY
```

```json
{
  "data": [
    {
      "id": "C1",
      "name": "bet a side at a soft book",
      "runs": true,
      "strategies": [
        "line-shopping",
        "soft-books-against-de-vigged",
        "early-lines-news-latency",
        "steam-chasing-stale-line-sniping",
        "fading-markets-bye-week-bump",
        "high-total-nfl-unders",
        "nba-back-back-early-season",
        "mlb-umpire-angles",
        "cold-weather-unders",
        "west-coast-night-games",
        "golf-matchups-three-balls"
      ],
      "execution_inputs": [
        "selection",
        "slip_price",
        "jurisdiction",
        "user_probability",
        "record"
      ],
      "assumed_inputs": [
        "market_reference",
        "odds_format",
        "devig_method"
      ],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "line-shopping",
            "chain": "C1"
          }
        },
        "api": "POST /v1/strategies/line-shopping:check"
      }
    },
    {
      "id": "C2",
      "name": "future or outright",
      "runs": true,
      "strategies": [
        "power-shin-devig",
        "blind-futures",
        "win-totals-post-news-numbers",
        "golf-outrights"
      ],
      "execution_inputs": [
        "selection",
        "slip_price",
        "horizon",
        "user_probability",
        "bankroll"
      ],
      "assumed_inputs": [
        "devig_method",
        "market_reference"
      ],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "power-shin-devig",
            "chain": "C2"
          }
        },
        "api": "POST /v1/strategies/power-shin-devig:check"
      }
    },
    {
      "id": "C3",
      "name": "exotic or top-k from win prices",
      "runs": true,
      "strategies": [
        "pricing-exotics-top-k-markets",
        "place-show-priced-off-win"
      ],
      "execution_inputs": [
        "pool_terms",
        "selection",
        "slip_price",
        "bankroll"
      ],
      "assumed_inputs": [],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "pricing-exotics-top-k-markets",
            "chain": "C3"
          }
        },
        "api": "POST /v1/strategies/pricing-exotics-top-k-markets:check"
      }
    },
    {
      "id": "C4",
      "name": "player prop",
      "runs": true,
      "strategies": [
        "distribution-based-prop-pricing",
        "props-edge",
        "blind-unders"
      ],
      "execution_inputs": [
        "selection",
        "slip_price",
        "jurisdiction"
      ],
      "assumed_inputs": [
        "market_reference",
        "devig_method"
      ],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "distribution-based-prop-pricing",
            "chain": "C4"
          }
        },
        "api": "POST /v1/strategies/distribution-based-prop-pricing:check"
      }
    },
    {
      "id": "C5",
      "name": "buy a half point",
      "runs": true,
      "strategies": [
        "buying-off-3-20-7"
      ],
      "execution_inputs": [
        "selection",
        "slip_price",
        "user_probability"
      ],
      "assumed_inputs": [],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "buying-off-3-20-7",
            "chain": "C5"
          }
        },
        "api": "POST /v1/strategies/buying-off-3-20-7:check"
      }
    },
    {
      "id": "C6",
      "name": "Wong teaser",
      "runs": true,
      "strategies": [
        "dog-side-wong-teaser-legs",
        "favorite-side-wong-teaser-legs"
      ],
      "execution_inputs": [
        "selection",
        "teaser_terms",
        "slip_price",
        "jurisdiction"
      ],
      "assumed_inputs": [
        "reference_table"
      ],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "dog-side-wong-teaser-legs",
            "chain": "C6"
          }
        },
        "api": "POST /v1/strategies/dog-side-wong-teaser-legs:check"
      }
    },
    {
      "id": "C7",
      "name": "same-game parlay",
      "runs": true,
      "strategies": [
        "correlated-same-game-parlays"
      ],
      "execution_inputs": [
        "selection",
        "slip_price",
        "user_probability"
      ],
      "assumed_inputs": [
        "market_reference",
        "devig_method"
      ],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "correlated-same-game-parlays",
            "chain": "C7"
          }
        },
        "api": "POST /v1/strategies/correlated-same-game-parlays:check"
      }
    },
    {
      "id": "C8",
      "name": "middle or arbitrage",
      "runs": true,
      "strategies": [
        "prediction-market-making-cross-venue",
        "middles-across-3-7",
        "arbitrage"
      ],
      "execution_inputs": [
        "venue_terms",
        "jurisdiction",
        "slip_price",
        "user_probability",
        "tickets"
      ],
      "assumed_inputs": [],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "prediction-market-making-cross-venue",
            "chain": "C8"
          }
        },
        "api": "POST /v1/strategies/prediction-market-making-cross-venue:check"
      }
    },
    {
      "id": "C9",
      "name": "cross-market, alternate, derivative or live line",
      "runs": true,
      "strategies": [
        "power-shin-devig",
        "early-lines-news-latency",
        "steam-chasing-stale-line-sniping",
        "cross-market-consistency-screens-implied",
        "high-wind-unders-before-market",
        "starting-pitcher-first-five-pricing"
      ],
      "execution_inputs": [
        "selection",
        "slip_price",
        "user_probability",
        "record"
      ],
      "assumed_inputs": [
        "devig_method",
        "market_reference"
      ],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "power-shin-devig",
            "chain": "C9"
          }
        },
        "api": "POST /v1/strategies/power-shin-devig:check"
      }
    },
    {
      "id": "C10",
      "name": "convert a bonus bet",
      "runs": true,
      "strategies": [
        "promo-bonus-conversion"
      ],
      "execution_inputs": [
        "promotion_terms",
        "tickets",
        "slip_price",
        "jurisdiction"
      ],
      "assumed_inputs": [],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "promo-bonus-conversion",
            "chain": "C10"
          }
        },
        "api": "POST /v1/strategies/promo-bonus-conversion:check"
      }
    },
    {
      "id": "C11",
      "name": "fixed or balance target with −EV bets",
      "runs": true,
      "strategies": [
        "bold-play-toward-fixed-balance",
        "promo-bonus-conversion"
      ],
      "execution_inputs": [
        "bankroll",
        "slip_price",
        "promotion_terms",
        "tickets",
        "jurisdiction"
      ],
      "assumed_inputs": [],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "bold-play-toward-fixed-balance",
            "chain": "C11"
          }
        },
        "api": "POST /v1/strategies/bold-play-toward-fixed-balance:check"
      }
    },
    {
      "id": "C12",
      "name": "hedge a future",
      "runs": true,
      "strategies": [],
      "execution_inputs": [],
      "assumed_inputs": [],
      "calls": {
        "mcp": null,
        "api": null
      }
    },
    {
      "id": "C13",
      "name": "series price or series cash-out",
      "runs": true,
      "strategies": [],
      "execution_inputs": [],
      "assumed_inputs": [],
      "calls": {
        "mcp": null,
        "api": null
      }
    },
    {
      "id": "C14",
      "name": "trade an event contract",
      "runs": true,
      "strategies": [
        "prediction-market-making-cross-venue",
        "recalibrating-prediction-market-prices-before"
      ],
      "execution_inputs": [
        "venue_terms",
        "jurisdiction",
        "slip_price",
        "user_probability",
        "horizon"
      ],
      "assumed_inputs": [
        "market_reference"
      ],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "prediction-market-making-cross-venue",
            "chain": "C14"
          }
        },
        "api": "POST /v1/strategies/prediction-market-making-cross-venue:check"
      }
    },
    {
      "id": "C15",
      "name": "quote as a maker",
      "runs": true,
      "strategies": [
        "prediction-market-making-cross-venue",
        "selling-skewed-side-laying-longshots"
      ],
      "execution_inputs": [
        "venue_terms",
        "jurisdiction",
        "slip_price",
        "user_probability",
        "selection"
      ],
      "assumed_inputs": [],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "prediction-market-making-cross-venue",
            "chain": "C15"
          }
        },
        "api": "POST /v1/strategies/prediction-market-making-cross-venue:check"
      }
    },
    {
      "id": "C16",
      "name": "size a bet",
      "runs": true,
      "strategies": [
        "fractional-kelly-0-2-0",
        "fractional-kelly-raw-unshrunk-model",
        "joint-slate-kelly-common-shock",
        "cushion-drawdown-constrained-kelly",
        "pre-committed-fixed-fraction-stakes"
      ],
      "execution_inputs": [
        "user_probability",
        "slip_price",
        "bankroll",
        "record",
        "selection"
      ],
      "assumed_inputs": [
        "market_reference",
        "devig_method",
        "sizing_defaults"
      ],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "fractional-kelly-0-2-0",
            "chain": "C16"
          }
        },
        "api": "POST /v1/strategies/fractional-kelly-0-2-0:check"
      }
    },
    {
      "id": "C17",
      "name": "add after a line move, or wait",
      "runs": true,
      "strategies": [
        "early-lines-news-latency",
        "sizing-total-position-after-favorable"
      ],
      "execution_inputs": [
        "selection",
        "slip_price",
        "user_probability",
        "tickets",
        "bankroll"
      ],
      "assumed_inputs": [
        "market_reference",
        "sizing_defaults"
      ],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "early-lines-news-latency",
            "chain": "C17"
          }
        },
        "api": "POST /v1/strategies/early-lines-news-latency:check"
      }
    },
    {
      "id": "C18",
      "name": "does a record show skill",
      "runs": true,
      "strategies": [
        "proving-edge-e-process-frozen"
      ],
      "execution_inputs": [
        "record",
        "slip_price"
      ],
      "assumed_inputs": [],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "proving-edge-e-process-frozen",
            "chain": "C18"
          }
        },
        "api": "POST /v1/strategies/proving-edge-e-process-frozen:check"
      }
    },
    {
      "id": "C19",
      "name": "screen many angles, touts or models",
      "runs": true,
      "strategies": [
        "screening-many-touts-angles-models"
      ],
      "execution_inputs": [
        "selection",
        "record",
        "slip_price"
      ],
      "assumed_inputs": [],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "screening-many-touts-angles-models",
            "chain": "C19"
          }
        },
        "api": "POST /v1/strategies/screening-many-touts-angles-models:check"
      }
    },
    {
      "id": "C20",
      "name": "allocate volume across untested angles",
      "runs": true,
      "strategies": [
        "thompson-sampling-across-untested-angles"
      ],
      "execution_inputs": [
        "selection",
        "record",
        "slip_price"
      ],
      "assumed_inputs": [],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "thompson-sampling-across-untested-angles",
            "chain": "C20"
          }
        },
        "api": "POST /v1/strategies/thompson-sampling-across-untested-angles:check"
      }
    },
    {
      "id": "C21",
      "name": "grade a population for skill",
      "runs": true,
      "strategies": [
        "single-expert-beating-consensus",
        "skill-tests-split-half-ex",
        "three-to-five-percent-long-run-winners",
        "head-to-head-record-skill"
      ],
      "execution_inputs": [
        "selection",
        "record",
        "league_settings"
      ],
      "assumed_inputs": [
        "linked_league"
      ],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "single-expert-beating-consensus",
            "chain": "C21"
          }
        },
        "api": "POST /v1/strategies/single-expert-beating-consensus:check"
      }
    },
    {
      "id": "C22",
      "name": "grade a bettor by CLV",
      "runs": true,
      "strategies": [
        "clv-against-no-vig-sharp"
      ],
      "execution_inputs": [
        "record",
        "slip_price"
      ],
      "assumed_inputs": [
        "market_reference",
        "devig_method"
      ],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "clv-against-no-vig-sharp",
            "chain": "C22"
          }
        },
        "api": "POST /v1/strategies/clv-against-no-vig-sharp:check"
      }
    },
    {
      "id": "C23",
      "name": "evaluate or blend a model",
      "runs": true,
      "strategies": [
        "fundamental-model-blended-market",
        "online-blending-close-expert",
        "model-selection-calibration-over-accuracy",
        "calibrating-model-probabilities-before-staking",
        "late-odds-changes-model-feature"
      ],
      "execution_inputs": [
        "record",
        "slip_price"
      ],
      "assumed_inputs": [
        "market_reference",
        "devig_method"
      ],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "fundamental-model-blended-market",
            "chain": "C23"
          }
        },
        "api": "POST /v1/strategies/fundamental-model-blended-market:check"
      }
    },
    {
      "id": "C24",
      "name": "test a model against the close",
      "runs": true,
      "strategies": [
        "poisson-standalone-soccer-edge"
      ],
      "execution_inputs": [
        "record",
        "slip_price"
      ],
      "assumed_inputs": [
        "market_reference"
      ],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "poisson-standalone-soccer-edge",
            "chain": "C24"
          }
        },
        "api": "POST /v1/strategies/poisson-standalone-soccer-edge:check"
      }
    },
    {
      "id": "C25",
      "name": "build or test a power rating",
      "runs": true,
      "strategies": [
        "nfl-home-field-1-6",
        "turnover-close-game-regression",
        "standalone-elo-state-space-ratings",
        "ratings-updated-closing-odds"
      ],
      "execution_inputs": [
        "selection",
        "slip_price",
        "record"
      ],
      "assumed_inputs": [
        "market_reference"
      ],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "nfl-home-field-1-6",
            "chain": "C25"
          }
        },
        "api": "POST /v1/strategies/nfl-home-field-1-6:check"
      }
    },
    {
      "id": "C26",
      "name": "value a player's absence",
      "runs": true,
      "strategies": [
        "starter-minus-backup-qb-value"
      ],
      "execution_inputs": [
        "selection",
        "slip_price",
        "user_probability",
        "bankroll"
      ],
      "assumed_inputs": [
        "market_reference"
      ],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "starter-minus-backup-qb-value",
            "chain": "C26"
          }
        },
        "api": "POST /v1/strategies/starter-minus-backup-qb-value:check"
      }
    },
    {
      "id": "C27",
      "name": "validate a live win-probability model",
      "runs": false,
      "strategies": [
        "live-state-models-low-attention"
      ],
      "execution_inputs": [],
      "assumed_inputs": [],
      "calls": {
        "mcp": null,
        "api": null
      }
    },
    {
      "id": "C28",
      "name": "publish a projection",
      "runs": true,
      "strategies": [
        "opportunity-over-efficiency-touchdown-regression",
        "distributions-checked-pit-crps"
      ],
      "execution_inputs": [
        "selection",
        "league_settings",
        "record"
      ],
      "assumed_inputs": [
        "linked_league"
      ],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "opportunity-over-efficiency-touchdown-regression",
            "chain": "C28"
          }
        },
        "api": "POST /v1/strategies/opportunity-over-efficiency-touchdown-regression:check"
      }
    },
    {
      "id": "C29",
      "name": "evaluate a fantasy projection",
      "runs": true,
      "strategies": [
        "distributions-checked-pit-crps",
        "scoring-projections-consistent-loss"
      ],
      "execution_inputs": [
        "selection",
        "record"
      ],
      "assumed_inputs": [],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "distributions-checked-pit-crps",
            "chain": "C29"
          }
        },
        "api": "POST /v1/strategies/distributions-checked-pit-crps:check"
      }
    },
    {
      "id": "C30",
      "name": "after-tax edge",
      "runs": true,
      "strategies": [
        "after-tax-break-even-2026"
      ],
      "execution_inputs": [
        "slip_price",
        "tax_status",
        "jurisdiction"
      ],
      "assumed_inputs": [],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "after-tax-break-even-2026",
            "chain": "C30"
          }
        },
        "api": "POST /v1/strategies/after-tax-break-even-2026:check"
      }
    },
    {
      "id": "C31",
      "name": "draft pick",
      "runs": true,
      "strategies": [
        "vbd-vorp-baseline-drafting-adp",
        "zero-rb",
        "hero-anchor-rb",
        "robust-rb",
        "elite-te-te-premium-large",
        "late-te",
        "late-round-qb-one-qb",
        "tiers",
        "handcuffs-draft-priority"
      ],
      "execution_inputs": [
        "league_settings",
        "draft_position",
        "selection",
        "contest_terms"
      ],
      "assumed_inputs": [
        "linked_league"
      ],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "vbd-vorp-baseline-drafting-adp",
            "chain": "C31"
          }
        },
        "api": "POST /v1/strategies/vbd-vorp-baseline-drafting-adp:check"
      }
    },
    {
      "id": "C32",
      "name": "auction bid",
      "runs": true,
      "strategies": [
        "bid-value-auctions",
        "stars-scrubs",
        "keeper-inflation-math",
        "paying-markets-full-top-pick"
      ],
      "execution_inputs": [
        "league_settings",
        "draft_position",
        "selection",
        "horizon"
      ],
      "assumed_inputs": [
        "linked_league"
      ],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "bid-value-auctions",
            "chain": "C32"
          }
        },
        "api": "POST /v1/strategies/bid-value-auctions:check"
      }
    },
    {
      "id": "C33",
      "name": "FAAB bid",
      "runs": true,
      "strategies": [
        "faab-bid-shading",
        "guillotine-floor-early-reserve-faab"
      ],
      "execution_inputs": [
        "league_settings",
        "faab_state",
        "selection"
      ],
      "assumed_inputs": [
        "linked_league",
        "current_slate"
      ],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "faab-bid-shading",
            "chain": "C33"
          }
        },
        "api": "POST /v1/strategies/faab-bid-shading:check"
      }
    },
    {
      "id": "C34",
      "name": "start/sit",
      "runs": true,
      "strategies": [
        "streaming-kicker-defense",
        "variance-aware-start-sit"
      ],
      "execution_inputs": [
        "league_settings",
        "selection"
      ],
      "assumed_inputs": [
        "linked_league",
        "current_slate",
        "market_reference"
      ],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "streaming-kicker-defense",
            "chain": "C34"
          }
        },
        "api": "POST /v1/strategies/streaming-kicker-defense:check"
      }
    },
    {
      "id": "C35",
      "name": "evaluate a trade",
      "runs": true,
      "strategies": [
        "trades-playoff-title-odds-two",
        "winning-the-trade-chart"
      ],
      "execution_inputs": [
        "league_settings",
        "selection"
      ],
      "assumed_inputs": [
        "linked_league"
      ],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "trades-playoff-title-odds-two",
            "chain": "C35"
          }
        },
        "api": "POST /v1/strategies/trades-playoff-title-odds-two:check"
      }
    },
    {
      "id": "C36",
      "name": "trade a dynasty pick",
      "runs": true,
      "strategies": [
        "rb-age-cliff-around-30",
        "dynasty-buy-picks-season-sell",
        "dynasty-top-three-rookie-pick",
        "dynasty-current-year-firsts-overpriced",
        "paying-markets-full-top-pick",
        "dynasty-rebuild-punt-default",
        "dynasty-precise-age-curves",
        "calculators-as-truth"
      ],
      "execution_inputs": [
        "selection",
        "league_settings",
        "horizon",
        "draft_position"
      ],
      "assumed_inputs": [
        "linked_league"
      ],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "rb-age-cliff-around-30",
            "chain": "C36"
          }
        },
        "api": "POST /v1/strategies/rb-age-cliff-around-30:check"
      }
    },
    {
      "id": "C37",
      "name": "best-ball pick",
      "runs": true,
      "strategies": [
        "zero-rb",
        "hero-anchor-rb",
        "robust-rb",
        "best-ball-week-17-game",
        "best-ball-wr-heavy-two",
        "best-ball-zero-rb",
        "best-ball-uniqueness-own-sake"
      ],
      "execution_inputs": [
        "league_settings",
        "draft_position",
        "contest_terms",
        "selection",
        "jurisdiction"
      ],
      "assumed_inputs": [
        "linked_league"
      ],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "zero-rb",
            "chain": "C37"
          }
        },
        "api": "POST /v1/strategies/zero-rb:check"
      }
    },
    {
      "id": "C38",
      "name": "cash lineup",
      "runs": true,
      "strategies": [
        "dfs-cash-chalk-points-per",
        "dfs-10-bankroll-per-day"
      ],
      "execution_inputs": [
        "jurisdiction",
        "contest_terms",
        "selection",
        "demonstrated_rate",
        "bankroll"
      ],
      "assumed_inputs": [
        "current_slate",
        "sizing_defaults"
      ],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "dfs-cash-chalk-points-per",
            "chain": "C38"
          }
        },
        "api": "POST /v1/strategies/dfs-cash-chalk-points-per:check"
      }
    },
    {
      "id": "C39",
      "name": "tournament lineups",
      "runs": true,
      "strategies": [
        "dfs-gpp-qb-stacks-no",
        "dfs-gpp-ownership-leverage",
        "dfs-duplicates-maximum-entropy-roster",
        "dfs-mass-multi-entry-inherently"
      ],
      "execution_inputs": [
        "jurisdiction",
        "contest_terms",
        "selection"
      ],
      "assumed_inputs": [],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "dfs-gpp-qb-stacks-no",
            "chain": "C39"
          }
        },
        "api": "POST /v1/strategies/dfs-gpp-qb-stacks-no:check"
      }
    },
    {
      "id": "C40",
      "name": "pick'em slip",
      "runs": true,
      "strategies": [
        "pickem-de-vigged-legs-plus",
        "pickem-correlated-power-plays"
      ],
      "execution_inputs": [
        "jurisdiction",
        "pickem_terms",
        "selection",
        "user_probability",
        "bankroll"
      ],
      "assumed_inputs": [
        "reference_table",
        "devig_method",
        "market_reference",
        "sizing_defaults"
      ],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "pickem-de-vigged-legs-plus",
            "chain": "C40"
          }
        },
        "api": "POST /v1/strategies/pickem-de-vigged-legs-plus:check"
      }
    },
    {
      "id": "C41",
      "name": "survivor pick",
      "runs": true,
      "strategies": [
        "survivor-ev-odds-popularity-future",
        "survivor-partial-horizon-planning",
        "survivor-always-biggest-favorite"
      ],
      "execution_inputs": [
        "pool_rules",
        "selection",
        "jurisdiction"
      ],
      "assumed_inputs": [
        "market_reference",
        "current_slate"
      ],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "survivor-ev-odds-popularity-future",
            "chain": "C41"
          }
        },
        "api": "POST /v1/strategies/survivor-ev-odds-popularity-future:check"
      }
    },
    {
      "id": "C42",
      "name": "pick'em or confidence pool",
      "runs": true,
      "strategies": [
        "pickem-pools-contrarianism-scaled-pool"
      ],
      "execution_inputs": [
        "pool_rules",
        "selection",
        "jurisdiction"
      ],
      "assumed_inputs": [
        "market_reference"
      ],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "pickem-pools-contrarianism-scaled-pool",
            "chain": "C42"
          }
        },
        "api": "POST /v1/strategies/pickem-pools-contrarianism-scaled-pool:check"
      }
    },
    {
      "id": "C43",
      "name": "bracket",
      "runs": true,
      "strategies": [
        "brackets-contrarian-champion-large-pools",
        "chalk-large-bracket-pool"
      ],
      "execution_inputs": [
        "pool_rules",
        "selection",
        "jurisdiction"
      ],
      "assumed_inputs": [
        "market_reference"
      ],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "brackets-contrarian-champion-large-pools",
            "chain": "C43"
          }
        },
        "api": "POST /v1/strategies/brackets-contrarian-champion-large-pools:check"
      }
    },
    {
      "id": "C44",
      "name": "Calcutta bid",
      "runs": true,
      "strategies": [
        "calcutta-share-times-pot"
      ],
      "execution_inputs": [
        "pool_rules",
        "selection",
        "jurisdiction"
      ],
      "assumed_inputs": [
        "market_reference"
      ],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "calcutta-share-times-pot",
            "chain": "C44"
          }
        },
        "api": "POST /v1/strategies/calcutta-share-times-pot:check"
      }
    },
    {
      "id": "C45",
      "name": "lottery or shared prize",
      "runs": true,
      "strategies": [
        "lotteries-unpopular-numbers",
        "lotteries-roll-down-large-rollover"
      ],
      "execution_inputs": [
        "pool_terms"
      ],
      "assumed_inputs": [],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "lotteries-unpopular-numbers",
            "chain": "C45"
          }
        },
        "api": "POST /v1/strategies/lotteries-unpopular-numbers:check"
      }
    },
    {
      "id": "C46",
      "name": "ATS-contest pick",
      "runs": true,
      "strategies": [
        "ats-contests-stale-contest-lines"
      ],
      "execution_inputs": [
        "contest_terms",
        "selection",
        "jurisdiction"
      ],
      "assumed_inputs": [
        "market_reference"
      ],
      "calls": {
        "mcp": {
          "tool": "check_strategy",
          "arguments": {
            "strategy": "ats-contests-stale-contest-lines",
            "chain": "C46"
          }
        },
        "api": "POST /v1/strategies/ats-contests-stale-contest-lines:check"
      }
    }
  ],
  "has_more": false,
  "next_cursor": null
}
```

`GET /v1/recipes/{recipe_id}`

## Get a recipe
public, no key needed · 1 credit, not charged during the beta · status live

One recipe and its calls.

### Parameters
- `recipe_id` string · path · required  
  The chain's ID, C1 to C46.  
  pattern ^[Cc][0-9]{1,2}$

### Response
`200` The recipe.

- `id` string · required  
  The chain's ID, C1 to C46.
- `name` string · required  
  The question it answers.
- `runs` boolean · required  
  Whether it runs today (C27 doesn't yet).
- `strategies` array of string  
  The strategies on this chain, in ledger order.
- `execution_inputs` array of string  
  Inputs never assumed (D28).
- `assumed_inputs` array of string  
  Inputs Kelly may assume and lists as assumed.
- `calls` object  
  The MCP tool call and the API call that run it.

### Errors
[`invalid_request`](/problems/invalid_request) · [`credential_in_url`](/problems/credential_in_url) · [`unsupported_api_version`](/problems/unsupported_api_version) · [`unauthenticated`](/problems/unauthenticated) · [`method_not_allowed`](/problems/method_not_allowed) · [`rate_limited`](/problems/rate_limited) · [`internal_error`](/problems/internal_error) · [`service_unavailable`](/problems/service_unavailable) · [`quota_exhausted`](/problems/quota_exhausted) · [`not_found`](/problems/not_found)

### Example
```http
GET https://api.askkelly.ai/v1/recipes/C16
Authorization: Bearer $KELLY_API_KEY
```

```json
{
  "id": "C16",
  "name": "size a bet",
  "runs": true,
  "strategies": [
    "fractional-kelly-0-2-0",
    "fractional-kelly-raw-unshrunk-model",
    "joint-slate-kelly-common-shock",
    "cushion-drawdown-constrained-kelly",
    "pre-committed-fixed-fraction-stakes"
  ],
  "execution_inputs": [
    "user_probability",
    "slip_price",
    "bankroll",
    "record",
    "selection"
  ],
  "assumed_inputs": [
    "market_reference",
    "devig_method",
    "sizing_defaults"
  ],
  "calls": {
    "mcp": {
      "tool": "check_strategy",
      "arguments": {
        "strategy": "fractional-kelly-0-2-0",
        "chain": "C16"
      }
    },
    "api": "POST /v1/strategies/fractional-kelly-0-2-0:check"
  }
}
```

Generated from Kelly API 2026-10-05.

---

Generated from Kelly API 2026-10-05

Support: support@askkelly.ai · Security and disclosure: https://docs.askkelly.ai/security

Information is the edge. Odds are information, not advice · 21+ · Get help
