curl --request POST \
--url https://api.the-juno.com/api/v1/public-api/learning-activities/.search-cursor \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"filters": {
"user_email": "dana.levi@acme.com",
"unit_id": "64f0c0ffee0000000000abcd"
},
"select": {
"status": 1,
"completed_at": 1
}
}
'import requests
url = "https://api.the-juno.com/api/v1/public-api/learning-activities/.search-cursor"
payload = {
"filters": {
"user_email": "dana.levi@acme.com",
"unit_id": "64f0c0ffee0000000000abcd"
},
"select": {
"status": 1,
"completed_at": 1
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
filters: {user_email: 'dana.levi@acme.com', unit_id: '64f0c0ffee0000000000abcd'},
select: {status: 1, completed_at: 1}
})
};
fetch('https://api.the-juno.com/api/v1/public-api/learning-activities/.search-cursor', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.the-juno.com/api/v1/public-api/learning-activities/.search-cursor",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'filters' => [
'user_email' => 'dana.levi@acme.com',
'unit_id' => '64f0c0ffee0000000000abcd'
],
'select' => [
'status' => 1,
'completed_at' => 1
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.the-juno.com/api/v1/public-api/learning-activities/.search-cursor"
payload := strings.NewReader("{\n \"filters\": {\n \"user_email\": \"dana.levi@acme.com\",\n \"unit_id\": \"64f0c0ffee0000000000abcd\"\n },\n \"select\": {\n \"status\": 1,\n \"completed_at\": 1\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.the-juno.com/api/v1/public-api/learning-activities/.search-cursor")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"filters\": {\n \"user_email\": \"dana.levi@acme.com\",\n \"unit_id\": \"64f0c0ffee0000000000abcd\"\n },\n \"select\": {\n \"status\": 1,\n \"completed_at\": 1\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.the-juno.com/api/v1/public-api/learning-activities/.search-cursor")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"filters\": {\n \"user_email\": \"dana.levi@acme.com\",\n \"unit_id\": \"64f0c0ffee0000000000abcd\"\n },\n \"select\": {\n \"status\": 1,\n \"completed_at\": 1\n }\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"activity_id": "9b2f1c5e8a7d4e3f9c0b1a2d3e4f5a6b",
"status": "completed",
"completed_at": "2026-10-19T09:41:07.000Z",
"last_activity_at": "2026-10-19T09:41:07.000Z"
}
],
"cursor": "eyJ0aW1lc3RhbXAiOi...",
"dataAsOf": "2026-10-19T09:52:30.912Z"
}List learning activities (Preview)
Get each learner’s current progress, completion and score per learning item. Requires the learning_activities:read scope; the token’s creator must still be an Admin. Each token can make 60 requests per minute.
Results are sorted by last_activity_at. Send back the cursor from each response to get the next page. See the overview for filters and keeping your system in sync.
curl --request POST \
--url https://api.the-juno.com/api/v1/public-api/learning-activities/.search-cursor \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"filters": {
"user_email": "dana.levi@acme.com",
"unit_id": "64f0c0ffee0000000000abcd"
},
"select": {
"status": 1,
"completed_at": 1
}
}
'import requests
url = "https://api.the-juno.com/api/v1/public-api/learning-activities/.search-cursor"
payload = {
"filters": {
"user_email": "dana.levi@acme.com",
"unit_id": "64f0c0ffee0000000000abcd"
},
"select": {
"status": 1,
"completed_at": 1
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
filters: {user_email: 'dana.levi@acme.com', unit_id: '64f0c0ffee0000000000abcd'},
select: {status: 1, completed_at: 1}
})
};
fetch('https://api.the-juno.com/api/v1/public-api/learning-activities/.search-cursor', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.the-juno.com/api/v1/public-api/learning-activities/.search-cursor",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'filters' => [
'user_email' => 'dana.levi@acme.com',
'unit_id' => '64f0c0ffee0000000000abcd'
],
'select' => [
'status' => 1,
'completed_at' => 1
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.the-juno.com/api/v1/public-api/learning-activities/.search-cursor"
payload := strings.NewReader("{\n \"filters\": {\n \"user_email\": \"dana.levi@acme.com\",\n \"unit_id\": \"64f0c0ffee0000000000abcd\"\n },\n \"select\": {\n \"status\": 1,\n \"completed_at\": 1\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.the-juno.com/api/v1/public-api/learning-activities/.search-cursor")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"filters\": {\n \"user_email\": \"dana.levi@acme.com\",\n \"unit_id\": \"64f0c0ffee0000000000abcd\"\n },\n \"select\": {\n \"status\": 1,\n \"completed_at\": 1\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.the-juno.com/api/v1/public-api/learning-activities/.search-cursor")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"filters\": {\n \"user_email\": \"dana.levi@acme.com\",\n \"unit_id\": \"64f0c0ffee0000000000abcd\"\n },\n \"select\": {\n \"status\": 1,\n \"completed_at\": 1\n }\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"activity_id": "9b2f1c5e8a7d4e3f9c0b1a2d3e4f5a6b",
"status": "completed",
"completed_at": "2026-10-19T09:41:07.000Z",
"last_activity_at": "2026-10-19T09:41:07.000Z"
}
],
"cursor": "eyJ0aW1lc3RhbXAiOi...",
"dataAsOf": "2026-10-19T09:52:30.912Z"
}Authorizations
Personal access token. Create one in Admin → Security → Developer Settings → Generate Personal Access Token.
Body
All fields are optional. An empty body returns the first page of every learning activity in your organization.
Narrow the rows. Filters combine. Any other filter name or operator returns 400.
Show child attributes
Show child attributes
Fields to return, for example { "status": 1, "completed_at": 1 }. activity_id and last_activity_at are always included. Leave it out to get every field. Select only the fields you use: smaller responses come back faster.
Show child attributes
Show child attributes
Rows per page.
1 <= x <= 1000The cursor from the previous response, to get the next page.
1024Was this page helpful?

