Fetch a batch of problems matching your filters.
curl "https://api.locusmath.org/public/problems?topic=calculus&skill=chain_rule&difficulty_min=1000&difficulty_max=1400&type=plain&count=3" \
-H "x-api-key: <your-key>"| Param | Description |
|---|---|
topic | Course slug, e.g. algebra_1. See list topics. Unset = any. |
skill | Skill slug within the topic, e.g. chain_rule. |
difficulty_min, difficulty_max | Inclusive ELO band, 800-2200. Defaults to the full range. |
calculator | none | scientific | graphing | cas. |
type | multiple_choice | widget | plain - the answer-input family. Unknown value = 400. |
count | Batch size (default 10, clamped to the batch max). |
videos | true opts into help-video enrichment (below). Default off. |
An array of problems. statement is LaTeX; input describes the answer widget to render (choices, number line, free entry, ...) with all grading information stripped. The submission_token is a signed, 31-day token you pass to grade - answers themselves never appear in any response.
[
{
"id": "7c9e6679-7425-40de-963d-...",
"statement": "Find \\frac{d}{dx}\\left(\\sin(3x^2)\\right)",
"difficulty": 1180,
"topic": "calculus",
"skill": "chain_rule",
"calculator_allowed": "none",
"input": { "widget": "math", "...": "display params, no answers" },
"submission_token": "<opaque signed token>"
}
]videos=true)With videos=true the response becomes an object: problems plus a deduplicated videos map. Each problem whose skill has a curated explainer video carries a small integer video ref into that map; problems sharing a skill share one entry. Skills without a curated video simply omit the field.
// GET /public/problems?topic=calculus&videos=true
{
"problems": [
{ "id": "...", "skill": "chain_rule", "video": 1, "...": "..." },
{ "id": "...", "skill": "chain_rule", "video": 1, "...": "..." },
{ "id": "...", "skill": "product_rule", "...": "no video curated" }
],
"videos": {
"1": "https://www.youtube.com/watch?v=eF6zYNzlZKQ"
}
}