Get user count
Returns the learner count within the specified date range, aggregated daily.
Query Parameters
- start_dateStringrequired
- Start date. `YYYY-MM-DD` (KST)
- end_dateStringrequired
- End date. `YYYY-MM-DD` (KST)
- course_idString
- Exact-match filter on `course_id` (case-sensitive). Omit to disable filtering
- clip_idString
- Exact-match filter on `clip_id` (case-sensitive). Omit to disable filtering
- client_identityString
- `client_identity` of the target client. Defaults to the signed-in member's client. Must be the signed-in client or one of its descendants; any other value returns 403 `OuterClientScopeForbidden`
- include_descendantsBooleandefault: false
- If `true`, returns data for the target client and all of its descendant clients. If `false`, returns data for the target client only
Response Fields
- period_start_dateStringrequired
- Requested start date (`YYYY-MM-DD`, KST)
- period_end_dateStringrequired
- Requested end date (`YYYY-MM-DD`, KST)
- client_identityString | null
- `client_identity` of the target client
- course_idString | null
- The requested `course_id`, stripped and echoed back. `null` if omitted or blank
- clip_idString | null
- The requested `clip_id`, stripped and echoed back. `null` if omitted or blank
- countNumber | null
- Aggregated count. Returned as `null` when fewer than one course is registered.
Internally the server only supports daily aggregation. An invalid date format returns 422 RequestValidationError, and a missing client returns 400 NotExistClient.
The course_id/clip_id filters use exact match and are case-sensitive. Values are trimmed; empty or whitespace-only values are treated as unset and echoed back as null. When both are provided, they are combined with AND.
curl -X GET "https://opsapi.edutap.ai/ops/v1/dashboard/user-count?start_date=2026-06-01&end_date=2026-06-25" \
-H "Authorization: Bearer ${ACCESS_TOKEN}"
# course_id/clip_id (optional filters, e.g. &course_id=course_abc&clip_id=clip_xyz)import requests
res = requests.get(
"https://opsapi.edutap.ai/ops/v1/dashboard/user-count?start_date=2026-06-01&end_date=2026-06-25",
headers={"Authorization": "Bearer ${ACCESS_TOKEN}"},
)
print(res.json())package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "https://opsapi.edutap.ai/ops/v1/dashboard/user-count?start_date=2026-06-01&end_date=2026-06-25", nil)
req.Header.Set("Authorization", "Bearer ${ACCESS_TOKEN}")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
b, _ := io.ReadAll(res.Body)
fmt.Println(string(b))
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Main {
public static void main(String[] args) throws Exception {
HttpRequest req = HttpRequest.newBuilder()
.uri(URI.create("https://opsapi.edutap.ai/ops/v1/dashboard/user-count?start_date=2026-06-01&end_date=2026-06-25"))
.header("Authorization", "Bearer ${ACCESS_TOKEN}")
.GET()
.build();
HttpResponse<String> res = HttpClient.newHttpClient().send(req, HttpResponse.BodyHandlers.ofString());
System.out.println(res.body());
}
}const res = await fetch("https://opsapi.edutap.ai/ops/v1/dashboard/user-count?start_date=2026-06-01&end_date=2026-06-25", {
method: "GET",
headers: {"Authorization": "Bearer ${ACCESS_TOKEN}"},
});
console.log(await res.json());Response
{
"period_start_date": "2026-06-01",
"period_end_date": "2026-06-25",
"client_identity": "acme",
"course_id": null,
"clip_id": null,
"count": 1284
}