RESTSpéc OpenAPI 3.0 · SDK Python + Node · v0.4.2

Logiciel anti-plagiat API REST et SDKs

Point d’accès REST prêt à l’emploi pour la détection de plagiat et d’IA. Spéc OpenAPI 3.0, SDK Python et Node, implémentation de référence Apache 2.0. Du premier curl jusqu’au volume avec webhook — même moteur qu’à noplag.com.

REST · OpenAPI 3.0SDK Python + NodeImplémentation réf. Apache 2.0
PREMIER APPEL

De zéro à un score de similarité avec un curl.

POST du texte, retour des intervalles scorés. Pas besoin de SDK, pas de compilation, pas de format propriétaire.

REQUÊTE · bashCopier
$ curl https://engine.noplag.app/v1/checks \    -H "Authorization: Bearer $NOPLAG_KEY" \    -H "Content-Type: application/json" \    -H "Idempotency-Key: $(uuidgen)" \    -d '{        "text": "The rain in Spain falls...",        "corpora": ["web", "academic"],        "ai_detection": true,        "webhook_url": "https://you.example/hook"    }'
RÉPONSE · 200 OK · application/jsonCopier
{  "check_id": "chk_01HX9R2Y4...",  "status": "complete",  "similarity_pct": 23.4,  "ai_score": 0.08,  "engine_commit": "v0.4.2",  "sources": [    { "url": "https://en.wikipedia...",      "matched_chars": 142,      "similarity_pct": 100.0 }  ]}
LES ENDPOINTS

Quatre endpoints. Un contrat. Versionné dans l’URL.

La même spécification OpenAPI 3.0 est disponible dans le dépôt open source et sur engine.noplag.app. Les SDK sont régénérés à partir de celle-ci à chaque version taguée.

POST/v1/checksSoumettre une vérificationSynchrone jusqu’à 8 s ; callback webhook au-delà. Idempotency-Key obligatoire.
GET/v1/checks/{id}Obtenir une vérificationRenvoie l'état du rapport le plus récent. Intervalles en streaming via Accept: text/event-stream.
GET/v1/sources/{id}Inspecter une sourceRésout une source par ID — URL complète, date du snapshot, cache ou live.
POST/v1/foldersGérer les dossiersCréer / lister / déplacer des vérifications. Limite la correspondance du corpus aux documents privés d’un dossier.
POST/v1/webhooksEnregistrer un webhookLivraisons signées HMAC ; reprise exponentielle sur 24 h ; rejouer chaque livraison depuis le dashboard.
Référence complète sur api./docsopenapi.yaml
AUTH + LIMITES

Jetons Bearer. Clés d’idempotence. En-têtes de limites honnêtes.

Rien d’exotique. Idiomes HTTP standards — suivis pour que vos middlewares de retry marchent déjà.

AUTHENTIFICATION

Jetons Bearer. Un en-tête, pas de danse de signature.

1.
Créer une cléDashboard → Paramètres → API. Clés limitées (lecture / écriture / admin) et rotatives en deux clics.
2.
L’ajouter à chaque appelAuthorization: Bearer nplg_live_…. Les clés test (nplg_test_) passent sur un sandbox qui ne conserve jamais les soumissions.
3.
Ajouter l’Idempotency-Key sur les POSTN’importe quel UUID fonctionne. Même clé + corps renvoient la réponse cachée pendant 24h ; aucun double-débit ou vérification en double avec les retries.
Authorization: Bearer nplg_live_a82f...Idempotency-Key: 0e8f9c44-...
LIMITES

Par clé, par minute. Les en-têtes indiquent exactement votre position.

NIVEAUREQ/MINMENSUELPIC
Gratuit10100 / mois20
Pro601 000 / mois120
Premium30010 000 / mois600
EntreprisePersonnal.NégociéPersonnal.
X-RateLimit-Limit: 60X-RateLimit-Remaining: 41X-RateLimit-Reset: 1747920480Retry-After: 19  (only on 429)
LES SDKS

