kenya universities and colleges central placement service (kuccps)

KUCCPS set to release university placement results for over 980,000 Form Four leavers

KUCCPS set to release university placement results for over 980,000 Form Four leavers

Listen

Read this story aloud

Listen to the clean text version of this article.


Ready

5 min listen
Audio reading is not supported on this browser.

To access their placement results, students will be required to log into the KUCCPS portal using their KCSE index numbers to confirm the institutions and courses they have been assigned.

Months after sitting the 2025 Kenya Certificate of Secondary Education (KCSE) examination, more than 980,000 Form Four leavers who qualified for placement will finally know the universities and colleges they have been admitted to when the Kenya Universities and Colleges Central Placement Service (KUCCPS) releases the 2026 placement results on Wednesday.
The announcement, expected to be made by Education Cabinet Secretary Julius Ogamba, will bring to an end months of waiting for candidates seeking admission to universities, Technical and Vocational Education and Training (TVET) institutions, and other colleges.
The students will be placed in degree, diploma, certificate and artisan programmes depending on their qualifications, selected courses and the available spaces in various institutions.
“As required by the Universities Act, 2012, placement of students into the institutions will be on merit, considering applicants’ listed priorities, KCSE performance and available capacities,” KUCCPS said.
To access their placement results, students will be required to log into the KUCCPS portal using their KCSE index numbers to confirm the institutions and courses they have been assigned.
Universities and colleges are expected to issue admission letters and joining instructions immediately after the release of the results, paving the way for students to begin preparations for their next stage of education.
The placement exercise comes amid growing concerns over access to higher education funding, with thousands of students expected to apply for government scholarships and Higher Education Loans Board (Helb) loans after receiving their admission offers.
Data from the Kenya National Examinations Council (KNEC) shows that 268,700 candidates attained the minimum mean grade of C+ required for admission to degree programmes.
Successful university applicants are expected to join institutions between August and September when universities begin their academic calendars, while TVET admissions will follow the reporting schedules set by individual institutions.
This year’s placement will see a bigger university-bound group compared to the previous year, with 24,137 more students qualifying for university admission. A total of 244,563 candidates attained the minimum university entry grade of C+ in the 2024 KCSE examination.
KUCCPS has 322,396 degree slots available in 43 public and 31 private universities, meaning all candidates who attained the required grade for university admission can secure a place.
TVET institutions have declared a capacity for 1,132,531 trainees, while secondary teacher training colleges have space for 2,480 students.
The increase in the number of students joining universities means institutions are set to admit their biggest first-year class in years, even as questions remain on whether available government funding will meet the needs of the growing student population.
Although the government increased funding for higher education in the 2026/27 Budget, concerns remain over whether the allocations will be enough to support students joining universities and TVET institutions.
Budget estimates for the 2026/27 financial year show that Helb has been allocated Sh56.3 billion against a requirement of Sh112.1 billion to support an estimated 1.38 million students, leaving a funding gap of Sh55.8 billion.
The allocation translates to about Sh40,694 per student, compared to an estimated requirement of Sh81,020, creating an average funding gap of Sh40,327 for every beneficiary.
The budget estimates further show that Helb and the Universities Fund face a combined financing shortfall of more than Sh72 billion, raising concerns that hundreds of thousands of students may not receive adequate loans and scholarships.
Applications for scholarships and loans have remained a difficult process for students from poor backgrounds, especially after the introduction of the current higher education funding model in 2023.
Demand for student financing continues to rise as more learners qualify for higher education each year, putting pressure on available resources.
Universities are expected to start issuing admission letters immediately after the release of the placement results. Students will then use the admission letters to apply for government scholarships and Helb loans.

`;
}

return “;
}

function commentActionsMarkup(comment, canComment) {
const likeLabel = comment.liked_by_me ? ‘Liked’ : ‘Like’;
const likeCount = Number(comment.like_count || 0) > 0
? “
: ”;

const likeButton = canComment && comment.status === ‘approved’
? “
: “;

const replyButton = canComment && comment.status === ‘approved’
? “
: ”;

return `

`;
}

function commentMarkup(comment, canComment, isReply = false) {
const pendingBadge = comment.status && comment.status !== ‘approved’
? “
: ”;

const edited = comment.is_edited
? “
: ”;

const repliesHtml = Array.isArray(comment.replies) && comment.replies.length
? `

`
: “;

return `

`;
}

function replyFormMarkup(commentId) {
return `

