PhotoRestore

Descripción general

Esta app expone una pequeña API de tareas del mismo origen: sube una imagen, envía una tarea de restauración o escalado y luego consulta su resultado. Todavía no hay claves de API — cada solicitud está delimitada por la cookie de sesión de invitado de tu navegador.

URL base
/apiTodas las rutas a continuación son relativas a esta base del mismo origen — no hay un host de API independiente que configurar.
Autenticación
Con ámbito de sesión mediante una cookie httpOnly emitida al continuar como invitado. Todavía no existen claves de API (consulta "Planeado" abajo).

Garantía del contrato: el result_url de una tarea siempre es un image_url válido — puedes enviarlo directamente a /api/restore o /api/upscale para encadenar otra operación (así es exactamente como funciona "Escalar esta imagen" después de una restauración).

POST/api/uploads

Subir una imagen

Sube un único archivo de imagen y devuelve una URL de recurso del mismo origen que puedes pasar como image_url a Restaurar o Escalar.

Cuerpo de la solicitud

NombreTipoObligatorioLímitesDescripción
filebinary (multipart/form-data)El archivo de imagen, enviado como multipart/form-data.

Cuerpo de la respuesta

NombreTipoObligatorioLímitesDescripción
image_urlstringUna URL de recurso del mismo origen devuelta por una subida previa — la única forma de image_url aceptada.
bytesnumber0–9007199254740991El tamaño del archivo almacenado, en bytes.
mimestringEl tipo MIME detectado del archivo almacenado (autoritativo — no el tipo declarado por el cliente).

Ejemplo de respuesta 201

{
  "image_url": "/api/mock-assets/9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
  "bytes": 2458112,
  "mime": "image/jpeg"
}

Ejemplos de código

curl -X POST 'https://your-app.example.com/api/uploads' \
  -F "file=@photo.jpg"
POST/api/restore

Crear una tarea de restauración

Inicia una tarea de restauración asíncrona para una imagen subida previamente. Devuelve de inmediato una referencia de tarea en estado pending — consulta el progreso con GET /api/jobs/{job_id}.

Cuerpo de la solicitud

NombreTipoObligatorioLímitesDescripción
image_urlstring/api/mock-assets/<uuid>Una URL de recurso del mismo origen devuelta por una subida previa — la única forma de image_url aceptada.
user_hintstringNomax 300 charsUna nota de texto libre opcional que describe la foto, usada para orientar el paso de análisis simulado.
params.colorizebooleanObligatorio por compatibilidad de esquema. El valor se acepta, pero no selecciona un modo de procesamiento: la restauración es idéntica sea cual sea el valor.
params.resolutionunknown
params.variantunknown

Cuerpo de la respuesta

NombreTipoObligatorioLímitesDescripción
job_idstringjob_<uuid>El identificador único de esta tarea.
statuspending | processing | succeeded | failed | cancelledEl estado actual del ciclo de vida de la tarea.

Ejemplo de respuesta 202

{
  "job_id": "job_3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "status": "pending"
}

Ejemplos de código

curl -X POST 'https://your-app.example.com/api/restore' \
  -H 'Content-Type: application/json' \
  -d '{  "image_url": "/api/mock-assets/9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",  "user_hint": "the sky was blue",  "params": {    "colorize": true  }}'
POST/api/upscale

Crear una tarea de escalado

Inicia una tarea de escalado asíncrona para una imagen subida previamente, con el modo y la resolución objetivo solicitados. Devuelve de inmediato una referencia de tarea en estado pending.

Cuerpo de la solicitud

NombreTipoObligatorioLímitesDescripción
image_urlstring/api/mock-assets/<uuid>Una URL de recurso del mismo origen devuelta por una subida previa — la única forma de image_url aceptada.
user_hintstringNomax 300 charsUna nota de texto libre opcional que describe la foto, usada para orientar el paso de análisis simulado.
params.modefast | balanced | highEl equilibrio entre calidad y velocidad del escalado.
params.target_megapixelsnumber1–64La resolución de salida deseada, en megapíxeles.

Cuerpo de la respuesta

NombreTipoObligatorioLímitesDescripción
job_idstringjob_<uuid>El identificador único de esta tarea.
statuspending | processing | succeeded | failed | cancelledEl estado actual del ciclo de vida de la tarea.

Ejemplo de respuesta 202

{
  "job_id": "job_3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "status": "pending"
}

Ejemplos de código

curl -X POST 'https://your-app.example.com/api/upscale' \
  -H 'Content-Type: application/json' \
  -d '{  "image_url": "/api/mock-assets/9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",  "params": {    "mode": "fast",    "target_megapixels": 12  }}'
GET/api/jobs/{job_id}

Obtener el estado de la tarea

Devuelve el estado actual de una tarea: status, progress y — una vez succeeded — un result_url que puedes descargar o reenviar como un nuevo image_url.

