RESTEspecificación OpenAPI 3.0 · SDKs de Python + Node · v0.4.2

Detector de plagio API y REST

Endpoint REST adaptable para detectar plagio + IA. Especificación OpenAPI 3.0, SDKs para Python y Node, implementación de referencia Apache 2.0. Desde su primer curl hasta cargas con webhooks — mismo motor que opera en noplag.com.

REST · OpenAPI 3.0SDKs Python + NodeImpl. referencia Apache 2.0
LA PRIMERA LLAMADA

De cero a un puntaje de similitud con un curl.

POST de texto, devuelve intervalos puntuados. No requiere SDK, ni compilación, ni formato propietario.

SOLICITUD · bashCopiar
$ 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"    }'
RESPUESTA · 200 OK · application/jsonCopiar
{  "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 }  ]}
LOS ENDPOINTS

Cuatro endpoints. Un contrato. Versionado en la URL.

La misma especificación OpenAPI 3.0 se encuentra tanto en el repositorio open source como en engine.noplag.app. Los SDK se regeneran a partir de ella en cada versión etiquetada.

POST/v1/checksEnviar una comprobaciónSincrónico hasta 8s; callback por webhook por encima de eso. Requiere Idempotency-Key.
GET/v1/checks/{id}Consultar una comprobaciónDevuelve el último estado del informe. Intervalos disponibles en streaming vía Accept: text/event-stream.
GET/v1/sources/{id}Inspeccionar una fuenteResuelve la fuente coincidente por ID — URL completa, fecha del snapshot, origen: caché o en vivo.
POST/v1/foldersGestionar carpetasCrear / listar / mover comprobaciones. Limita coincidencias de corpus a documentos privados por carpeta.
POST/v1/webhooksRegistrar un webhookEntregas firmadas por HMAC; reintentos exponenciales durante 24h; repita cualquier entrega desde el panel.
Referencia completa en api./docsopenapi.yaml
AUTENTICACIÓN + LÍMITES

Tokens Bearer. Claves de idempotencia. Cabeceras de límite directas.

Sin rarezas. Estándares HTTP — seguimos los mismos para que su middleware de reintentos funcione.

AUTENTICACIÓN

Tokens Bearer. Una cabecera, sin complicaciones.

1.
Crear una clavePanel → Configuración → API. Claves con scopes (lectura / escritura / admin) y rotación en dos clics.
2.
Inclúyala en cada llamadaAuthorization: Bearer nplg_live_…. Claves de prueba (nplg_test_) acceden a un sandbox que nunca guarda envíos.
3.
Agregue Idempotency-Key en POSTCualquier UUID sirve. La misma clave + cuerpo da la respuesta en caché por 24h, sin recargos ni revisiones duplicadas por reintentos.
Authorization: Bearer nplg_live_a82f...Idempotency-Key: 0e8f9c44-...
LÍMITES DE USO

Por clave, por minuto. Las cabeceras indican su estado exacto.

NIVELSOL/MINMENSUALPEAK
Free10100 / mes20
Pro601.000 / mes120
Premium30010.000 / mes600
EnterpriseA medidaNegociadoA medida
X-RateLimit-Limit: 60X-RateLimit-Remaining: 41X-RateLimit-Reset: 1747920480Retry-After: 19  (only on 429)
LOS SDKS

Dos SDKs. Generados desde la misma espec OpenAPI 3.0.

Python + Node se publican en cada lanzamiento del motor. Otros lenguajes (Go, Ruby, Java) se generan desde openapi.yaml — PRs de la comunidad son bienvenidos.

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,});
<200mslatencia p95
99,95%SLA uptime
3regiones (US/EU/AP)
OAPI 3formato espec
Apache 2.0impl. referencia
WEBHOOKS

Comprobaciones largas le devuelven la llamada. Reintentos sin perder el control.

01

Cuatro tipos de eventos. Cuerpo JSON. Firma HMAC-SHA256 en la cabecera.

check.completedInforme listo · incluye el JSON completo
check.failedFallo permanente · incluye código y consejo de reintento
check.progressProgreso intermedio · fuentes resueltas hasta el momento
folder.sharedAcceso a carpeta otorgado a un colega o auditor externo
02

Reintentos exponenciales por 24 horas. Replicable desde el panel.

Curva de reintentos5s, 30s, 2m, 10m, 1h, 6h, 24h — luego dead-letter
Timeout10s conexión, 30s total por intento
Criterio éxitoRespuesta HTTP 2xx en tiempo; seguimos redirecciones
UI de repeticiónSeleccione cualquier entrega en el panel y reenvíe a otra URL
03

Compruebe la firma. Rechace lo que no coincida.

Cada entrega lleva X-Noplag-Signature: t=<unix>,v1=<hex>. Genere HMAC-SHA256 sobre timestamp + body con su secreto de webhook y compare en tiempo constante.

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

Seguimos HTTP. Así se diseñó toda la API.

POST idempotente. Versionado en la URL. Errores que indican el siguiente paso. Cabeceras que informan el estado exacto del límite. Paginación por cursor, nunca por offset. Tiempos en UTC ISO 8601. Sin dialecto HATEOAS propio, sin responder 200 OK en errores, ni exigir OAuth para llamadas servidor-a-servidor. El documento de diseño es el RFC 9110 + OpenAPI 3.0 — no hay un “camino Noplag” que deba aprender.

