API reference
Every number on Leaklens is one GET request away. No key, no sign-up: look up a task, list a benchmark's flagged tasks, or pull the citable summary straight into your eval report or run script.
curl "https://leaklens.grain64.com/api/search?q=django__django-11099"
Find a task: GET /api/search
Parameters: q (required, up to 200 characters) is a SWE-bench instance ID, a GitHub issue or pull-request URL, or repo#number; benchmark (optional) is swe-bench-verified or swe-bench-lite. It returns the matching tasks with their tier and state.
{
"q": "django__django-11099",
"kind": "instance",
"results": [
{
"instance_id": "django__django-11099",
"repo": "django/django",
"title": "UsernameValidator allows trailing newline in usernames",
"tier": "A",
"agreement": "agreed",
"fix_date": "2019-03-22T17:16:25.000Z",
"state": "flag"
}
]
}
tier is A (the issue or comments state the fix), C (lines of the gold patch appear in the text) or none. state is flag, clear, disputed or pending; disputed means the two checks disagreed, so the task is never read as clear. Methodology defines each.
One task with its evidence: GET /api/tasks/<instance_id>
The full record: the verdict, every quoted passage with its position in the issue or comments, the copied gold-patch lines, and the upstream fix commit with its date, to set against any model's training cutoff. Trimmed here to the fields shown.
{
"task": {
"instance_id": "django__django-11099",
"repo": "django/django",
"tier": "A",
"state": "flag",
"agreement": "agreed",
"fix_date": "2019-03-22T17:16:25.000Z",
"fix_sha": "cbf7e71558c94ce1c327b683768a18a25d82d197"
},
"quotes": [
{
"source": "issue",
"start": 408,
"end": 608,
"text": "You can avoid this behavior by instead using \\A and \\Z to terminate regexes. For example, the validator regex could be changed to\nr'\\A[\\w.@+-]+\\Z'\nin order to reject usernames that end with a newline."
}
],
"overlap": {
"patchLines": 1,
"matched": 0,
"lines": []
},
"exposures": [
{
"kind": "upstream",
"commit_sha": "cbf7e71558c94ce1c327b683768a18a25d82d197",
"commit_date": "2019-03-22T17:16:25.000Z",
"url": "https://github.com/django/django/commit/cbf7e71558c94ce1c327b683768a18a25d82d197"
}
],
"benchmarks": [
{
"slug": "swe-bench-verified",
"name": "SWE-bench Verified"
},
{
"slug": "swe-bench-lite",
"name": "SWE-bench Lite"
}
],
"methodologyVersion": "m1.1"
}
A fix commit dated before a cutoff shows that exposure was possible, not that a model trained on it. The human-readable page for the same task is /t/django__django-11099.
The citable figure: GET /api/summary
Parameter: benchmark (default swe-bench-verified). It returns the flagged count per tier, the measured precision of the flags with its 95% interval, the disputed tasks, the miss rate on unflagged tasks, and a ready-to-cite string. Trimmed here.
{
"result": {
"benchmark": "swe-bench-verified",
"name": "SWE-bench Verified",
"methodologyVersion": "m1.1",
"asOf": "3 Nov 2026",
"total": 500,
"flagged": {
"n": 149,
"tierA": 131,
"tierC": 18
},
"precision": {
"tierA": {
"k": 39,
"n": 39,
"pct": 100,
"lo": 91,
"hi": 100
},
"tierC": {
"k": 17,
"n": 18,
"pct": 94,
"lo": 74,
"hi": 99
}
},
"citation": "Leaklens, SWE-bench Verified, methodology m1.1, 3 Nov 2026: 149 of 500 tasks flagged (131 Tier A and 18 Tier C, where both checks agreed); Tier A precision 100% (39 of 39, 95% interval 91–1…"
}
}
Every task of a benchmark: GET /api/task-index
Parameters: benchmark and an optional repo (owner/name). Tasks come tier-ordered (A first, then C), up to 1,000, each with the same fields as a search result. Filter on state == "flag" to get the list of tasks to drop from a run.
curl "https://leaklens.grain64.com/api/task-index?benchmark=swe-bench-verified&repo=django/django"
The whole table: GET /api/export.csv
One row per task with tier, state, agreement, fix-commit date and sha, the verdict sentence and the task page. Parameter: benchmark. The same file is behind the download button on each benchmark table.
curl -O "https://leaklens.grain64.com/api/export.csv?benchmark=swe-bench-verified"
For agents: the MCP server
Point any MCP client at https://leaklens.grain64.com/mcp (Streamable HTTP, no key, no sign-up) and your agent can check a results file for leaked tasks before it trusts a score. Both tools are read-only and answer from the same figures as this page.
{
"mcpServers": {
"leaklens": { "type": "http", "url": "https://leaklens.grain64.com/mcp" }
}
}
check_task_leakage: pass query (one SWE-bench instance ID, GitHub issue or PR URL, or repo#number) for the full evidence, or queries (up to 50 of them, separated by commas, spaces or new lines) to learn which tasks of a run are flagged. Optional benchmark (swe-bench-verified or swe-bench-lite). Returns the tier, the quoted evidence, the fix commit and its date, and a link to the task page.
benchmark_leakage_summary: optional benchmark (default swe-bench-verified) and repo (owner/name, adds that repo's flagged tasks so you can drop them from a run). Returns the flagged share, the count per tier, the measured precision with its interval and a ready-to-cite string.
An example call to check_task_leakage with {"query": "django__django-11099"} returns (evidence trimmed to one quote):
{
"found": true,
"asOf": "2026-11-03",
"methodologyVersion": "m1.1",
"matches": [
{
"instanceId": "django__django-11099",
"repo": "django/django",
"tier": "A",
"state": "flag",
"agreement": "agreed",
"verdict": "The text states the fix: “You can avoid this behavior by instead using \\A and \\Z to terminate regexes. For example, the…",
"evidenceQuotes": [
{
"source": "issue",
"text": "You can avoid this behavior by instead using \\A and \\Z to terminate regexes. For example, the validator regex could be changed to\nr'\\A[\\w.@…"
}
],
"fixCommit": {
"sha": "cbf7e71558c94ce1c327b683768a18a25d82d197",
"date": "2019-03-22T17:16:25.000Z",
"url": "https://github.com/django/django/commit/cbf7e71558c94ce1c327b683768a18a25d82d197"
},
"url": "https://leaklens.grain64.com/t/django__django-11099?ref=mcp"
}
],
"caveat": "A fix commit dated before a cutoff shows exposure was possible, not that a model trained on it."
}
Unknown fields are rejected with an error that names them, and each caller gets a rate limit per minute; the error says when to retry. A fix commit dated before a model's cutoff shows the fix was available to train on, not that the model trained on it, and every result carries that caveat.
Your own benchmark
These endpoints cover the public SWE-bench Verified and Lite tables. To check a benchmark that is not in them, upload the tasks and get the same per-task report.