REST API v1 • Active Production Cluster

One Tenant-Scoped API.Every LMS & Assessment Primitive.

Programmatic access to course authoring, bulk roster ingestion, monotonic exam timers, WebAssembly proctoring telemetry, and real-time SSE streams behind an isolated PostgreSQL schema boundary.

AUTH

Authentication & Tenant Scoping

Bearer Token
https://api.cognaxa.genfinish.com/v1

Every request is authenticated with an administrative Bearer API token and scoped to an isolated PostgreSQL tenant schema via `X-Tenant-Id`. Tokens are generated in your institutional dashboard.

bashPRODUCTION CLUSTER
curl -X GET "https://api.cognaxa.genfinish.com/v1/courses" \
  -H "Authorization: Bearer ck_live_8f3a92b1e4c70d..." \
  -H "X-Tenant-Id: tnt_univ_8841a" \
  -H "Content-Type: application/json"
POST

Bulk Student Roster Ingestion

High Concurrency
/v1/roster/import

Programmatic high-speed student roster ingestion with deterministic email deduplication, course enrollment mapping, and cohort grouping. Processes 10,000+ records in a single payload.

jsonPRODUCTION CLUSTER
// Request: POST /v1/roster/import
{
  "sync_mode": "upsert",
  "deduplicate": true,
  "cohort_id": "cohort_fa2026_eng",
  "students": [
    {
      "email": "j.smith@university.edu",
      "full_name": "James Smith",
      "student_id": "U98214301",
      "enrollments": ["course_cs101_fa26", "course_eng202_fa26"]
    },
    {
      "email": "m.garcia@university.edu",
      "full_name": "Maria Garcia",
      "student_id": "U98214302",
      "enrollments": ["course_cs101_fa26"]
    }
  ]
}

// Response: HTTP/2 200 OK
{
  "imported_count": 2,
  "created": 2,
  "updated": 0,
  "duplicates_resolved": 0,
  "batch_id": "batch_rst_99182a",
  "execution_time_ms": 48
}
REST

Course Management & Publishing

Core Primitive
/v1/courses/*

Hierarchical course structure management. Organize modules, timed lessons, rich video references, and publish courses with atomicity.

httpPRODUCTION CLUSTER
GET    /v1/courses                 # List tenant courses (paginated)
POST   /v1/courses                 # Create course draft
GET    /v1/courses/:id             # Fetch syllabus, modules, and lessons
PATCH  /v1/courses/:id             # Update metadata, instructor assignments
DELETE /v1/courses/:id             # Archive course (soft-delete)
POST   /v1/courses/:id/publish     # Atomically publish syllabus to active roster
REST

Quizzes & Server-Synced Attempts

Monotonic Timers
/v1/quizzes/*

Manage objective and essay assessments. Attempts use monotonic clocks locked to our Redis backend to make student client-clock rollbacks impossible.

httpPRODUCTION CLUSTER
GET    /v1/quizzes/:id
POST   /v1/quizzes/:id/attempts               # Starts monotonic exam timer
PATCH  /v1/quizzes/:id/attempts/:attemptId    # Ingests student answer vector
POST   /v1/quizzes/:id/attempts/:attemptId/submit
GET    /v1/quizzes/:id/attempts/:attemptId/score
GET

Native AI Proctoring Telemetry

Client WebAssembly
/v1/proctoring/sessions/:id/events

Fetch real-time proctoring incidents generated by the client-side WebAssembly inference runtime (face presence, tab blur, audio anomalies, multi-face alerts).

jsonPRODUCTION CLUSTER
// Response: GET /v1/proctoring/sessions/sess_9918a/events
{
  "session_id": "sess_9918a",
  "exam_id": "quiz_midterm_cs101",
  "student_id": "usr_8812a",
  "incidents_count": 1,
  "events": [
    {
      "event_id": "evt_p9012a",
      "type": "tab_blur_detected",
      "severity": "medium",
      "timestamp_offset_seconds": 842.15,
      "metadata": {
        "duration_ms": 4200,
        "window_focused": false
      }
    }
  ]
}
SSE

Real-Time Event Streams (SSE)

Redis Pub/Sub
/v1/events/stream

Subscribe to tenant-scoped real-time event streams via Server-Sent Events (SSE). Backed by Redis Pub/Sub for sub-second exam state and grading updates.

bashPRODUCTION CLUSTER
curl -N -H "Authorization: Bearer ck_live_..." \
     -H "X-Tenant-Id: tnt_univ_8841a" \
     https://api.cognaxa.genfinish.com/v1/events/stream

# Stream Output:
# event: quiz.attempt.submitted
# data: {"attempt_id": "att_881a", "student": "j.smith@univ.edu", "score": 94}
#
# event: proctoring.incident.flagged
# data: {"session_id": "sess_991a", "type": "multiple_faces_present"}
GET

Analytics & Warehouse Pipeline (NDJSON)

Data Warehouse
/v1/analytics/attempts.ndjson

Pull high-volume telemetry exports for Snowflake, BigQuery, or Amazon Redshift. Supports streaming NDJSON for high-efficiency ingestion.

bashPRODUCTION CLUSTER
curl -X GET "https://api.cognaxa.genfinish.com/v1/analytics/attempts.ndjson?from=2026-01-01&to=2026-06-30" \
  -H "Authorization: Bearer ck_live_..." \
  -H "X-Tenant-Id: tnt_univ_8841a" \
  --output semester_attempts.ndjson
HOOK

Outbound HMAC Webhooks (Beta)

Beta via Svix
Outgoing HTTPS POST

Outbound webhook notifications with HMAC-SHA256 signature headers, exponential backoff retries, and automatic idempotency keying.

httpPRODUCTION CLUSTER
Headers sent with every webhook dispatch:
  X-Cognaxa-Signature: t=1712078400,v1=52571838e5edd0f3512f...
  X-Cognaxa-Event-Type: quiz.attempt.submitted
  X-Cognaxa-Delivery-Id: del_99214a

Available events:
  course.published
  quiz.attempt.submitted
  quiz.attempt.graded
  proctoring.incident.flagged
  certificate.issued
  roster.batch.completed
INFO

Token-Bucket Rate Limits

Per-Tenant Bucket
Headers on all responses

Default rate limits: 600 requests/minute, 10,000 requests/hour. Configurable for high-volume finals bursts. HTTP 429 returns standard Retry-After headers.

httpPRODUCTION CLUSTER
X-RateLimit-Limit:     600
X-RateLimit-Remaining: 587
X-RateLimit-Reset:     1712078400
Retry-After:           12

Ready to Transform Your Learning Operations?

Built for organizations and institutions where exam day is non-negotiable — secure by default, native AI proctoring, one vendor on the line.