Lea las notas de diseño
RESTRICCIONES DE DISEÑO
IDEMPLa misma Idempotency-Key + cuerpo en 24h devuelve la respuesta en caché. Reintente por error de red usando la misma clave — sin doble cobro ni chequeos duplicados.
VERVersión mayor en la URL (/v1, /v2). Cambios incompatibles requieren nuevo path de versión — la vieja versión sigue 12 meses tras anunciar.
ERRJSON problem-details RFC 9457 para cada 4xx/5xx. type, title, detail, instance y una pista noplag.retry_strategy.
PAGSiempre por cursor en los endpoints de lista. ?limit=100&cursor=… devuelve next_cursor en el cuerpo. Sin sorpresas de offset cuando llegan filas nuevas en paginación larga.
OBSLa respuesta incluye X-Engine-Commit, X-Request-Id y Server-Timing por etapa. Puede repetir cualquier comprobación por ID; el informe enlaza al release exacto del motor.
OPENImplementación de referencia Apache 2.0 en github.com/NoplagLabs/noplag-engine. Puede autoalojar la llamada si sus datos no pueden salir de su red; la API es la misma.
FAQ

Preguntas de verdad de los integradores.

¿Qué latencia tiene la llamada con un documento típico?
p50 de aproximadamente 600 ms para una revisión de 500 palabras contra el corpus indexado; p95 ~1,8 s. Añade ~2 s si Layer W (verificación web en vivo) está activado — ese proceso consulta Google y Brave. Para documentos largos (más de 8 s de procesamiento esperado), se devuelve un check_id de inmediato y se notifica el resultado por webhook.
¿Cómo se mide la facturación en la API?
Un cargo por cada envío a /v1/checks, sin importar tamaño de documento hasta el límite por plan (1.500 palabras Pro, 50.000 Premium, Enterprise personalizado). Reintentos con la misma Idempotency-Key + cuerpo en 24h no suman doble. Lecturas a /v1/checks/{id} y llamadas auxiliares del SDK son gratis.
¿Se puede auto-hospedar la API?
Sí — github.com/NoplagLabs/noplag-engine es la misma implementación de referencia bajo Apache 2.0 que se ejecuta en engine.noplag.app. Con docker compose up obtienes un endpoint local /v1/checks. La versión en la nube añade el corpus gestionado y las claves API de Google/Brave; para autohospedaje completo, debes aportar tus propias claves.
¿Existe cabecera de retry para límites de uso en la que pueda confiar?
Al 429 devolvemos Retry-After en segundos. Las X-RateLimit-* van en cada respuesta — puede auto-regular con X-RateLimit-Remaining sin esperar el 429. Ambas son precisas y estables en despliegues.
¿Cada cuánto salen los SDKs?
SDKs de Python y Node se actualizan automáticamente desde openapi.yaml con cada etiqueta del engine. Releases mayores (v0.x → v0.y) salen el mismo día para cada SDK. Parches salen en la misma semana. Mantienen semver; la ruptura solo ocurre en /v1 → /v2.
¿Qué pasa si el corpus cambia durante el mes?
Cada comprobación sella X-Engine-Commit y timestamp del corpus. Para repetir una comprobación vieja contra el corpus actual basta un parámetro (?corpus_snapshot=…). El informe original queda preservado con su snapshot — nunca modificamos un puntaje original ya entregado.
¿Cómo pruebo sin gastar la cuota mensual?
Keys de prueba (nplg_test_…) van a un sandbox: toda la superficie del API, nunca se guarda el envío, ni cuenta para el límite mensual ni rate limits. Webhooks también disparan desde el sandbox, así que puede hacer pruebas end-to-end gratis.
¿Cuál es la forma correcta para chequear en lote?
Envíe en paralelo hasta su límite — no hay endpoint batch por diseño (un lote de 500 que falla en el doc 312 es peor que 500 llamadas independientes). Para volúmenes altos use webhooks: envíe, reciba check_id inmediatamente, haga los 200 siguientes, maneje los resultados según vayan llegando.
¿Puedo limitar la búsqueda a solo mis carpetas?
Sí — corpora: [] con folder_id en el cuerpo busca solo en carpetas privadas. Combínelo con corpora: ["academic"] para "solo academic + mis carpetas". Se configura por llamada; no requiere pago aparte.
¿Qué cambia para residencia UE o setup on-prem?
En Enterprise se crea endpoint dedicado UE (api.eu.noplag.com) con misma superficie OpenAPI, así los datos personales se mantienen en EEE. O puede auto-hospedar con la referencia dentro de su VPC — mismo motor, mismo contrato /v1, nada sale de su red. (Estamos relanzando open-core; auditorías oficiales como SOC 2 están en el plan, todavía no terminadas — lo que ofrecemos es el motor auditable mientras tanto.)

Consiga una clave API. Haga su primera llamada.

Prueba gratis incluye 100 llamadas. Pro $23/mes para 1.000. Implemente Apache 2.0 en su red si prefiere mantener todo interno.

Detector de plagio API, REST y OpenAPI 3.0