Exercism Solutions
Parse an Exercism exercise community-solutions page into structured JSON with each published solution author, language, stars, iteration counts, and pagination.
API usage
Add &scraper=exercism-solutions to a Crawling API request. URL-encode the target URL in the url parameter. The listing is paginated (24 per page); pass a ?page=N query on the target URL for later pages.
curl 'https://api.crawlbase.com/?token=YOUR_TOKEN' \
--data-urlencode 'url=https://exercism.org/tracks/ruby/exercises/two-fer/solutions' \
--data-urlencode 'scraper=exercism-solutions' -Gfrom crawlbase import CrawlingAPI
api = CrawlingAPI({'token': 'YOUR_TOKEN'})
res = api.get(
'https://exercism.org/tracks/ruby/exercises/two-fer/solutions',
{'scraper': 'exercism-solutions'}
)
import json
data = json.loads(res['body'])const { CrawlingAPI } = require('crawlbase');
const api = new CrawlingAPI({ token: 'YOUR_TOKEN' });
const res = await api.get(
'https://exercism.org/tracks/ruby/exercises/two-fer/solutions',
{ scraper: 'exercism-solutions' }
);
const data = JSON.parse(res.body);require 'crawlbase'
api = Crawlbase::API.new(token: 'YOUR_TOKEN')
res = api.get('https://exercism.org/tracks/ruby/exercises/two-fer/solutions', scraper: 'exercism-solutions')
data = JSON.parse(res.body)Example input URL
Any Exercism exercise community-solutions page works in the url parameter - the page at /tracks/<track>/exercises/<slug>/solutions, optionally with a ?page=N query. For example:
https://exercism.org/tracks/ruby/exercises/two-fer/solutions
https://exercism.org/tracks/go/exercises/hello-world/solutions
https://exercism.org/tracks/python/exercises/leap/solutions?page=2Response shape
JSON response body. Field types may be null when the source page omits the value.
URL of the solutions listing page that was scraped.
Track context lifted from the first solution row.
Track display title (for example
Ruby).URL of the track icon.
Exercise context lifted from the first solution row.
Exercise display title.
URL of the exercise icon.
Page number of the listing currently returned (1-based).
Total number of pages of solutions for the exercise.
Total number of published solutions for the exercise.
Number of solutions returned in
solutions on this page.Published solutions on this page, in listing order.
Exercism solution UUID.
Author of the solution.
Author handle (Exercism username).
URL of the author avatar.
Author flair badge (for example
insider), or null when none.Programming language of the solution.
Number of stars on the solution.
Number of comments on the solution.
Number of views on the solution.
Number of iterations the author submitted.
Lines of code in the solution, or null when not reported.
True when the solution is out of date with the current exercise.
Publish time of the solution (ISO 8601), or null when absent.
Short code snippet preview of the solution, or null when absent.
Public URL of the single-solution page, or null when absent.
Sample response
{
"url": "https://exercism.org/tracks/ruby/exercises/two-fer/solutions",
"track": {
"title": "Ruby",
"iconUrl": "https://assets.exercism.org/tracks/ruby.svg"
},
"exercise": {
"title": "Two Fer",
"iconUrl": "https://assets.exercism.org/exercises/two-fer.svg"
},
"page": 1,
"totalPages": 412,
"totalCount": 9876,
"solutionCount": 2,
"solutions": [
{
"uuid": "b3f2c1a0-9d8e-4f7a-8c6b-1a2b3c4d5e6f",
"author": {
"handle": "neilnorthrop",
"avatarUrl": "https://avatars.exercism.org/u/12345",
"flair": "insider"
},
"language": "ruby",
"numStars": 42,
"numComments": 3,
"numViews": 1280,
"numIterations": 2,
"numLoc": 3,
"isOutOfDate": false,
"publishedAt": "2026-05-18T14:03:27Z",
"snippet": "def two_fer(name = \"you\")\n \"One for #{name}, one for me.\"\nend",
"url": "https://exercism.org/tracks/ruby/exercises/two-fer/solutions/neilnorthrop"
},
{
"uuid": "c4e3d2b1-0a9f-4e8b-9d7c-2b3c4d5e6f70",
"author": {
"handle": "erikschierboom",
"avatarUrl": "https://avatars.exercism.org/u/67890",
"flair": null
},
"language": "ruby",
"numStars": 17,
"numComments": 0,
"numViews": 640,
"numIterations": 1,
"numLoc": 4,
"isOutOfDate": false,
"publishedAt": "2026-04-02T09:11:50Z",
"snippet": "def two_fer(name = \"you\")\n format(\"One for %s, one for me.\", name)\nend",
"url": "https://exercism.org/tracks/ruby/exercises/two-fer/solutions/erikschierboom"
}
]
}