Deux SDKs. Générés depuis la même spéc OpenAPI 3.0.

Python + Node générés à chaque version taguée du moteur. Autres langages (Go, Ruby, Java) générés depuis openapi.yaml — PRs bienvenus sur la communauté.

PYTHONpip install noplag
from noplag import Noplagclient = Noplag(api_key="nplg_live_…")report = client.checks.create(    text="...",    corpora=["web", "academic"],    ai_detection=True,)print(report.similarity_pct)
NODEnpm i @noplag/sdk
import Noplag from "@noplag/sdk";const client = new Noplag({    apiKey: process.env.NOPLAG_KEY,});const report = await client.checks.create({    text: "...",    corpora: ["web", "academic"],    aiDetection: true,});
<200mslatence p95
99,95%SLA de dispo
3régions (US/EU/AP)
OAPI 3format spec
Apache 2.0implémentation réf.
WEBHOOKS

Les vérifications longues vous rappellent. Reprise sans casse-tête.

01

Quatre types d’événement. Corps JSON. Signature HMAC-SHA256 dans l’en-tête.

check.completedRapport prêt · JSON du rapport inclus
check.failedÉchec définitif · inclut code erreur + conseils retry
check.progressProgression intermédiaire · sources résolues à ce stade
folder.sharedAccès dossier accordé à un collègue ou auditeur externe
02

Reprise exponentielle sur 24 heures. Rejouable depuis le dashboard.

Courbe de retry5s, 30s, 2m, 10m, 1h, 6h, 24h — ensuite dead-letter
Timeout10s pour se connecter, 30s max par tentative
Critères de succèsRéponse HTTP 2xx dans le délai ; suivons les redirections
UI de replayRejouez depuis le dashboard vers une URL différente
03

Vérifiez la signature. Rejetez tout ce qui ne colle pas.

Chaque livraison porte un X-Noplag-Signature : t=<unix>,v1=<hex>. Calculez le HMAC-SHA256 sur timestamp + corps avec votre secret webhook et comparez en temps constant.

h = hmac.new(secret,    f"{t}.{body}".encode(),    hashlib.sha256).hexdigest()assert hmac.compare_digest(h, v1)
PRINCIPES DEV

On suit HTTP. Voilà tout le doc d’API.

Idempotence sur POST. Version dans l’URL. Les erreurs incluent la marche à suivre. Les en-têtes affichent votre place dans la fenêtre de limite. Pagination par curseur, pas par offset. Horodates en UTC ISO 8601. Pas de dialecte HATEOAS maison, pas de 200 OK sur erreur, pas d’OAuth pour du serveur/serveur. Le doc d’API c’est RFC 9110 et OpenAPI 3.0 — il n’y a pas de « manière Noplag » à apprendre.

Lire les notes de conception
CONTRAINTES DESIGN
IDEMPIdempotency-Key + corps identique sous 24 h : même réponse cachée. Retry sur panne réseau, même clé — pas de double-débit ni doublon.
VERVersion majeure dans l’URL (/v1, /v2). Changement breaking = nouvelle version, ancienne supportée 12 mois après annonce.
ERRJSON RFC 9457 problem-details pour chaque 4xx/5xx. type, title, detail, instance + un noplag.retry_strategy.
PAGPar curseur sur tout endpoint liste. ?limit=100&cursor=… rend next_cursor dans le body. Pas de saut d’offset à la page 47 si de nouvelles lignes arrivent.
OBSRéponse inclut X-Engine-Commit, X-Request-Id et Server-Timing à chaque étape. Relancez toute vérification par ID ; le rapport lie vers la version exacte du moteur.
OPENImplémentation de référence Apache 2.0 sur github.com/NoplagLabs/noplag-engine. Hébergez l’appel vous-même si vos données ne peuvent pas sortir de votre réseau — même interface API.
FAQ

