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
- Base URL, rate limits, and supported file formats
- Authentication (OAuth 2.0 client credentials)
- Sending a document for similarity check
- Retrieving a document's status and report
- Searching previously uploaded documents by context
- Deleting a document
- 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 |
— |