Skip to content
  • There are no suggestions because the search field is empty.

Originality API – Integration Guide

This guide is intended for developers integrating an external system with WISEflow Originality.

In this article, you will learn how to authenticate, send a document for a similarity check, retrieve report status and similarity score, link the assessor to the full report, search prior submissions, and delete documents.

What this article covers

  1. Base URL, rate limits, and supported file formats
  2. Authentication (OAuth 2.0 client credentials)
  3. Sending a document for similarity check
  4. Retrieving a document's status and report
  5. Searching previously uploaded documents by context
  6. Deleting a document
  7. Quick reference

 

1. Base URL, rate limits, and supported file formats

Setting

Value

Base URL

https://api.wiseflow-originality.net

API documentation

https://api.wiseflow-originality.net/

Rate limit

200 requests/second and 5,000 requests/minute per API key — whichever is hit first

Maximum file size

200 MiB per upload

Auth scheme

OAuth 2.0 client credentials → bearer token

Token lifetime

30 minutes

Supported file formats

.pdf .doc   .docx .xls .xlsx   .xlsm .ppt .pptx   .ppsx .pptm .pps

.odt .ott   .ods   .ots .odp     .otp   .jpg .jpeg   .png   .gif   .bmp

.tiff .svg .txt   .html .htm   .csv     .xml .rtf

We recommend rejecting other formats and oversize files at your own boundary so you don't waste calls on guaranteed 415 or 413 errors.

2. Authentication (OAuth 2.0 client credentials)

Every API call requires a bearer token. Tokens are issued by exchanging your client_id and client_secret at POST https://api.wiseflow-originality.net/v1/oauth/token

Request body

Field

Required

Value

grant_type

yes

client_credentials

client_id

yes

Your client ID

client_secret

yes

Your client secret

Example

curl -X 'POST' \
'https://api.wiseflow-originality.net/v1/oauth/token' \
-H 'accept: application/json' \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d 'client_id=1234&client_secret=abcde&grant_type=client_credentials'
 

Response

{
"access_token": "token",
"expires_in": 300,
"not-before-policy": 0,
"refresh_expires_in": 0,
"scope": "license_id profile email",
"token_type": "Bearer"
}
Note! Although expires_in may be reported as 300 seconds in some responses, the documented token lifetime is 30 minutes. Always honor the expires_in value returned by the server.

 

Token-cache pattern

Cache the token in memory keyed by client_id and refresh proactively a minute before expiry.

 

3. Sending a document for similarity check

Endpoint – POST https://api.wiseflow-originality.net/v1/documents

Request body

Field

Type

Required

Description

file

binary

yes

The document file. Encoded as application/octet-stream.

index

boolean

yes

If true, the document is added to your licence's index so future submissions can be matched against it.

analyze

boolean

yes

If true, the document is run through originality search and a report is produced.

context

string

no

A JSON-encoded object that lets you tag the document with identifiers from your own system (e.g. assignmentId, studentId). Use context for later lookups via the search endpoint.

Context validation rules

The context field is a string containing a JSON object, sent as a form field. The API enforces these constraints on the parsed object:

  • All values must be strings (not numbers, booleans, or nested objects)
  • Maximum 3 entries per object
  • Each key is at most 20 characters
  • Each value is at most 50 characters

A typical context for an exam-system integration:

{ "assignmentId": "234", "studentId": "567" }

Send it as a form field whose value is the JSON string above (i.e. JSON-encoded, then included in the form body).

The four combinations for document indexing and report generation

index

analyze

When to use it

true

true

Standard exam paper submission — produce a report and add to the index for future matches.

true

false

Bulk-loading reference material (theses archive, supervisor texts) that you want future submissions matched against, without paying for a report.

false

true

Ad-hoc check — produce a report but don't add to the index. Use when the participant has declared confidential material.

false

false

Not useful — the API requires both fields, but there is nothing to do. Don't send this combination.

Request example

curl -X POST https://api.wiseflow-originality.net/v1/documents \
-H "Authorization: Bearer $TOKEN" \
-F "file=@thesis.pdf" \
-F "index=true" \
-F "analyze=true" \
-F 'context={"assignmentId":"234","studentId":"567"}'

Successful response (201 Created)

{
"documentId": 12345
}

Persist documentId against your own paper or assignment record. It is the only join key between your system and Originality for the rest of this document's life. The Location response header points to the new document resource.

4. Retrieving a document's status and report

