Skip to content

REST API

Sikshya exposes a REST API under the namespace sikshya/v1, mounted at /wp-json/sikshya/v1/. The same REST surface powers Sikshya's React admin, the learn-hub frontend, and external integrations.

Authentication

Path familyAuth
/admin/*WordPress cookie + X-WP-Nonce (logged-in admin)
/me/*WordPress cookie (logged-in learner) — or Bearer JWT
/public/*Open
/checkout/*Open (cart session) + capability where state-changing
/scale/public-api/*Bearer key + scopes (Pro Scale public_api_keys add-on)

JWT is supported via POST /sikshya/v1/auth/login (returns a HS256 token signed with the sikshya_jwt_secret option). Send subsequent requests with Authorization: Bearer {jwt}.

Free plugin routes (sikshya/v1)

Admin / course builder

RouteMethodsSource
/course-builder/savePOSTAdminRestRoutes
/course-builder/bootstrapGET (?course_id=)AdminRestRoutes
/admin/course-chaptersGETAdminRestRoutes
/admin/course-curriculum-treeGETAdminRestRoutes

Curriculum (chapters / lessons / quizzes)

RouteMethods
/curriculum/contentPOST
/curriculum/content/linkPOST
/curriculum/content-itemPOST
/curriculum/chapter-orderPOST
/curriculum/lesson-orderPOST
/curriculum/outline-structurePOST
/curriculum/bulk-deletePOST
/curriculum/chaptersPOST
/curriculum/chapters/{id}GET, PUT, DELETE

Taxonomies

RouteMethods
/taxonomies/course-categoryGET, POST
/taxonomies/course-category/{id}GET, PUT, DELETE

Settings

RouteMethodsNotes
/settings/schemaGETFull settings schema
/settings/valuesGETCurrent values; ?tab= to scope
/settings/savePOSTSave values
/settings/resetPOSTReset to defaults
/toolsPOSTMaintenance / permission tools

Admin overview & data tables

RouteMethods
/admin/post-status-countsGET
/admin/overviewGET
/admin/licensingGET
/admin/shell-meta?view=GET
/admin/reports-snapshotGET
/admin/enrollmentsGET
/admin/quiz-attemptsGET
/admin/paymentsGET
/admin/issued-certificatesGET
/admin/issued-certificates/revokePOST
/admin/ordersGET
/admin/orders/{id}/mark-paidPOST
/admin/couponsGET, POST
/admin/coupons/{id} (PATCH for advanced coupons)PATCH
/admin/addonsGET
/admin/addons/{id}/enablePOST
/admin/addons/{id}/disablePOST

License (free side bridges to Pro)

RouteMethodsNotes
/admin/licenseGETLicense status + product info
/admin/license/activatePOSTActivate with license_key
/admin/license/savePOSTSave key without activating
/admin/license/deactivatePOSTDeactivate this site's slot
/admin/license/checkPOSTForce re-check

Resource CRUD

RouteMethods
/courses, /courses/{id}GET, POST, PUT, DELETE
/lessons, /lessons/{id}GET, POST, PUT, DELETE
/quizzes, /quizzes/{id}GET, POST, PUT, DELETE
/users, /users/{id}GET, POST, PUT, DELETE
/enrollments, /enrollments/{id}GET, POST, PUT, DELETE
/progressGET
/certificatesGET
/paymentsGET

Learner self-service (/me/*)

RouteMethodsNotes
/me/progressGETPer-course progress payload
/me/lesson-completePOSTMark a lesson done
/me/quiz-submitPOSTSubmit a quiz attempt
/me/unenrollPOSTSelf-unenroll
/me/assignmentsGETIf assignments_basic add-on is on
/me/assignment-submitPOSTSubmit an assignment
/me/assignment-feedbackGETRead feedback
/me/reports-advanced/exportGETPro reports_advanced learner CSV (?type=my_enrollments / my_quiz_attempts); requires plan + addon + allow_learner_self_export

Checkout

RouteMethodsNotes
/checkout/sessionPOSTCreate / resume cart session
/checkout/quotePOSTCompute totals (with coupons / tax)
/checkout/confirmPOSTConfirm a payment

Webhooks

RouteMethodsNotes
/webhooks/stripePOSTVerifies Stripe-Signature against stripe_webhook_secret
/webhooks/paypalPOSTREST webhooks (requires PayPal client id + secret + webhook id)
/webhooks/paypal-ipnPOSTLegacy IPN; respects the global enable_test_mode

Public

RouteMethodsNotes
/public/certificates/verifyGETVerify a certificate by serial
/auth/loginPOSTIssue a JWT
/me/enrollPOSTSelf-enroll on a free course

Pro plugin routes (sikshya/v1)

Registered on rest_api_init (priority 20) when the Pro plugin is loaded. Each route checks plan + add-on; access is denied with HTTP 403 (rest_forbidden, sikshya_plan_feature_required, or sikshya_addon_disabled) instead of returning 404, so API clients get unambiguous failures.

Drip & access

RouteMethodsFeatureRegistry id
/pro/drip-rulesGET, POSTcontent_drip

Subscriptions

RouteMethods
/pro/subscriptionsGET, POST
/pro/subscriptions/cancelPOST
/pro/plansGET, POST
/pro/plans/{id}PUT/PATCH, DELETE

Gradebook

RouteMethods
/pro/gradebookGET
/pro/gradebook/exportGET
/pro/gradebook/gridGET
/pro/gradebook/drilldownGET
/pro/gradebook/assignment-gradePOST
/pro/gradebook/learnerGET
/pro/gradebook/overridePOST
/pro/grade-scalesGET, POST
/pro/grade-scales/{id}GET, PUT/PATCH, DELETE

Multi-instructor

RouteMethods
/pro/multi-instructor/course-staffGET, POST, DELETE
/pro/multi-instructor/earningsGET
/pro/multi-instructor/earnings/set-statusPOST (admin only)

Activity log, advanced reports, certificates, bundles, coupons

RouteMethodsAdd-on
/pro/extended/activity-logGETactivity_log
/pro/reports-advanced/exportGETreports_advanced
/pro/certificates/advancedGETcertificates_advanced
/pro/bundlesGET, POSTcourse_bundles
/pro/bundles/{id}/coursesGET, POSTcourse_bundles
/pro/bundles/{id}/courses/{course_id}DELETEcourse_bundles
/pro/bundles/{id}DELETEcourse_bundles
/pro/bundles/{id}/purchase-linkGETcourse_bundles
/pro/coupons/{id}/advancedGET, POSTcoupons_advanced

Scale tier (marketplace, automation, public API)

RouteMethodsAdd-on
/scale/vendorsGET, POSTmarketplace_multivendor
/scale/withdrawalsPOSTmarketplace_multivendor
/scale/reports/commissionsGETmarketplace_multivendor
/scale/automation/webhooksGET, POSTautomation_zapier_webhooks
/scale/automation/webhooks/{id}DELETEautomation_zapier_webhooks
/scale/public-api/keysGET, POSTpublic_api_keys
/scale/public-api/keys/{id}DELETEpublic_api_keys
/scale/public-api/pingGETpublic_api_keys (auth via Bearer key)

Error codes

Code (code in JSON)StatusWhen
rest_forbidden403Logged-in user lacks capability
sikshya_plan_feature_required403Plan does not include this feature (see also legacy_error_code)
sikshya_addon_disabled403Plan covers it, but the add-on is off
sikshya_pro_required403Legacy; new clients should rely on sikshya_plan_feature_required
rest_no_route404Route not registered
rest_invalid_param400Invalid request parameter
rest_cannot_create403Permission to create this resource is missing

Examples

Authenticate and get progress (JWT)

bash
TOKEN=$(curl -s -X POST https://example.com/wp-json/sikshya/v1/auth/login \
  -H 'Content-Type: application/json' \
  -d '{"username":"[email protected]","password":"...."}' | jq -r .token)

curl -s https://example.com/wp-json/sikshya/v1/me/progress \
  -H "Authorization: Bearer $TOKEN" | jq

Fetch courses (admin)

bash
curl -s https://example.com/wp-json/sikshya/v1/courses?per_page=20 \
  -H 'X-WP-Nonce: NONCE_HERE' \
  --cookie 'wordpress_logged_in_xxx=...'

Manually fulfill an order

bash
curl -s -X POST https://example.com/wp-json/sikshya/v1/admin/orders/123/mark-paid \
  -H 'X-WP-Nonce: NONCE_HERE' \
  --cookie 'wordpress_logged_in_xxx=...'

Pro: list drip rules

bash
curl -s https://example.com/wp-json/sikshya/v1/pro/drip-rules \
  -H 'X-WP-Nonce: NONCE_HERE' \
  --cookie 'wordpress_logged_in_xxx=...'

Verify a certificate publicly

bash
curl -s 'https://example.com/wp-json/sikshya/v1/public/certificates/verify?serial=ABC-123-XYZ'

Adding your own REST routes

Register your routes the standard way and gate them behind Sikshya's helpers if relevant:

php
add_action('rest_api_init', function () {
    register_rest_route('myplugin/v1', '/sync', [
        'methods' => 'POST',
        'permission_callback' => function () {
            return current_user_can('manage_sikshya');
        },
        'callback' => function (WP_REST_Request $r) {
            // ...
            return rest_ensure_response(['ok' => true]);
        },
    ]);
});

Or hook into Sikshya's REST init:

php
add_action('sikshya_register_addon_rest_routes', function ($server) {
    register_rest_route('sikshya/v1', '/my-addon/data', [
        'methods' => 'GET',
        'permission_callback' => '__return_true',
        'callback' => 'my_addon_data',
    ]);
});