Scopes: Arts, Humanities, & Social Sciences; Multidisciplinary; STEM
Disciplines: Classics, General, History, Human Rights, Law, Medicine, Philosophy, Political Science, Psychology, Regional Studies, and Spanish *Note: As we are constantly working to keep our database up to date, this list of disciplines may not be exhaustive. We recommend checking out related journals for niche fields and searching for any keywords related to your field.
Filter using the drop-down
Sort based on keywords
New to the process? Check out our Guide for more information!
Search Undergraduate Journals
Sort by:
Journal Name (Alphabetical)
Scope (Alphabetical)
Discipline (Alphabetical)
Institution (Alphabetical)
Search:
Show Only Journals That Accept External Submissions
Show Only Journals With No Fees
Loading journals…
const sheetID = ‘1iFzIOyaHUEDqNrYYr57lKEt0zrVefoGNbIoO4fCNIHA’;
const sheetName = ‘Sheet1’;
const url = `https://opensheet.elk.sh/${sheetID}/${sheetName}`;
let journalData = [];
let currentSortField = “Journal Name”;
function renderJournals(data) {
const container = document.getElementById(‘journal-list’);
container.innerHTML = data.map((entry, index) => {
const activeStatus = entry[“Active”]?.trim().toLowerCase();
if (activeStatus === “no”) return “”; // Skip if Active is “No”
const hasLink = entry[“Link”]?.trim();
const isMember = entry[“Member”]?.toLowerCase() === “yes”;
const description = entry[“Description”] || “”;
const fees = entry[“Fees”] || “N/A”;
const acceptsExternal = entry[“Accepts External Submissions”] || “N/A”;
return `
Institution: ${entry[“Institution”] || “N/A”}
Scope: ${entry[“Scope”] || “N/A”}
Discipline: ${entry[“Discipline”] || “N/A”}
Accepts External Submissions: ${acceptsExternal}
Fees: ${fees}
${isMember ? `
Member Description
${description}
` : “Not a Member”}
`;
}).join(”);
}
function toggleDescription(index) {
const desc = document.getElementById(`desc-${index}`);
desc.style.display = (desc.style.display === “none” || desc.style.display === “”) ? “block” : “none”;
}
function sortAndRender(primaryField) {
currentSortField = primaryField;
const query = document.getElementById(‘search-box’).value;
const filtered = filterJournals(query);
const sorted = filtered.sort((a, b) => {
const fields = [primaryField, “Journal Name”, “Institution”, “Scope”, “Discipline”];
for (let field of fields) {
const valA = (a[field] || ”).toLowerCase();
const valB = (b[field] || ”).toLowerCase();
const comparison = valA.localeCompare(valB);
if (comparison !== 0) return comparison;
}
return 0;
});
renderJournals(sorted);
}
function filterJournals(query) {
const lowerQuery = query.toLowerCase();
const externalToggle = document.getElementById(‘external-submissions-toggle’).checked;
const noFeesToggle = document.getElementById(‘no-fees-toggle’).checked;
return journalData.filter(entry => {
const activeStatus = entry[“Active”]?.trim().toLowerCase();
if (activeStatus === “no”) return false;
const matchesSearch = [“Journal Name”, “Institution”, “Scope”, “Discipline”].some(field =>
(entry[field] || “”).toLowerCase().includes(lowerQuery)
);
const acceptsExternal = entry[“Accepts External Submissions”]?.toLowerCase() === “yes”;
const hasNoFees = entry[“Fees”]?.toLowerCase() === “no”;
const matchesExternal = !externalToggle || acceptsExternal;
const matchesFees = !noFeesToggle || hasNoFees;
return matchesSearch && matchesExternal && matchesFees;
});
}
fetch(url)
.then(response => response.json())
.then(data => {
journalData = data;
sortAndRender(currentSortField);
})
.catch(error => {
document.getElementById(‘journal-list’).innerText = ‘Failed to load journal data.’;
console.error(‘Error fetching data:’, error);
});
document.getElementById(‘sort-menu’).addEventListener(‘change’, function () {
sortAndRender(this.value);
});
document.getElementById(‘search-box’).addEventListener(‘input’, function () {
sortAndRender(currentSortField);
});
document.getElementById(‘external-submissions-toggle’).addEventListener(‘change’, function () {
sortAndRender(currentSortField);
});
document.getElementById(‘no-fees-toggle’).addEventListener(‘change’, function () {
sortAndRender(currentSortField);
});