`;
}

function setNotice(widget, message, type = ‘info’) {
const notice = widget.querySelector(‘[data-role=”notice”]’);
if (!notice) return;

if (!message) {
notice.hidden = true;
notice.textContent = ”;
notice.classList.remove(‘is-error’);
return;
}

notice.hidden = false;
notice.textContent = message;
notice.classList.toggle(‘is-error’, type === ‘error’);
}

function setCount(widget, total) {
const count = widget.querySelector(‘[data-role=”count”]’);
if (!count) return;

const num = Number(total || 0);
count.textContent = num === 1 ? ‘1 comment’ : `${num} comments`;
}

function openReplyBox(widget, commentId) {
widget.querySelectorAll(‘[data-role=”reply-box”]’).forEach(box => {
box.hidden = true;
box.innerHTML = ”;
});

const targetItem = widget.querySelector(`.ev-comments__item[data-comment-id=”${commentId}”]`);
if (!targetItem) return;

const replyBox = targetItem.querySelector(‘[data-role=”reply-box”]’);
if (!replyBox) return;

replyBox.hidden = false;
replyBox.innerHTML = replyFormMarkup(commentId);

const textarea = replyBox.querySelector(‘textarea’);
if (textarea) textarea.focus();
}

function closeReplyBox(container) {
if (!container) return;
container.hidden = true;
container.innerHTML = ”;
}

async function initCommentsWidget(widget) {
const state = {
articleId: Number(widget.dataset.articleId),
loadUrl: widget.dataset.loadUrl,
storeUrl: widget.dataset.storeUrl,
commentsBaseUrl: widget.dataset.commentsBaseUrl,
canComment: widget.dataset.canComment === ‘1’,
page: 1,
perPage: 10,
sort: ‘newest’,
total: 0,
hasMore: false,
busy: false
};

const list = widget.querySelector(‘[data-role=”list”]’);
const loading = widget.querySelector(‘[data-role=”loading”]’);
const empty = widget.querySelector(‘[data-role=”empty”]’);
const loadMoreBtn = widget.querySelector(‘[data-role=”load-more”]’);
const sortSelect = widget.querySelector(‘[data-role=”sort”]’);
const composerForm = widget.querySelector(‘[data-role=”composer-form”]’);

async function loadComments(reset = true) {
if (state.busy) return;

state.busy = true;
setNotice(widget, ”);
loading.hidden = false;

if (reset) {
state.page = 1;
list.innerHTML = ”;
empty.hidden = true;
}

try {
const url = new URL(state.loadUrl, window.location.origin);
url.searchParams.set(‘page’, state.page);
url.searchParams.set(‘per_page’, state.perPage);
url.searchParams.set(‘sort’, state.sort);

const response = await requestJson(url.toString(), {
method: ‘GET’,
headers: {
‘Accept’: ‘application/json’,
‘X-Requested-With’: ‘XMLHttpRequest’
}
});

const items = Array.isArray(response.data) ? response.data : [];
const meta = response.meta || {};

state.total = Number(meta.total || 0);
state.hasMore = !!meta.has_more;

setCount(widget, state.total);

if (reset) {
list.innerHTML = ”;
}

if (!items.length && reset) {
empty.hidden = false;
} else {
empty.hidden = true;
list.insertAdjacentHTML(
‘beforeend’,
items.map(item => commentMarkup(item, state.canComment, false)).join(”)
);
}

loadMoreBtn.hidden = !state.hasMore;
} catch (error) {
if (!list.children.length) {
empty.hidden = false;
empty.textContent = ‘Unable to load comments right now.’;
}
setNotice(widget, error.message || ‘Unable to load comments.’, ‘error’);
} finally {
loading.hidden = true;
state.busy = false;
}
}

async function submitTopLevelComment(form) {
const textarea = form.querySelector(‘textarea[name=”content”]’);
const button = form.querySelector(‘[data-role=”submit-comment”]’);

if (!textarea) return;

const content = textarea.value.trim();
if (!content) return;

const originalText = button ? button.textContent : ”;

try {
if (button) {
button.disabled = true;
button.textContent = ‘Posting…’;
}

const response = await requestJson(state.storeUrl, {
method: ‘POST’,
headers: buildJsonHeaders(),
body: JSON.stringify({
article_id: state.articleId,
content: content,
source_url: window.location.href
})
});

textarea.value = ”;

if (response?.data) {
list.insertAdjacentHTML(
‘afterbegin’,
commentMarkup(response.data, state.canComment, false)
);
empty.hidden = true;

if ((response.data.status || ”) === ‘approved’) {
state.total += 1;
setCount(widget, state.total);
}
}

setNotice(widget, response.message || ‘Comment posted successfully.’);
} catch (error) {
setNotice(widget, error.message || ‘Unable to post comment.’, ‘error’);
} finally {
if (button) {
button.disabled = false;
button.textContent = originalText || ‘Post comment’;
}
}
}

async function submitReply(form) {
const commentId = Number(form.dataset.commentId || 0);
const textarea = form.querySelector(‘textarea[name=”content”]’);
const button = form.querySelector(‘.ev-comments__reply-submit’);

if (!commentId || !textarea) return;

const content = textarea.value.trim();
if (!content) return;

const originalText = button ? button.textContent : ”;

try {
if (button) {
button.disabled = true;
button.textContent = ‘Posting…’;
}

const response = await requestJson(`${state.commentsBaseUrl}/${commentId}/reply`, {
method: ‘POST’,
headers: buildJsonHeaders(),
body: JSON.stringify({
article_id: state.articleId,
content: content,
source_url: window.location.href
})
});

if (response?.data) {
const parentItem = widget.querySelector(`.ev-comments__item[data-comment-id=”${commentId}”]`);
if (parentItem) {
const repliesWrap = parentItem.querySelector(‘.ev-comments__replies’);
if (repliesWrap) {
repliesWrap.insertAdjacentHTML(
‘beforeend’,
commentMarkup(response.data, state.canComment, true)
);
}
}
}

closeReplyBox(form.closest(‘[data-role=”reply-box”]’));
setNotice(widget, response.message || ‘Reply posted successfully.’);
} catch (error) {
setNotice(widget, error.message || ‘Unable to post reply.’, ‘error’);
} finally {
if (button) {
button.disabled = false;
button.textContent = originalText || ‘Post reply’;
}
}
}

async function toggleLike(button) {
const commentId = Number(button.dataset.commentId || 0);
if (!commentId) return;

const originalHtml = button.innerHTML;

try {
button.disabled = true;
button.innerHTML = ‘Working…’;

const response = await requestJson(`${state.commentsBaseUrl}/${commentId}/like`, {
method: ‘POST’,
headers: buildJsonHeaders(),
body: JSON.stringify({})
});

const liked = !!response?.data?.liked;
const likeCount = Number(response?.data?.like_count || 0);

button.classList.toggle(‘is-liked’, liked);
button.innerHTML = `${liked ? ‘Liked’ : ‘Like’} ${likeCount > 0 ? “ : ”}`;
} catch (error) {
button.innerHTML = originalHtml;
setNotice(widget, error.message || ‘Unable to update like.’, ‘error’);
} finally {
button.disabled = false;
}
}

if (composerForm) {
composerForm.addEventListener(‘submit’, function (e) {
e.preventDefault();
submitTopLevelComment(composerForm);
});
}

if (sortSelect) {
sortSelect.addEventListener(‘change’, function () {
state.sort = this.value || ‘newest’;
loadComments(true);
});
}

if (loadMoreBtn) {
loadMoreBtn.addEventListener(‘click’, function () {
if (state.busy || !state.hasMore) return;
state.page += 1;
loadComments(false);
});
}

widget.addEventListener(‘click’, function (e) {
const likeBtn = e.target.closest(‘[data-action=”toggle-like”]’);
if (likeBtn) {
e.preventDefault();
toggleLike(likeBtn);
return;
}

const replyBtn = e.target.closest(‘[data-action=”toggle-reply”]’);
if (replyBtn) {
e.preventDefault();
openReplyBox(widget, Number(replyBtn.dataset.commentId || 0));
return;
}

const cancelReplyBtn = e.target.closest(‘[data-action=”cancel-reply”]’);
if (cancelReplyBtn) {
e.preventDefault();
closeReplyBox(cancelReplyBtn.closest(‘[data-role=”reply-box”]’));
}
});

widget.addEventListener(‘submit’, function (e) {
const replyForm = e.target.closest(‘.ev-comments__reply-form’);
if (replyForm) {
e.preventDefault();
submitReply(replyForm);
}
});

loadComments(true);
}

document.addEventListener(‘DOMContentLoaded’, function () {
document.querySelectorAll(‘.ev-comments’).forEach(initCommentsWidget);
});
})();

Source: eastleighvoice.co.ke

Hot this week

today world cup match

Trending with 2000+ searches

bradley barcola transfer news

Trending with 100+ searches

equity bank kenya

Trending with 100+ searches

kenya

Trending with 200+ searches

today world cup match

Trending with 2000+ searches

bradley barcola transfer news

Trending with 100+ searches

equity bank kenya

Trending with 100+ searches

kenya

Trending with 200+ searches

england national football team

Trending with 1000+ searches

top scorer world cup

Trending with 200+ searches

world cup results today

Trending with 100+ searches

Related Articles

Popular Categories