Skip to content
Kelly

Developers

askkelly.aiGet a key

formulas-and-strategies

Copy page

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

On this page
MethodPathTitleAccessPriceMCP tool
GET/v1/strategiesList strategiespublic1none
GET/v1/strategies/{strategy_id}Get a strategypublic1none
POST/v1/strategies/{strategy_id}:checkCheck a strategy on your numberspublic1check_strategy
GET/v1/recipesList recipespublic1none
GET/v1/recipes/{recipe_id}Get a recipepublic1none

GET /v1/strategies

List strategiesLink to this section

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.

ParametersLink to this section

familystring · query

Only this family, B1 to B14 or F1 to F9.

pattern ^[BF][0-9]{1,2}$

verdictstring · query

Only this verdict.

One of: robust, conditional, weak, myth, prohibited (open: new values may be added).

routestring · query

Only this route.

One of: execute, check_then_execute, warn_first, decline, refuse (open: new values may be added).

ResponseLink to this section

200 Every matching strategy, in ledger order.

dataarray of objectrequired

The strategies, by family then ledger row; never ordered by a betting measure.

Show 21 fields
idstringrequired

The registry ID, a slug such as line-shopping.

public_idstring

The Kelly ID (stg_…), stable for ever.

namestringrequired

The strategy's name.

ledger_rowintegernullable

Its row in the verdict ledger (1 to 134), or null for a Part I verdict without a row.

familystring

The family: B1 to B14 for betting, F1 to F9 for fantasy.

family_namestring

The family's name.

verdictstringrequired

The verdict.

One of: robust, conditional, weak, myth, prohibited (open: new values may be added).

verdict_textstring

The ledger's full wording, such as Robust, limited.

routestringrequired

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_rulestringnullable

The rule that sets the route, when a rule does rather than the verdict.

decisive_figurestringrequired

The figure the verdict rests on, in words.

evidenceobjectrequired

The grade (and the grade in words), the month the evidence runs through, review dates, a summary and the sources.

flip_conditionsarray of object

The evidence that would change the verdict, each with the verdict it would flip to.

inputsarray of object

The inputs it takes: execution_input true means never assumed (D28).

preconditionsarray of object

The typed checks it runs, with the sentence shown when one fails.

chainsarray of object

The decision chains that run it (C1 to C46), each with its name and whether it runs today.

formulasarray of string

The formula cards it uses, by card ID.

price_basisstring

user (your own price), consensus or none (D27).

alternativeobjectnullable

For a Weak or Myth strategy: the robust one to run instead and what Kelly never produces.

aliasesarray of string

Other names it goes by.

versionintegerrequired

The verdict's version, bumped when the verdict or its evidence changes.

has_morebooleanrequired

Always false: every match comes in one page.

next_cursorstringrequirednullable

Always null: every match comes in one page.

registry_versionstringrequired

The registry's version.

as_ofstring

The registry's as-of date, at midnight UTC.

format date-time

ErrorsLink to this section

invalid_request · credential_in_url · unsupported_api_version · unauthenticated · method_not_allowed · rate_limited · internal_error · service_unavailable · quota_exhausted

ExampleLink to this section

