Skip to content
Aldi edited this page Nov 8, 2026 · 3 revisions

OJS 3.5 .NET Client

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 Using
using 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")

Pages

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

Conventions used in these pages

  • Examples are shown in VB.NET, C# and F#.
  • ojs is an OjsClient created as in Getting Started.
  • The VB and C# examples run inside an Async method. The F# examples run inside a task { } block.
  • C# examples assume the SDK's implicit usings, which provide System, System.IO, System.Linq, System.Net.Http and others.
  • Numbers such as 12 (a submission ID) or 15 (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.Models
    • OJS3_5.Library.Queries
    • OJS3_5.Library.Serialization (LocalizedString, LocalizedVocab)
    • OJS3_5.Library.Errors
    • OJS3_5.Library.Resources (VocabNames)

Clone this wiki locally