Les vraies questions posées par nos équipes intégration.

Quelle latence d'appel pour un document typique ?
p50 autour de 600 ms pour une vérification de 500 mots sur le corpus indexé ; p95 environ 1,8 s. Ajouter environ 2 s si Layer W (vérification web en direct) est activé — cela implique un aller-retour via Google et Brave. Pour les documents longs (plus de 8 s de traitement attendu), un check_id est renvoyé immédiatement et le rappel se fait via webhook.
Comment la tarification s’applique-t-elle à l’API ?
Un appel facturé par POST sur /v1/checks, quel que soit la taille du document jusqu’au plafond du forfait (1 500 mots Pro, 50 000 Premium, personnalisé Entreprise). Tries idempotents avec la même Idempotency-Key + corps sous 24 h non comptés en double. Lecture /v1/checks/{id} et SDK auxiliaires gratuits.
Puis-je auto-héberger l’API ?
Oui — github.com/NoplagLabs/noplag-engine est la même implémentation de référence Apache 2.0 que celle utilisée sur engine.noplag.app. docker compose up vous donne un endpoint local /v1/checks. La version cloud ajoute le corpus géré et les clés API Google/Brave ; pour l’auto-hébergement complet, fournissez vos propres clés.
Existe-t-il un header retry de limite fiable ?
Sur 429, on rend Retry-After en secondes. Les en-têtes X-RateLimit-* sont sur chaque réponse — vous pouvez prélimiter avec X-RateLimit-Remaining sans attendre un 429. Les deux sont exacts, stables entre déploiements.
Quel rythme pour la sortie SDK ?
Python et Node SDKs générés auto depuis openapi.yaml à chaque tag du moteur. Majeur (v0.x → v0.y) = SDK même jour. Correctifs patch = même semaine. Les deux suivent semver ; peu de breaking sur l’API sous-jacente hors migration /v1 → /v2.
Que se passe-t-il si le corpus change en cours de mois ?
Chaque vérification tamponne X-Engine-Commit et un horodatage snapshot du corpus. Relancer une ancienne vérif sur le corpus récent = un paramètre (?corpus_snapshot=…). Le rapport d’origine reste conservé — aucun score modifié a posteriori.
Comment tester sans consommer mon quota mensuel ?
Les clés test (nplg_test_…) passent sur un sandbox : API complète, rien conservé, aucun impact sur votre quota ou limites. Webhooks tirent aussi depuis le sandbox, donc tests complets gratuits.
Quelle méthode correcte pour du bulk ?
Soumettre en parallèle jusqu’à votre limite — il n’y a pas d’endpoint batch par choix (un lot de 500 qui échoue sur le 312e est pire que 500 appels isolés). Pour gros volumes, combinez API et webhooks : soumettre, récupérer check_id, enchaîner 200 soumissions, traiter à réception.
Puis-je limiter un check à mes seuls dossiers ?
Oui — corpora: [] avec folder_id dans le body cible seulement les dossiers privés utilisateur. À combiner avec corpora: ["academic"] pour “only academic + mes dossiers”. Scope par requête ; pas de forfait séparé.
Qu’est-ce qui change pour résidence UE ou on-prem ?
Niveau Entreprise = endpoint dédié résidence UE (api.eu.noplag.com) même surface OpenAPI, aucune donnée hors EEE. Ou auto-hébergez toute la référence dans votre VPC — même moteur, même /v1, rien ne sort. (On relance en open-core ; SOC 2 et attestations formelles sur la roadmap, pas encore. On fournit le moteur auditable en attendant.)

Obtenez votre clé API. Faites votre premier appel.

Essai gratuit avec 100 appels API. Forfait Pro 23 $/mois pour 1 000. Référence Apache 2.0 si vous préférez garder les appels internes.

Logiciel anti-plagiat API REST, OpenAPI 3.0, SDKs