Request
GET https://api.askkelly.ai/v1/strategies?family=B1&verdict=robust
Authorization: Bearer $KELLY_API_KEY
Response, 200
{
  "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 strategyLink to this section

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.

ParametersLink to this section

strategy_idstring · pathrequired

The registry ID (line-shopping), from the list.

pattern ^[a-z0-9]+(-[a-z0-9]+)*$ · max length 80

ResponseLink to this section

200 The strategy.

idstringrequired

The registry ID, a slug such as line-shopping.

public_idstring

The Kelly ID (stg_…), stable for ever.

namestringrequired

The strategy's name.

ledger_rowintegernullable

Its row in the verdict ledger (1 to 134), or null for a Part I verdict without a row.

familystring

The family: B1 to B14 for betting, F1 to F9 for fantasy.

family_namestring

The family's name.

verdictstringrequired

The verdict.

One of: robust, conditional, weak, myth, prohibited (open: new values may be added).

verdict_textstring

The ledger's full wording, such as Robust, limited.

routestringrequired

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_rulestringnullable

The rule that sets the route, when a rule does rather than the verdict.

decisive_figurestringrequired

The figure the verdict rests on, in words.

evidenceobjectrequired

The grade (and the grade in words), the month the evidence runs through, review dates, a summary and the sources.

flip_conditionsarray of object

The evidence that would change the verdict, each with the verdict it would flip to.

inputsarray of object

The inputs it takes: execution_input true means never assumed (D28).

preconditionsarray of object

The typed checks it runs, with the sentence shown when one fails.

chainsarray of object

The decision chains that run it (C1 to C46), each with its name and whether it runs today.

formulasarray of string

The formula cards it uses, by card ID.

price_basisstring

user (your own price), consensus or none (D27).

alternativeobjectnullable

For a Weak or Myth strategy: the robust one to run instead and what Kelly never produces.

aliasesarray of string

Other names it goes by.

versionintegerrequired

The verdict's version, bumped when the verdict or its evidence changes.

ErrorsLink to this section

invalid_request · credential_in_url · unsupported_api_version · unauthenticated · method_not_allowed · rate_limited · internal_error · service_unavailable · quota_exhausted · not_found

ExampleLink to this section

Request
GET https://api.askkelly.ai/v1/strategies/no-such-thing
Authorization: Bearer $KELLY_API_KEY
Response, 404
{
  "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."
}
Request
GET https://api.askkelly.ai/v1/strategies/line-shopping
Authorization: Bearer $KELLY_API_KEY
Response, 200
{
  "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 numbersLink to this section

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).

ParametersLink to this section

strategy_idstring · pathrequired

The registry ID (line-shopping), from the list.

pattern ^[a-z0-9]+(-[a-z0-9]+)*$ · max length 80

Body, application/json:

purposestring

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"

inputsobject

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"}.

chainstring

One of the strategy's chains; default its first.

pattern ^C[0-9]{1,2}$

market_idstring

A market whose Kelly consensus becomes the reference, listed under assumed.

pattern ^mkt_[0123456789abcdefghjkmnpqrstvwxyz]{20}$

ResponseLink to this section

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

blockstringrequired

The answer block, verdict first: show it as written.

outcomestringrequired

What happened.

One of: ok, failed_check, blocked, refused, declined (open: new values may be added).

purposestringrequired

learn or execute.

lead_linestringnullable

The rebuttal's lead line, when the route has one.

registry_versionstringrequired

The registry's version.

strategyobjectrequired

The verdict, decisive figure, evidence and alternative.

resultobjectnullable

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.

ErrorsLink to this section

invalid_request · credential_in_url · unsupported_api_version · unauthenticated · method_not_allowed · rate_limited · internal_error · service_unavailable · quota_exhausted · not_found · payload_too_large · missing_execution_input · invalid_inputs

ExampleLink to this section

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

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

Response, 200
{
  "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)."
}
Request
POST https://api.askkelly.ai/v1/strategies/line-shopping:check
Authorization: Bearer $KELLY_API_KEY
Content-Type: application/json

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

Response, 422
{
  "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"
      }
    }
  ]
}
Request
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" } } }

Response, 200
{
  "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 recipesLink to this section

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.

ResponseLink to this section

200 Every recipe, C1 to C46.

dataarray of objectrequired

C1 to C46, in order.

Show 7 fields
idstringrequired

The chain's ID, C1 to C46.

namestringrequired

The question it answers.

runsbooleanrequired

Whether it runs today (C27 doesn't yet).

strategiesarray of string

The strategies on this chain, in ledger order.

execution_inputsarray of string

Inputs never assumed (D28).

assumed_inputsarray of string

Inputs Kelly may assume and lists as assumed.

callsobject

The MCP tool call and the API call that run it.

has_morebooleanrequired

Always false: every recipe comes in one page.

next_cursorstringrequirednullable

Always null: every recipe comes in one page.

ErrorsLink to this section

invalid_request · credential_in_url · unsupported_api_version · unauthenticated · method_not_allowed · rate_limited · internal_error · service_unavailable · quota_exhausted

ExampleLink to this section

Request
GET https://api.askkelly.ai/v1/recipes
Authorization: Bearer $KELLY_API_KEY
Response, 200
{
  "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 recipeLink to this section

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

One recipe and its calls.

ParametersLink to this section

recipe_idstring · pathrequired

The chain's ID, C1 to C46.

pattern ^[Cc][0-9]{1,2}$

ResponseLink to this section

200 The recipe.

idstringrequired

The chain's ID, C1 to C46.

namestringrequired

The question it answers.

runsbooleanrequired

Whether it runs today (C27 doesn't yet).

strategiesarray of string

The strategies on this chain, in ledger order.

execution_inputsarray of string

Inputs never assumed (D28).

assumed_inputsarray of string

Inputs Kelly may assume and lists as assumed.

callsobject

The MCP tool call and the API call that run it.

ErrorsLink to this section

invalid_request · credential_in_url · unsupported_api_version · unauthenticated · method_not_allowed · rate_limited · internal_error · service_unavailable · quota_exhausted · not_found

ExampleLink to this section

Request
GET https://api.askkelly.ai/v1/recipes/C16
Authorization: Bearer $KELLY_API_KEY
Response, 200
{
  "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.

Support: support@askkelly.ai · Security and disclosure