crawlbaseDocs
Se connecter

Utilisation de l'API

Ajoutez &scraper=exercism-solutions à une requête Crawling API. Encodez en URL l'URL cible dans le paramètre url. La liste est paginée (24 par page) ; passez une requête ?page=N sur l'URL cible pour les pages suivantes.

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)

Exemple d'URL en entrée

N'importe quelle page des solutions communautaires d'un exercice Exercism fonctionne dans le paramètre url - la page située à /tracks/<track>/exercises/<slug>/solutions, éventuellement avec une requête ?page=N. Par exemple :

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

Structure de la réponse

Corps de la réponse JSON. Les types de champs peuvent être null lorsque la page source omet la valeur.

url
string
URL de la page de liste des solutions qui a été scrapée.
track
object
Contexte de la piste extrait de la première ligne de solution.
track.title
string | null
Titre affiché de la piste (par exemple Ruby).
track.iconUrl
string | null
URL de l'icône de la piste.
exercise
object
Contexte de l'exercice extrait de la première ligne de solution.
exercise.title
string | null
Titre affiché de l'exercice.
exercise.iconUrl
string | null
URL de l'icône de l'exercice.
page
integer | null
Numéro de page de la liste actuellement renvoyée (à partir de 1).
totalPages
integer | null
Nombre total de pages de solutions pour l'exercice.
totalCount
integer | null
Nombre total de solutions publiées pour l'exercice.
solutionCount
integer
Nombre de solutions renvoyées dans solutions sur cette page.
solutions
array
Solutions publiées sur cette page, dans l'ordre de la liste.
solutions[].uuid
string
UUID de la solution Exercism.
solutions[].author
object
Auteur de la solution.
solutions[].author.handle
string
Identifiant de l'auteur (nom d'utilisateur Exercism).
solutions[].author.avatarUrl
string | null
URL de l'avatar de l'auteur.
solutions[].author.flair
string | null
Badge flair de l'auteur (par exemple insider), ou null lorsqu'il n'y en a pas.
solutions[].language
string
Langage de programmation de la solution.
solutions[].numStars
integer
Nombre d'étoiles de la solution.
solutions[].numComments
integer
Nombre de commentaires sur la solution.
solutions[].numViews
integer
Nombre de vues de la solution.
solutions[].numIterations
integer
Nombre d'itérations soumises par l'auteur.
solutions[].numLoc
integer | null
Lignes de code de la solution, ou null lorsque non renseigné.
solutions[].isOutOfDate
boolean
True lorsque la solution n'est plus à jour par rapport à l'exercice actuel.
solutions[].publishedAt
string | null
Date de publication de la solution (ISO 8601), ou null lorsqu'elle est absente.
solutions[].snippet
string | null
Court aperçu de code de la solution, ou null lorsqu'il est absent.
solutions[].url
string | null
URL publique de la page de la solution unique, ou null lorsqu'elle est absente.

Exemple de réponse

{
  "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"
    }
  ]
}