Repository navigation
Home
Aldi edited this page Nov 8, 2026
·
3 revisions
A .NET library for the Open Journal Systems 3.5 REST API. It is written in VB.NET and works from any .NET language: VB.NET, C#, F#, PowerShell and others.
It covers every public endpoint of the OJS 3.5 API:
- the editorial workflow: submissions, publications, contributors, files, decisions, reviews;
- journal content and configuration: issues, sections, users, journals, site settings, themes, announcements, email templates;
- integrations: DOIs, ORCID, statistics.
It also smooths over the quirks of the PHP backend, for example dates such as "2026-01-31 10:00:00", numbers sent as
strings, and [] sent for an empty object.
Imports OJS3_5.Library
Imports OJS3_5.Library.Models
Imports OJS3_5.Library.Queries
Using ojs As New OjsClient(New OjsClientOptions With {
.BaseUrl = "https://journals.example.com",
.JournalPath = "jpk",
.ApiToken = Environment.GetEnvironmentVariable("OJS_TOKEN")})
Dim page = Await ojs.Submissions.ListAsync(New SubmissionQuery With {.Status = {SubmissionStatus.Published}})
For Each s In page.Items
Console.WriteLine(s.CurrentPublication?.Title.GetValue("en"))
Next
End Usingusing OJS3_5.Library;
using OJS3_5.Library.Models;
using OJS3_5.Library.Queries;
using var ojs = new OjsClient(new OjsClientOptions
{
BaseUrl = "https://journals.example.com",
JournalPath = "jpk",
ApiToken = Environment.GetEnvironmentVariable("OJS_TOKEN")
});
var page = await ojs.Submissions.ListAsync(new SubmissionQuery { Status = new[] { SubmissionStatus.Published } });
foreach (var s in page.Items)
Console.WriteLine(s.CurrentPublication?.Title.GetValue("en"));use ojs =
new OjsClient(OjsClientOptions(
BaseUrl = "https://journals.example.com",
JournalPath = "jpk",
ApiToken = Environment.GetEnvironmentVariable "OJS_TOKEN"))
let! page = ojs.Submissions.ListAsync(SubmissionQuery(Status = [| SubmissionStatus.Published |]))
for s in page.Items do
match s.CurrentPublication with
| null -> ()
| p -> printfn "%s" (p.Title.GetValue "en")| Topic | What it covers |
|---|---|
| Getting Started | Installing, API tokens, client options, multiple journals, dependency injection |
| Core Concepts | Read and edit models, multilingual values, enums, dates, unknown properties |
| Pagination |
ListAsync, ListAllAsync, Enumerate
|
| Error Handling |
OjsApiException, validation errors, status codes |
| Files | Temporary files, submission files, JATS, downloads |
| Submissions | Submissions, publications, contributors, decisions, participants, reviewer suggestions |
| Issues and Sections | Issues, the current issue, sections |
| Users and Invitations | Users, reviewers, roles, invitations |
| Journals and Site | Journals (contexts), site settings, themes, announcements, institutions |
| Emails | Email templates, mailables, the email log |
| DOIs | Assigning, exporting, depositing and marking DOIs |
| Reviews and ORCID | Review exports, history, confirming on behalf of a reviewer, ORCID |
| Statistics | Editorial, user and usage statistics, JSON or CSV |
| Vocabularies and RORs | Keyword suggestions, Research Organization Registry |
| Advanced | Raw requests, plugin parameters, extending models, custom HttpClient
|
| OJS 3.5 Quirks | Places where the server differs from its OpenAPI document, and how the library handles them |
| Testing and Contributing | Running the unit and live tests |
- Examples are shown in VB.NET, C# and F#.
-
ojsis anOjsClientcreated as in Getting Started. - The VB and C# examples run inside an
Asyncmethod. The F# examples run inside atask { }block. - C# examples assume the SDK's implicit usings, which provide
System,System.IO,System.Linq,System.Net.Httpand others. - Numbers such as
12(a submission ID) or15(a publication ID) stand in for IDs from your own journal. - Add these namespace imports to your files:
-
OJS3_5.Library(OjsClient,OjsClientOptions) OJS3_5.Library.ModelsOJS3_5.Library.Queries-
OJS3_5.Library.Serialization(LocalizedString,LocalizedVocab) OJS3_5.Library.Errors-
OJS3_5.Library.Resources(VocabNames)
-