crawlbaseDocs
Log in

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' -G
from 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=2

Response shape

JSON response body. Field types may be null when the source page omits the value.

url
string
URL of the solutions listing page that was scraped.
track
object
Track context lifted from the first solution row.
track.title
string | null
Track display title (for example Ruby).
track.iconUrl
string | null
URL of the track icon.
exercise
object
Exercise context lifted from the first solution row.
exercise.title
string | null
Exercise display title.
exercise.iconUrl
string | null
URL of the exercise icon.
page
integer | null
Page number of the listing currently returned (1-based).
totalPages
integer | null
Total number of pages of solutions for the exercise.
totalCount
integer | null
Total number of published solutions for the exercise.
solutionCount
integer
Number of solutions returned in solutions on this page.
solutions
array
Published solutions on this page, in listing order.
solutions[].uuid
string
Exercism solution UUID.
solutions[].author
object
Author of the solution.
solutions[].author.handle
string
Author handle (Exercism username).
solutions[].author.avatarUrl
string | null
URL of the author avatar.
solutions[].author.flair
string | null
Author flair badge (for example insider), or null when none.
solutions[].language
string
Programming language of the solution.
solutions[].numStars
integer
Number of stars on the solution.
solutions[].numComments
integer
Number of comments on the solution.
solutions[].numViews
integer
Number of views on the solution.
solutions[].numIterations
integer
Number of iterations the author submitted.
solutions[].numLoc
integer | null
Lines of code in the solution, or null when not reported.
solutions[].isOutOfDate
boolean
True when the solution is out of date with the current exercise.
solutions[].publishedAt
string | null
Publish time of the solution (ISO 8601), or null when absent.
solutions[].snippet
string | null
Short code snippet preview of the solution, or null when absent.
solutions[].url
string | null
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"
    }
  ]
}