GET /scan/:id and /skill/:name

Two read endpoints, both public, both unauthenticated. The first fetches a specific scan by ID; the second fetches the most-recent completed scan for a given skill name (from SKILL.md frontmatter).

GET /scan/:id

Fetches the scan record. Use this to poll for completion after a POST /scan.

curl https://api.skillox.io/scan/sk_pprsxxv0typ34oq5x2ufzd4q

Response

200 OK

{
  "scanId": "sk_pprsxxv0typ34oq5x2ufzd4q",
  "url": "https://github.com/skillox-examples/safe-formatter/blob/main/SKILL.md",
  "sourceRepo": "skillox-examples/safe-formatter",
  "skillName": "safe-formatter",
  "skillVersion": "1.2.0",
  "status": "completed",
  "grade": "A",
  "score": 95,
  "findings": [],
  "scanDurationMs": 5,
  "errorMessage": null,
  "createdAt": "2026-05-21T19:55:40.321Z",
  "completedAt": "2026-05-21T20:55:12.319Z"
}

GET /skill/:name

Returns the latest completed scan for a given skill name plus a totalScans aggregate. Used by the Skill Report Card pages at /c/[skillName].

curl https://api.skillox.io/skill/safe-formatter

Response

200 OK

{
  "skillName": "safe-formatter",
  "totalScans": 1,
  "latest": {
    "scanId": "sample-grade-a",
    "url": "https://github.com/skillox-examples/safe-formatter/blob/main/SKILL.md",
    "sourceRepo": "skillox-examples/safe-formatter",
    "skillName": "safe-formatter",
    "skillVersion": "1.2.0",
    "status": "completed",
    "grade": "A",
    "score": 95,
    "findings": [],
    "scanDurationMs": 5,
    "createdAt": "2026-05-21T19:55:40.321Z",
    "completedAt": "2026-05-21T20:55:12.319Z"
  }
}

Returns 404 not_found if no completed scan exists for that name. The lookup is exact-match on the frontmatter name field.

Polling cadence: 1s intervals against /scan/:id until status is completed or failed. Median scan completion is < 2s; hard timeout is 30s.