Paramount E-Course Platform API
Integrate your website or application with Paramount E-Course — Nigeria's premier learning platform. Embed courses, webinars, certificates, and credit systems directly into your own product.
Make Your First Request
The base URL for all API calls is https://course.paramountmart.shop/api. All responses are JSON.
# Fetch the public course catalogue
curl -X GET "https://course.paramountmart.shop/api/courses" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Accept: application/json"
const PECS_API = 'https://course.paramountmart.shop/api';
const API_KEY = 'YOUR_API_KEY';
async function getCourses() {
const res = await fetch(`${PECS_API}/courses`, {
headers: {
'X-API-Key': API_KEY,
'Accept': 'application/json'
}
});
const { data } = await res.json();
return data.courses; // Array of course objects
}
// Example response:
// [{ id: 1, title: "Web Dev Bootcamp", category: "Technology",
// level: "Intermediate", duration: "40h", rating: 4.9 }]
<?php
$api_key = 'YOUR_API_KEY';
$base = 'https://course.paramountmart.shop/api';
function pecs_get(string $endpoint): array {
global $api_key, $base;
$ch = curl_init("$base/$endpoint");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"X-API-Key: $api_key",
'Accept: application/json'
]
]);
$body = curl_exec($ch);
curl_close($ch);
return json_decode($body, true)['data'] ?? [];
}
$courses = pecs_get('courses')['courses'];
foreach ($courses as $c) {
echo $c['title'] . " — " . $c['rating'] . "\n";
}
API Authentication
All API requests require a partner API key sent as an HTTP header. Keys are issued per registered partner application.
eck_live_ are production. Test keys start with eck_test_.• Request is within rate limit
• Endpoint is permitted on your plan
• Origin domain is allowlisted
• Key has been revoked
• Plan doesn't include this endpoint
• Monthly quota exceeded
Course Endpoints
| PARAM | TYPE | REQUIRED | DESCRIPTION |
|---|---|---|---|
category | string | optional | Filter by category (e.g. Technology, Marketing) |
level | string | optional | Beginner, Intermediate, Advanced, All Levels |
limit | integer | optional | Number of results (default 20, max 100) |
page | integer | optional | Pagination page number (default 1) |
{
"status": "success",
"data": {
"courses": [
{
"id": 1,
"title": "Web Development Bootcamp",
"category": "Technology",
"level": "Intermediate",
"duration": "40h",
"rating": 4.9,
"enrolled": 1240,
"credit_cost": 200,
"thumbnail_url": "https://...",
"tutor": { "name": "Chidi Nwankwo", "avatar": "https://..." }
}
],
"total": 12,
"page": 1,
"pages": 1
}
}
Returns full course details including topics, tutor info, and preview content.
{
"status": "success",
"data": {
"id": 1,
"title": "Web Development Bootcamp",
"description": "...",
"category": "Technology",
"topics": [
{ "id": 1, "title": "HTML Fundamentals", "duration": "45m", "has_quiz": true },
{ "id": 2, "title": "CSS Mastery", "duration": "1h 20m", "has_quiz": true }
],
"tutor": { "id": 5, "name": "Chidi Nwankwo", "bio": "..." },
"credit_cost": 200,
"enrolled": 1240
}
}
Enrol a User in a Course
| BODY PARAM | TYPE | REQUIRED | DESCRIPTION |
|---|---|---|---|
user_id | integer | required | Paramount E-Course user ID (or use external_user_id) |
external_user_id | string | optional | Your own user reference ID |
course_id | integer | required | The course ID to enrol in |
deduct_credits | boolean | optional | Whether to deduct credits (default: true) |
{
"external_user_id": "your-user-123",
"course_id": 1,
"deduct_credits": false
}
Certificate Issuance
Issue, retrieve, and verify certificates programmatically. Certificates include a unique ID you can use for employer verification.
| BODY PARAM | TYPE | REQUIRED | DESCRIPTION |
|---|---|---|---|
user_id | integer | required | The user receiving the certificate |
course_id | integer | required | The completed course |
override_quiz | boolean | optional | Issue even if quizzes incomplete (admin only) |
No API key required. Anyone can verify a certificate using its unique ID.
{
"valid": true,
"certificate": {
"id": "PECS-2024-001234",
"holder_name": "Adaeze Okonkwo",
"course_title": "Digital Marketing Mastery",
"issued_at": "2024-11-15",
"platform": "Paramount E-Course · course.paramountmart.shop"
}
}
Credits Management
| PARAM | TYPE | REQUIRED | DESCRIPTION |
|---|---|---|---|
user_id | integer | required | Target user's Paramount E-Course ID |
amount | integer | required | Credits to add |
source | string | optional | Source label (e.g. "paystack", "partner-grant") |
reference | string | optional | Your transaction reference |
{ "status": "success", "data": { "user_id": 42, "credits": 750 } }
Webinar API
Embed Paramount E-Course's live webinar engine into your own platform. Create sessions, manage attendees, and get join links — all via API.
| PARAM | TYPE | REQUIRED | DESCRIPTION |
|---|---|---|---|
title | string | required | Webinar session title |
host_id | integer | required | Tutor/host user ID |
scheduled_at | ISO 8601 | required | When the session starts |
duration_minutes | integer | optional | Expected duration (default 60) |
max_attendees | integer | optional | Attendee cap (default unlimited) |
is_public | boolean | optional | Visible in public listing (default false) |
{
"status": "success",
"data": {
"webinar_id": "wbn_abc123",
"title": "Digital Marketing Masterclass",
"scheduled_at": "2025-02-15T14:00:00Z",
"host_join_url": "https://course.paramountmart.shop/live?wbn=wbn_abc123&t=HOST_TOKEN",
"attendee_join_url": "https://course.paramountmart.shop/live?wbn=wbn_abc123",
"embed_url": "https://course.paramountmart.shop/embed/webinar/wbn_abc123"
}
}
Returns a list of all joined and registered attendees for a webinar session.
Terminates the live session and triggers webinar.ended webhook event to all subscribers.
AI-Powered Course Search
Powered by Groq AI (llama-3.1-8b-instant). Pass a natural language query and receive semantically matched courses.
{
"query": "I want to learn how to market my small business online in Nigeria",
"limit": 5
}
How Webhooks Work
Paramount E-Course sends real-time HTTP POST notifications to your endpoint whenever key events happen — enrolments, completions, certificate issuance, webinar events, and more.
curl -X POST "https://course.paramountmart.shop/api/connect/webhooks" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://yoursite.com/pecs-webhook",
"events": ["course.completed", "certificate.issued", "webinar.started"],
"secret": "your_webhook_signing_secret"
}'
{
"event": "course.completed",
"timestamp": "2025-01-15T10:34:22Z",
"webhook_id": "wh_evt_abc123xyz",
"data": {
"user_id": 42,
"user_name": "Adaeze Okonkwo",
"user_email": "adaeze@example.com",
"external_user_id": "your-user-ref-456",
"course_id": 1,
"course_title": "Digital Marketing Mastery",
"completed_at": "2025-01-15T10:34:21Z",
"certificate_id": "PECS-2025-001234"
}
}
Webhook Event Types
Signature Verification
Every webhook request includes an X-PECS-Signature header. Always verify this before processing.
<?php
// Your webhook handler (e.g. /pecs-webhook.php)
$payload = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_PECS_SIGNATURE'] ?? '';
$secret = 'YOUR_WEBHOOK_SIGNING_SECRET';
// Compute expected signature
$expected = 'sha256=' . hash_hmac('sha256', $payload, $secret);
// Constant-time comparison to prevent timing attacks
if (!hash_equals($expected, $signature)) {
http_response_code(401);
exit('Invalid signature');
}
$event = json_decode($payload, true);
switch ($event['event']) {
case 'course.completed':
// Award your own badge or update your CRM
handle_completion($event['data']);
break;
case 'certificate.issued':
// Notify the user via your own system
notify_certificate($event['data']);
break;
case 'webinar.started':
// Show "LIVE NOW" banner on your site
broadcast_live_notification($event['data']);
break;
}
http_response_code(200);
echo json_encode(['received' => true]);
const crypto = require('crypto');
function verifyEcosWebhook(rawBody, signature, secret) {
const expected = 'sha256=' + crypto
.createHmac('sha256', secret)
.update(rawBody)
.digest('hex');
// Constant-time comparison
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(signature)
);
}
// Express.js handler
app.post('/pecs-webhook', express.raw({ type: '*/*' }), (req, res) => {
const sig = req.headers['x-pecs-signature'];
const secret = process.env.PECS_WEBHOOK_SECRET;
if (!verifyEcosWebhook(req.body, sig, secret)) {
return res.status(401).send('Invalid signature');
}
const event = JSON.parse(req.body);
console.log('Event received:', event.event, event.data);
res.json({ received: true });
});
Get Your API Key
Register your application below to receive a test API key instantly. Production keys are issued after a brief review.