Plagiarism Checker
Scan text against web sources and receive a plagiarism score, matched sources, and highlighted passages.
POST /api/plagiarism/scan/
Scan text for plagiarism against web sources. Returns a plagiarism_score between 0 (original) and 1 (fully plagiarised), a verdict, the matched sources with URLs, and highlighted character ranges.
Authentication: X-API-Key header with plagiarism_checker scope
Request Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
content | string | Yes | Text to scan. Sent exactly as submitted — highlight offsets in the response refer to this text |
Limits
| Limit | Value |
|---|---|
| Minimum length | 50 characters |
| Maximum length | 25,000 words |
Words are counted script-aware: whitespace-separated words for most languages, one word per character for CJK scripts. The API's count may differ slightly from a simple space-split.
Pricing
Every scan costs a flat 2 credits, regardless of text length. If the scan fails, the credits are refunded automatically.
Idempotency
Scans are billed per request, so retrying a request that already succeeded would normally charge again. To make retries safe, send an Idempotency-Key header (any string up to 255 characters, e.g. a UUID):
- Repeating the same key with the same text within 5 minutes returns the original response — nothing is re-scanned and nothing is charged.
- Repeating the same key with different text is rejected with
409 idempotency_key_reuse, so a stale key can never silently return results for the wrong text.
curl -X POST https://developer-portal.proofademic.ai/api/plagiarism/scan/ \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Idempotency-Key: 3f6c1c1e-8f2a-4a9e-9b1c-1d2e3f4a5b6c" \
-d '{ "content": "..." }'Example
Request
curl -X POST https://developer-portal.proofademic.ai/api/plagiarism/scan/ \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_API_KEY" \
-d '{
"content": "The Eiffel Tower is a wrought-iron lattice tower on the Champ de Mars in Paris, France. It is named after the engineer Gustave Eiffel, whose company designed and built the tower from 1887 to 1889."
}'Response (200 OK)
{
"status": "success",
"scan_id": "scan_YYbWPwT4JHUabc12",
"plagiarism_score": 0.99,
"verdict": "severe_plagiarism",
"summary": "Nearly all of the submitted text matches known sources.",
"sources": [
{
"url": "https://en.wikipedia.org/wiki/Eiffel_Tower",
"title": "Eiffel Tower - Wikipedia",
"domain": "en.wikipedia.org",
"similarity_score": 0.97,
"matched_word_count": 34,
"matched_percentage": 0.92,
"matches": [
{
"submitted_range": { "start": 0, "end": 133 },
"similarity": 0.97
}
]
}
],
"highlights": [
{ "start": 0, "end": 133, "severity": "high", "source_index": 0 }
],
"stats": {
"word_count": 37,
"input_chars": 196,
"sentence_count": 2,
"sources_checked": 24,
"processing_time_ms": 3100
},
"execution_time": 3.4,
"word_count": 37,
"credits_remaining": 1998,
"user": {
"id": 12345
}
}Response Fields
| Field | Type | Description |
|---|---|---|
status | string | Always "success" for a completed scan |
scan_id | string | Scan identifier — include it in support requests |
plagiarism_score | float | 0.0 (original) to 1.0 (fully plagiarised) |
verdict | string | Classification of the score (see below) |
summary | string | Human-readable summary of the result |
sources[] | array | Matched sources, strongest first |
sources[].url | string | Source URL |
sources[].title | string | Source page title |
sources[].domain | string | Source domain |
sources[].similarity_score | float | How closely this source matches (0–1) |
sources[].matched_word_count | integer | Words matched against this source |
sources[].matched_percentage | float | Share of your text matched by this source |
sources[].matches[] | array | Matched passages with submitted_range offsets |
highlights[] | array | Character ranges to highlight in the submitted text |
highlights[].start / end | integer | Offsets into your text exactly as you submitted it |
highlights[].severity | string | high, medium, or low |
highlights[].source_index | integer | Index into sources[] for this highlight |
stats | object | Scan statistics (word_count, input_chars, sentence_count, sources_checked, processing_time_ms) |
word_count | integer | Word count of the submitted text (script-aware) |
credits_remaining | integer | Credit balance after this request |
user.id | integer | Your user ID |
Verdicts
| Score range | Verdict |
|---|---|
| < 0.05 | original |
| 0.05 – 0.15 | minor_similarity |
| 0.15 – 0.40 | moderate_plagiarism |
| 0.40 – 0.70 | significant_plagiarism |
| ≥ 0.70 | severe_plagiarism |
Highlight severity reflects how closely each passage matches its source: high ≥ 0.85, medium ≥ 0.70, low below that.
Errors
| Status | Code | Meaning |
|---|---|---|
400 | insufficient_content | The text does not contain enough complete sentences to scan |
400 | max_words_exceeded | Over the 25,000-word limit — details carries limit and actual |
400 | invalid_payload | Missing or malformed content (including the 50-character minimum) |
400 | invalid_idempotency_key | Idempotency-Key header longer than 255 characters |
403 | insufficient_credits | Not enough credits — details carries credits and required |
409 | idempotency_key_reuse | The Idempotency-Key was already used with different text |
503 | service_unavailable | Scanning temporarily unavailable — retry after the Retry-After header when present |
503 | service_error | Scan failed — credits were refunded |
See Error Handling for the general error format.