Saltar al contenido

Documentación de la API

Toda la documentación está generada directamente a partir de las definiciones que ejecuta el motor de procesamiento.

Especificación OpenAPI para integración automática: /api/v1/openapi.json

Autenticación

Envía tu clave de API en cualquiera de las dos cabeceras aceptadas. Ambas son equivalentes.

Authorization: Bearer nmd_live_xxxxxxxxxxxxxxxx
X-API-Key: nmd_live_xxxxxxxxxxxxxxxx

Las claves se generan en tu panel de control. Cada clave se muestra una sola vez y se almacena únicamente en formato hash.

POST /api/v1/analyze

Lee cada campo de metadatos en el archivo y devuelve el modelo normalizado.

curl -X POST https://your-domain/api/v1/analyze \
  -H "Authorization: Bearer $NMD_KEY" \
  -F "file=@photo.jpg"

La respuesta agrupa los campos por categoría y conserva los valores originales sin traducir bajo raw:

{
  "file": { "name": "photo.jpg", "format": "jpeg", "size": 4821904 },
  "counts": { "total": 31, "removable": 26, "sensitive": 16 },
  "blocks": { "exif": { "present": true, "count": 29 }, "gps": { "present": true } },
  "metadata": {
    "camera": {
      "camera.make": { "label": "Make", "value": "Apple", "sensitive": true, "removable": true }
    }
  }
}

POST /api/v1/clean

Elimina metadatos y reexamina los bytes generados para verificar el resultado. Devuelve el archivo limpio o el informe en JSON con <code>response=json</code>.

ParámetroValoresPor defecto
modequick, fullquick
keepCopyright0, 10
keepColorProfile0, 1quick: 1, full: 0
keepOrientation0, 1quick: 1, full: 0
removeC2pa0, 10
responsefile, jsonfile
curl -X POST https://your-domain/api/v1/clean \
  -H "Authorization: Bearer $NMD_KEY" \
  -F "file=@video.mp4" -F "mode=full" -OJ

removeC2pa está desactivado por defecto. La limpieza normal de metadatos nunca suprime las credenciales C2PA salvo petición explícita.

Al descargar el archivo, en la cabecera X-NoMoreData-Result viaja codificado en URL un resumen del informe de verificación: los valores escalares literales — verified es true solo cuando el reanálisis no encontró restos inesperados — y cada lista como un recuento, removedCount, residualCount, etc. Siempre se decodifica y se analiza. Para las listas, pide response=json.

POST /api/v1/edit

Aplica modificaciones a campos concretos. Enviar <code>value: null</code> elimina el campo seleccionado.

ParámetroValoresPor defecto
editsJSON array of {key, value}required
replaceAll0, 10
removeC2pa0, 10
responsefile, jsonfile

replaceAll suprime los bloques de metadatos existentes pero no afecta a Content Credentials C2PA a menos que se especifique.

curl -X POST https://your-domain/api/v1/edit \
  -H "Authorization: Bearer $NMD_KEY" \
  -F "file=@photo.jpg" \
  -F 'edits=[{"key":"camera.make","value":"Canon"},{"key":"location.latitude","value":null}]' \
  -F "response=json"

POST /api/v1/apply-profile

Aplica un conjunto coherente de campos característicos de un modelo de dispositivo.

curl -X POST https://your-domain/api/v1/apply-profile \
  -H "Authorization: Bearer $NMD_KEY" \
  -F "file=@photo.jpg" -F "profile=canon-eos-r5" -F "iso=400"

La aplicación de un perfil escribe metadatos típicos de un dispositivo pero no constituye prueba legal de que el archivo fue capturado por dicho equipo.

Ejemplos en otros lenguajes

JavaScript

const body = new FormData();
body.append('file', file);           // a File or Blob
body.append('mode', 'full');
body.append('response', 'json');

const res = await fetch('https://your-domain/api/v1/clean', {
  method: 'POST',
  headers: { Authorization: `Bearer ${process.env.NMD_KEY}` },
  body,
});

const report = await res.json();
console.log(report.verified, report.removed.length);

Python

import os, requests

with open("photo.jpg", "rb") as fh:
    response = requests.post(
        "https://your-domain/api/v1/clean",
        headers={"Authorization": f"Bearer {os.environ['NMD_KEY']}"},
        files={"file": fh},
        data={"mode": "full", "response": "json"},
    )

report = response.json()
print(report["verified"], len(report["removed"]))

Gestión de errores

Todos los errores comparten una estructura estándar y predecible.

{ "error": { "code": "unsupported_format", "message": "GIF is not supported.", "hint": "..." } }
CódigoEstado HTTPSignificado
missing_api_key401No se facilitó ninguna clave de API.
invalid_api_key401La clave es desconocida, ha sido revocada o es inválida.
plan_required403Tu plan actual no incluye acceso a la API.
missing_file400No se adjuntó ningún archivo en la petición multipart.
invalid_request400Parámetro ausente o con formato incorrecto.
file_too_large413El archivo supera el tamaño máximo permitido por tu plan.
unsupported_format415El formato de archivo no es compatible.
corrupt_file422No se pudo procesar el archivo: datos corruptos o ilegibles.
unsupported_operation422Archivo válido, pero la operación no está disponible para este formato.
rate_limited429Demasiadas peticiones en un corto periodo de tiempo.
quota_exceeded429Has agotado la cuota mensual de llamadas de tu plan.

Límites de velocidad y cuotas

Se aplican dos controles: un límite por IP para proteger el servicio y la cuota mensual contratada en tu suscripción.

X-RateLimit-Limit: 2000
X-RateLimit-Remaining: 1834
X-RateLimit-Reset: 1767225600

Superar la cuota devuelve HTTP 429 con código quota_exceeded y cabecera Retry-After.

Formatos compatibles

FormatoAnalizarLimpiarEditar
JPEGsísísí
PNGsísísí
WebPsísísí
HEIC/HEIFsísísí
AVIFsísísí
MP4sísísí
QuickTime MOVsísísí
WebMsísíno
PDFsísísí
MP3sísísí
WAVsísísí
M4Asísísí

Solicitar una acción no admitida devuelve 422 unsupported_operation.

Campos editables (28)

Claves aceptadas por /api/v1/edit.

ClaveCampo
camera.makeMake
camera.modelModel
camera.lensMakeLens make
camera.lensModelLens model
camera.serialNumberBody serial number
camera.lensSerialNumberLens serial number
capture.isoISO
capture.exposureTimeExposure time
capture.fNumberAperture (f-number)
capture.focalLengthFocal length
capture.focalLength35mmFocal length (35 mm equiv.)
capture.exposureBiasExposure compensation
capture.exposureProgramExposure program
capture.meteringModeMetering mode
capture.whiteBalanceWhite balance
capture.flashFlash
capture.colorSpaceColour space
capture.orientationOrientation
date.originalDate taken
date.digitizedDate digitised
date.modifiedFile change date
general.softwareSoftware
general.artistArtist
general.copyrightCopyright
general.descriptionImage description
location.latitudeLatitude
location.longitudeLongitude
location.altitudeAltitude

Tratamiento de archivos en la API

Los archivos enviados a la API se procesan únicamente en memoria volátil durante la solicitud y se descartan inmediatamente tras devolver la respuesta.

Para máxima confidencialidad, el procesamiento directo en el navegador web sigue siendo la vía recomendada.