Mr. Doge

Reference

AI Picks & Recommendations

Model-generated picks with reasoning, confidence, and edge metadata.

The AI resource exposes Mr. Doge's models: probabilistic picks with the data that drove them, plus recommendations filtered by edge and confidence.

Both methods require Business tier. Upgrade →

ai.picks.list

Paginated list of AI picks. Picks are multi-leg — each pick bundles one or more legs, each with its own outcome, odds, confidence, and rationale.

const { data, pagination } = await mrdoge.ai.picks.list({
  date: "2026-05-18",
  limit: 20,
});

for (const pick of data) {
  console.log(`Pick ${pick.id} · ${pick.pickType} · total ${pick.totalOdds}`);
  for (const leg of pick.legs) {
    console.log(`  → ${leg.outcome} @ ${leg.odds} (${leg.confidence})`);
    if (leg.edgePercentage != null) {
      console.log(`    edge: ${(leg.edgePercentage * 100).toFixed(1)}%`);
    }
    for (const reason of leg.rationale) {
      console.log(`    · ${reason}`);
    }
  }
}

Params:

FieldTypeNotes
competitionIdsnumber[]Filter to one or more competitions
regionIdsnumber[]Filter to one or more regions
statusMatchStatus[]Filter by match phase
datestringYYYY-MM-DD
startDate / endDatestringRange filter
cursorstringPagination cursor
limitnumberMax 100
localestring"en", "pt-BR", "es"

Returns: { data: AiPick[]; pagination: { nextCursor, hasMore } }

The AiPick shape

type AiPick = {
  id: string;
  matchId: string;
  match?: Match;                    // optionally embedded summary
  pickType: string;                 // e.g. "single", "double", "accumulator"
  legs: PickLeg[];
  totalOdds: number;                // decimal odds for the whole bundle
  expiresAt: string;                // ISO timestamp
  settled: boolean;
  result: "won" | "lost" | "push" | null;
  createdAt: string;
};

type PickLeg = {
  marketId: string;
  outcome: string;                  // e.g. "Over 2.5", "Home Win"
  odds: number;                     // decimal odds
  point?: number | null;            // handicap line, e.g. 2.5
  confidence: "High" | "Medium" | "Low";
  edgePercentage?: number | null;   // 0.05 = 5%
  rationale: string[];              // localized reasoning bullets
};

ai.picks.listAll

Auto-paginated version. Same params as ai.picks.list minus cursor, returns a flat AiPick[].

const all = await mrdoge.ai.picks.listAll({
  date: "2026-05-18",
});

Supports onPage and signal like matches.listAll — see pagination.

ai.recommendations.list

Pre-filtered AI picks with edge and confidence thresholds applied. Use when you want the "best of" without scanning every pick.

const recs = await mrdoge.ai.recommendations.list({
  matchId: "match_abc123",
  minEdge: 0.05,          // 5% edge minimum
  confidence: "High",
  limit: 5,
});

Params:

FieldTypeNotes
matchIdstringOptional — filter to a single match
confidence"High" | "Medium" | "Low"Min confidence
minEdgenumberMin edge as a fraction (e.g. 0.05 = 5%)
limitnumberMax 100
localestringLocalization

Returns: Recommendation[]

The Recommendation shape

type Recommendation = {
  id: string;
  matchId: string;
  match?: Match;
  marketId: string;
  betItemId?: string | null;
  outcome: string;
  odds: number;
  point?: number | null;
  confidence: "High" | "Medium" | "Low";
  edgePercentage: number;
  kellyFraction?: number;
  rationale: string[];
  riskFactors: string[];
  settled: boolean;
  result: "won" | "lost" | "push" | null;
  createdAt: string;
};

Unlike picks, recommendations are single-leg — one outcome per recommendation. They also expose riskFactors and kellyFraction for sizing.

Picks vs Recommendations

ai.picks.listai.recommendations.list
StructureMulti-leg bundlesSingle outcomes
Filters by edgeNoYes (minEdge)
Filters by confidenceNoYes (confidence)
Includes risk factorsNoYes (riskFactors)
Includes Kelly sizingNoYes (kellyFraction)
Use forFull pick log, historical analysisUI surfaces, trading triggers

Pattern: render the best picks for a match

const recs = await mrdoge.ai.recommendations.list({
  matchId: "match_abc123",
  minEdge: 0.03,
  limit: 10,
});

const sorted = recs.sort((a, b) => b.edgePercentage - a.edgePercentage);

for (const r of sorted) {
  console.log(
    `[${(r.edgePercentage * 100).toFixed(1)}%]`,
    r.outcome,
    `@ ${r.odds}`,
    `(${r.confidence})`,
  );
  r.rationale.forEach((line) => console.log(`  · ${line}`));
  if (r.riskFactors.length) {
    r.riskFactors.forEach((line) => console.log(`  risk: ${line}`));
  }
}

Next

On this page

AI Picks & Recommendations