Plagiarism detection API: submit text, poll the report.
Two endpoints, bearer auth, transparent credit pricing. Built for agencies, editorial pipelines and LMS-adjacent tools.
Your API key
Sign in to get your API key. Keys come with every account; API checks are billed in credits.
Sign UpEndpoints
POST /api/v1/check/
Submit a text for checking. Returns 202 with a check_id. Body: JSON with a text field, optional deep boolean.
curl -X POST https://plagiarism.free/api/v1/check/ \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"text": "The text you want to check..."}'
GET /api/v1/check/<check_id>/
Poll for status; when status is done the full report is included: score, per-sentence match types with confidence and source excerpts, and the source list.
curl https://plagiarism.free/api/v1/check/CHECK_ID/ \ -H "Authorization: Bearer YOUR_KEY"
Python example
import time
import requests
API = "https://plagiarism.free/api/v1/check/"
HEADERS = {"Authorization": "Bearer YOUR_KEY"}
r = requests.post(API, json={"text": open("essay.txt").read()}, headers=HEADERS)
check_id = r.json()["check_id"]
while True:
report = requests.get(f"{API}{check_id}/", headers=HEADERS).json()
if report["status"] in ("done", "failed"):
break
time.sleep(3)
print(report["score_pct"], "% matched")
for source in report["sources"]:
print(source["pct_of_document"], source["url"])
JavaScript example
const API = "https://plagiarism.free/api/v1/check/";
const headers = { "Authorization": "Bearer YOUR_KEY", "Content-Type": "application/json" };
const { check_id } = await fetch(API, {
method: "POST", headers, body: JSON.stringify({ text })
}).then(r => r.json());
let report;
do {
await new Promise(res => setTimeout(res, 3000));
report = await fetch(`${API}${check_id}/`, { headers }).then(r => r.json());
} while (!["done", "failed"].includes(report.status));
Pricing
Identical to the site: 1 credit = 1,000 words scanned, rounded up per check; deep checks cost double. Credit packs are valid 365 days; subscriptions refill monthly and include the API at every level. No separate API tier, no per-seat fees. See plans and packs
Checks run asynchronously (real, rate-limited web retrieval takes 20-45 seconds) - poll the status endpoint rather than holding the connection open. HTTP 402 means insufficient credits; the response includes what the check would cost.