Endpoint – GET https://api.wiseflow-originality.net/v1/documents/{id}

Response (200 OK)

{
"context": {
"assignmentId": "234"
},
"createdAt": "2024-01-01T12:00:00Z",
"filename": "Assignment.pdf",
"id": 12345,
"reportOpened": false,
"result": {
"score": 0.98,
"viewerLink": "https://example.com/viewer/12345"
},
"settings": {
"analyze": true,
"index": true
},
"status": "complete"
}

Field guide

Field

Description

id

The Originality document ID.

filename

The original file name.

status

Processing state — see the table below.

context

The context object you passed when uploading.

result.score

Similarity score as a float (0.98 = 98 %).

result.viewerLink

Direct URL to the full Originality report viewer. Show this to the assessor as 'Open full report'.

settings.index

Whether the document was indexed at upload.

settings.analyze

Whether the document was analyzed at upload.

createdAt

ISO-8601 upload timestamp.

reportOpened

Whether the report has been viewed. Useful as a follow-up flag in your UI.

Document statuses

Status

Meaning

Your handling

in_progress

Currently being processed.

Continue polling.

failed

Processing failed.

Surface to a support queue with the id; UNIwise support uses this ID to investigate.

available

Report is ready, but not yet final — additional matches can still arrive from parallel analyses.

Safe to display the score and link; mark in your UI that the report may update.

complete

Fully processed. Score and report will not change further.

Display as final.

 

Showing the score

result.score is a float between 0 and 1. Most UIs render it as a percentage. Always surface the status alongside the score:

[ Plagiarism check: in progress ... ]

[ Plagiarism check: 18.4% (preliminary) - Open full report > ]   // status = available

[ Plagiarism check: 18.4% - Open full report > ]                 // status = complete

[ Plagiarism check: failed - Contact support (id 12345) ]         // status = failed

Linking to the full report

The result.viewerLink is the link you give to assessors. Render it as a button or link in your assessor UI. The viewer presents the Originality report including the document, source comparison, and exclusion controls.

5. Searching previously uploaded documents by context

When you upload a document, the context object you set lets you batch-retrieve documents later — for example, ‘all submissions for this assignment.’ The search is exact-match on the context object.

Endpoint – POST https://api.wiseflow-originality.net/v1/documents/search?limit=100&offset=0

Query parameters

Param

Default

Min

Max

Notes

limit

100

1

2000

Max rows to return

offset

0

0

Rows to skip (for paging)

Request body

{
"context": {
"assignmentId": "234"
}
}

The context object on search is an exact match against the context stored when the document was uploaded. Same validation rules apply: max 3 entries, keys ≤ 20 characters, values ≤ 50 characters, all string values.

Response (200 OK)

{
"documents": [
{
"context": {
"assignmentId": "234"
},
"createdAt": "2024-01-01T12:00:00Z",
"filename": "Assignment.pdf",
"id": 12345,
"reportOpened": false,
"result": {
"score": 0.98,
"viewerLink": "https://example.com/viewer/12345"
},
"settings": {
"analyze": true,
"index": true
},
"status": "complete"
}
],
"hasMore": true
}

hasMore is true when more documents exist past the current page — increment offset by limit until hasMore is false.

Useful patterns

  • Per-assignment dashboard. Upload each submission with {"assignmentId": "<your id>", "studentId": "<your id>"}. Search by {"assignmentId": "<your id>"} to populate the assignment view.
  • Per-student history. Search by {"studentId": "<your id>"} (note: the API matches the whole context object you submit; verify whether partial-key match is supported before relying on this).

6. Deleting a document

Endpoint – DELETE https://api.wiseflow-originality.net/v1/documents/{id}

Permanently removes the document — both its analysis data and its index entry. This cannot be undone.

Response (200 OK)

{
"message": "Document with id 1 deleted successfully"
}

Use this endpoint to support participant data deletion requests in your own system. Deleting in your system alone does not remove the document from the Originality index — call this endpoint as part of the workflow.

Quick reference

Operation

Method & path

Auth

Body

Get token

POST /v1/oauth/token

form: grant_type, client_id, client_secret

Upload document

POST /v1/documents

Bearer

multipart: file, index, analyze, optional context

Get document

GET /v1/documents/{id}

Bearer

Search by context

POST /v1/documents/search

Bearer

JSON: {"context": {...}}

Delete document

DELETE /v1/documents/{id}

Bearer