Pagination, idempotency and rate limits
Each section says only what was found in the code. Where nothing was found, it says so.
Pagination
There is no platform-wide convention. A few list endpoints take query parameters, and most return the whole list.
| Endpoint | Parameters | Defaults and limits |
|---|---|---|
GET /api/v1/lms/courses | page, size | page=0, size=20. Zero-based. No upper bound on size was found. |
| LMS forum threads and replies | page, size | page=0, size=20. |
GET /api/v1/copilot/history | page, size | page=0, size=20. Negative page becomes 0, size is clamped to 1 to 100. |
| LMS leaderboards | limit | 20 for quiz leaderboard, 50 for XP leaderboard. |
| Identity audit log | limit | 100. |
| Some analytics and program lists | limit | Optional, no default. |
Responses are plain JSON arrays. There is no envelope with a total count, no next link and no cursor.
Idempotency
There is no Idempotency-Key header support in any service. A search of the service code for the term found only internal behaviours that are safe to repeat:
- Starting a recording for a class room does nothing if the class already has an egress.
- Re-logging a completed mentoring session updates the notes but does not repeat the impact score update or the event.
- The egress webhook ignores a completion for which no class matches.
A client that retries a POST after a timeout may create a duplicate.
Rate limits
Two layers were checked.
Ingress. No rate-limit annotation was found in infra/oci-devops/deploy/ingress.yaml or infra/k8s/ingress.yaml. The ingress sets request body sizes (50 MB, and 2 GB on /api/v1/lms/lessons) and read and send timeouts, which are limits on size and time, not on rate.
LMS service. A Redis counter limits some actions per user, using a fixed window:
| Action | Limit | Response |
|---|---|---|
| Starting a quiz attempt, per participant and quiz | 3 per hour | 429 |
| Uploading an assignment file | 10 per hour | 429 |
The service also defines a general limit of 100 requests per minute per user, but no resource was found that calls it. The forum resource injects the limiter, and no call was found there either.
A limit set elsewhere, such as in the cloud load balancer, would not appear in the repository. That is unverified.
Sources: services/lms-service/.../{CourseResource,ForumResource,QuizResource,AssignmentResource}.java, services/lms-service/.../RedisRateLimiterService.java, services/ai-copilot-service/.../CopilotResource.java, services/identity-service/.../AuditResource.java, infra/oci-devops/deploy/ingress.yaml.