Cuerpo de la respuesta

NombreTipoObligatorioLímitesDescripción
job_idstringjob_<uuid>El identificador único de esta tarea.
typerestore | upscaleQué herramienta creó esta tarea.
statuspending | processing | succeeded | failed | cancelledEl estado actual del ciclo de vida de la tarea.
progressnumber0–100Porcentaje completado, de 0 a 100.
result_urlstringNoPresente una vez que la tarea tiene éxito — una URL de recurso del mismo origen que también puede enviarse como un nuevo image_url.
result_urls.lightstring
result_urls.strongstringNo
before_urlstringNo
error.codeINVALID_REQUEST | UNSUPPORTED_FORMAT | FILE_TOO_LARGE | JOB_NOT_FOUND | VLM_FAILED | WORKFLOW_FAILED | TIMEOUT | CANCELLED | INTERNAL | INSUFFICIENT_CREDITS | STORAGE_QUOTA_EXCEEDEDEl motivo del fallo legible por máquina.
error.messagestringUn mensaje de fallo legible para humanos. Presente solo cuando status es failed.
created_atstringCuándo se creó la tarea, en formato ISO 8601.
updated_atstringCuándo se actualizó la tarea por última vez, en formato ISO 8601.

Ejemplo de respuesta 200

{
  "job_id": "job_3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "type": "restore",
  "status": "succeeded",
  "progress": 100,
  "result_url": "/api/mock-assets/6c1d3a2e-4f5b-4a1e-9c2d-1a2b3c4d5e6f",
  "created_at": "2026-08-03T10:15:00.000Z",
  "updated_at": "2026-08-03T10:15:42.000Z"
}

Ejemplos de código

curl -X GET 'https://your-app.example.com/api/jobs/job_3fa85f64-5717-4562-b3fc-2c963f66afa6'
POST/api/jobs/{job_id}/cancel

Cancelar una tarea

Solicita la cancelación de una tarea. Cancelar una tarea que ya está en un estado terminal no tiene efecto y devuelve su estado actual sin cambios.

Cuerpo de la respuesta

NombreTipoObligatorioLímitesDescripción
job_idstringjob_<uuid>El identificador único de esta tarea.
statuspending | processing | succeeded | failed | cancelledEl estado actual del ciclo de vida de la tarea.

Ejemplo de respuesta 202

{
  "job_id": "job_3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "status": "cancelled"
}

Ejemplos de código

curl -X POST 'https://your-app.example.com/api/jobs/job_3fa85f64-5717-4562-b3fc-2c963f66afa6/cancel'

Ciclo de vida del estado de la tarea

Cada tarea pasa por esta máquina de estados. pending y processing no son terminales; succeeded, failed y cancelled son terminales y nunca vuelven a cambiar.

pendingprocessingsucceededfailedcancelled

Si una tarea no alcanza un estado terminal dentro del plazo de consulta del cliente, se trata como un fallo TIMEOUT.

Códigos de error

Todos los errores usan este conjunto fijo de códigos. INVALID_REQUEST, UNSUPPORTED_FORMAT, FILE_TOO_LARGE y JOB_NOT_FOUND se devuelven como respuestas de error HTTP; el resto aparece como error.code dentro de un objeto de tarea una vez que esa tarea alcanza un estado terminal failed o cancelled.

CódigoDónde apareceSignificado
INVALID_REQUESTRespuesta de error HTTP 400Esta solicitud no es válida. Verifica tu información e inténtalo de nuevo.
UNSUPPORTED_FORMATRespuesta de error HTTP 415Este formato de archivo no es compatible. Usa JPEG, PNG, WebP, HEIC o HEIF.
FILE_TOO_LARGERespuesta de error HTTP 413Este archivo es demasiado grande. Usa una imagen más pequeña.
JOB_NOT_FOUNDRespuesta de error HTTP 404No pudimos encontrar este trabajo. Puede haber expirado.
VLM_FAILEDDentro del campo error de una tarea terminalNo pudimos analizar esta imagen. Inténtalo de nuevo.
WORKFLOW_FAILEDDentro del campo error de una tarea terminalEl procesamiento falló. Inténtalo de nuevo.
TIMEOUTDentro del campo error de una tarea terminalEsto está tardando más de lo esperado. Inténtalo de nuevo.
CANCELLEDDentro del campo error de una tarea terminalEste trabajo fue cancelado.
INTERNALRespuesta de error HTTP 500Algo salió mal de nuestro lado. Inténtalo de nuevo.
INSUFFICIENT_CREDITSRespuesta de error HTTP 402No tienes suficientes créditos para esta tarea. Recarga para continuar.
STORAGE_QUOTA_EXCEEDEDRespuesta de error HTTP 413Tu álbum está lleno. Elimina fotos o mejora tu plan para continuar.