For AI agents: a documentation index is available at https://developers.jarsave.com/llms.txt, this page as Markdown at https://developers.jarsave.com/lessons.md, and the OpenAPI description at https://developers.jarsave.com/openapi.json.
The lesson object
v1A lesson the student finished, with its score when the lesson is graded. In JarSave it shows the parent what the child built or learned that week.
Attributes
lesson_id string Required
Your id for this student's lesson.
course_id string Required
Your id for the course.
course_name string Required
The course as the parent knows it.
lesson_no integer Required
The lesson's number in the course.
title string Required
The lesson's title, for example Make the Robot Dance.
goals array of strings
What the lesson teaches, one short line each, as in your syllabus.
completed_at timestamp Required
When the student finished it.
score integer, nullable
0 to 100, only if the lesson is graded.
project_url string, nullable
A public page of what the student made, if your system has one. No photos of the child.
The lesson object
{
"lesson_id": "les_77031",
"course_id": "crs_junior_coding_2",
"course_name": "Junior Coding 2",
"lesson_no": 3,
"title": "Make the Robot Dance",
"goals": [
"Learn what a loop is",
"Move the robot with a loop"
],
"completed_at": "2026-11-26T16:12:40+07:00",
"score": 86,
"project_url": null
}Send a lesson
POST /v1/links/:id/lessons
Send a lesson when the student finishes it. Send one item per lesson, not one per quiz attempt: if the score changes later, send the same lesson_id again.
Parameters
The lesson object's attributes, or up to 100 of them in an items array.
Returns
The item with its JarSave id, link, status and received. With items, a list: {"object": "list", "data": [...]}, one entry per item in the order sent.
Request
curl https://api.jarsave.com/v1/links/lnk_8Gm2QxT4/lessons \
-H "Authorization: Bearer $JARSAVE_SECRET_KEY" \
-H "JarSave-Version: 2026-10-29" \
-H "Content-Type: application/json" \
-d @lesson.jsonuse Illuminate\Support\Facades\Http;
// config/services.php: 'jarsave' => ['key' => env('JARSAVE_SECRET_KEY')]
// $lesson: an array with the fields shown above
$response = Http::withToken(config('services.jarsave.key'))
->withHeaders(['JarSave-Version' => '2026-10-29'])
->post('https://api.jarsave.com/v1/links/lnk_8Gm2QxT4/lessons', $lesson);// lesson: an object with the fields shown above
const response = await fetch("https://api.jarsave.com/v1/links/lnk_8Gm2QxT4/lessons", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.JARSAVE_SECRET_KEY}`,
"JarSave-Version": "2026-10-29",
"Content-Type": "application/json",
},
body: JSON.stringify(lesson),
});
const result = await response.json();import os
import requests
# lesson: a dict with the fields shown above
response = requests.post(
"https://api.jarsave.com/v1/links/lnk_8Gm2QxT4/lessons",
headers={
"Authorization": f"Bearer {os.environ['JARSAVE_SECRET_KEY']}",
"JarSave-Version": "2026-10-29",
},
json=lesson,
timeout=30,
)
result = response.json()Response
{
"id": "itm_7Ha1Lc0P",
"object": "lesson",
"link": "lnk_8Gm2QxT4",
"lesson_id": "les_77031",
"status": "pending",
"received": "2026-11-26T16:12:44+07:00"
}