---
title: "Api Learning Remediation Primer Complete"
method: POST
path: "/api/learning/remediation/primer-complete"
tags: ["Education"]
---

# Api Learning Remediation Primer Complete

`POST /api/learning/remediation/primer-complete`

## Request

- Base URL: `https://www.oxfordledge.com` (the document declares no server; this is the origin it was published from)
- URL: `https://www.oxfordledge.com/api/learning/remediation/primer-complete`
- Auth: none declared

Mark a remediation primer as COMPLETED (read-through).

Phase 12 measurement hardening — distinct from primer_opened. The
drawer frontend fires this when either 20s of dwell has elapsed OR
the user scrolls to within 50px of the bottom, whichever first.
Idempotent: subsequent POSTs no-op because the helper's WHERE
clause requires primer_completed = FALSE.

Lets the admin dashboard compute completion_rate = completed /
opened. Low completion-rate with high open-rate = primer is too
long (plan's signal: rewrite to simplify).

Body: {"event_id": int}. Returns {"ok": bool}.

## Response `200`

Successful Response

- LearningRemediationActionResponse: `POST /api/learning/remediation/{open|primer-complete}` — mark primer state for the funnel. Run 19 F4 backfill 2026-05-12. Shared shape — both routes return `{ok: bool}` on success and `{ok: false, error}` on validation failure (missing event_id).
  - `ok` boolean, nullable: True iff the underlying mutation flipped a row.
  - `error` string, nullable: 'event_id required' on validation failure.

---

[API](https://skmtc.dev/oxfordledge/apis/oxford-ledge-api.md) · [All operations](https://skmtc.dev/oxfordledge/apis/oxford-ledge-api/llms.txt) · [OpenAPI document](https://skmtc.dev/oxfordledge/apis/oxford-ledge-api/revisions/e832a1260f0b?raw)
