PhotoRestore

Tổng quan

Ứng dụng này cung cấp một API tác vụ nhỏ, cùng nguồn: tải lên ảnh, gửi tác vụ phục hồi hoặc nâng cấp, rồi theo dõi kết quả. Chưa có khóa API — mọi yêu cầu được giới hạn theo cookie phiên khách của trình duyệt bạn.

URL gốc
/apiMọi đường dẫn bên dưới đều tương đối so với URL gốc cùng nguồn này — không có máy chủ API riêng nào cần cấu hình.
Xác thực
Giới hạn theo phiên qua cookie httpOnly được cấp khi tiếp tục với tư cách khách. Chưa có khóa API nào tồn tại (xem mục "Kế hoạch" bên dưới).

Cam kết hợp đồng: result_url của một tác vụ luôn là một image_url hợp lệ — bạn có thể gửi trực tiếp nó tới /api/restore hoặc /api/upscale để nối tiếp một thao tác khác (đây chính xác là cách "Nâng cấp ảnh này" hoạt động sau khi Phục hồi).

POST/api/uploads

Tải lên một ảnh

Tải lên một tệp ảnh duy nhất và trả về URL tài nguyên cùng nguồn mà bạn có thể dùng làm image_url cho Phục hồi hoặc Nâng cấp.

Nội dung yêu cầu

TênKiểuBắt buộcGiới hạnMô tả
filebinary (multipart/form-data)Tệp ảnh, được gửi dưới dạng multipart/form-data.

Nội dung phản hồi

TênKiểuBắt buộcGiới hạnMô tả
image_urlstringURL tài nguyên cùng nguồn được trả về từ một lần tải lên trước đó — hình dạng image_url duy nhất được chấp nhận.
bytesnumber0–9007199254740991Kích thước tệp đã lưu, tính bằng byte.
mimestringKiểu MIME được nhận diện của tệp đã lưu (có giá trị quyết định — không phải kiểu do client khai báo).

Ví dụ phản hồi 201

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

Mẫu mã

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

Tạo tác vụ phục hồi

Bắt đầu một tác vụ phục hồi bất đồng bộ cho ảnh đã tải lên trước đó. Trả về ngay một tham chiếu tác vụ ở trạng thái pending — theo dõi tiến trình bằng GET /api/jobs/{job_id}.

Nội dung yêu cầu

TênKiểuBắt buộcGiới hạnMô tả
image_urlstring/api/mock-assets/<uuid>URL tài nguyên cùng nguồn được trả về từ một lần tải lên trước đó — hình dạng image_url duy nhất được chấp nhận.
user_hintstringKhôngmax 300 charsMột ghi chú văn bản tùy chọn mô tả ảnh, dùng để định hướng bước phân tích giả lập.
params.colorizebooleanBắt buộc để tương thích lược đồ. Giá trị được chấp nhận nhưng không chọn chế độ xử lý — tiến trình phục hồi là như nhau với mọi giá trị.
params.resolutionunknown
params.variantunknown

Nội dung phản hồi

TênKiểuBắt buộcGiới hạnMô tả
job_idstringjob_<uuid>Định danh duy nhất của tác vụ này.
statuspending | processing | succeeded | failed | cancelledTrạng thái vòng đời hiện tại của tác vụ.

Ví dụ phản hồi 202

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

Mẫu mã

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

Tạo tác vụ nâng cấp

Bắt đầu một tác vụ nâng cấp bất đồng bộ cho ảnh đã tải lên trước đó, theo chế độ và độ phân giải mục tiêu yêu cầu. Trả về ngay một tham chiếu tác vụ ở trạng thái pending.

Nội dung yêu cầu

TênKiểuBắt buộcGiới hạnMô tả
image_urlstring/api/mock-assets/<uuid>URL tài nguyên cùng nguồn được trả về từ một lần tải lên trước đó — hình dạng image_url duy nhất được chấp nhận.
user_hintstringKhôngmax 300 charsMột ghi chú văn bản tùy chọn mô tả ảnh, dùng để định hướng bước phân tích giả lập.
params.modefast | balanced | highSự đánh đổi giữa chất lượng và tốc độ khi nâng cấp.
params.target_megapixelsnumber1–64Độ phân giải đầu ra mong muốn, tính bằng megapixel.

Nội dung phản hồi

TênKiểuBắt buộcGiới hạnMô tả
job_idstringjob_<uuid>Định danh duy nhất của tác vụ này.
statuspending | processing | succeeded | failed | cancelledTrạng thái vòng đời hiện tại của tác vụ.

Ví dụ phản hồi 202

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

Mẫu mã

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}

Lấy trạng thái tác vụ

Trả về trạng thái hiện tại của một tác vụ: status, progress, và — khi succeeded — một result_url bạn có thể tải xuống hoặc gửi lại như một image_url mới.

Nội dung phản hồi

TênKiểuBắt buộcGiới hạnMô tả
job_idstringjob_<uuid>Định danh duy nhất của tác vụ này.
typerestore | upscaleCông cụ nào đã tạo ra tác vụ này.
statuspending | processing | succeeded | failed | cancelledTrạng thái vòng đời hiện tại của tác vụ.
progressnumber0–100Phần trăm hoàn thành, từ 0–100.
result_urlstringKhôngXuất hiện khi tác vụ thành công — một URL tài nguyên cùng nguồn cũng có thể được gửi lại như một image_url mới.
result_urls.lightstring
result_urls.strongstringKhông
before_urlstringKhông
error.codeINVALID_REQUEST | UNSUPPORTED_FORMAT | FILE_TOO_LARGE | JOB_NOT_FOUND | VLM_FAILED | WORKFLOW_FAILED | TIMEOUT | CANCELLED | INTERNAL | INSUFFICIENT_CREDITS | STORAGE_QUOTA_EXCEEDEDLý do thất bại có thể đọc bằng máy.
error.messagestringThông báo thất bại dễ đọc cho con người. Chỉ xuất hiện khi status là failed.
created_atstringThời điểm tác vụ được tạo, theo định dạng ISO 8601.
updated_atstringThời điểm tác vụ được cập nhật lần cuối, theo định dạng ISO 8601.

Ví dụ phản hồi 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"
}

Mẫu mã

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

Hủy tác vụ

Yêu cầu hủy một tác vụ. Hủy một tác vụ đã ở trạng thái cuối là một thao tác không tác dụng, trả về trạng thái hiện tại không đổi.

Nội dung phản hồi

TênKiểuBắt buộcGiới hạnMô tả
job_idstringjob_<uuid>Định danh duy nhất của tác vụ này.
statuspending | processing | succeeded | failed | cancelledTrạng thái vòng đời hiện tại của tác vụ.

Ví dụ phản hồi 202

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

Mẫu mã

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

Vòng đời trạng thái tác vụ

Mỗi tác vụ đi qua cỗ máy trạng thái này. pending và processing là trạng thái chưa kết thúc; succeeded, failed và cancelled là trạng thái cuối và không bao giờ thay đổi nữa.

pendingprocessingsucceededfailedcancelled

Nếu một tác vụ không đạt trạng thái cuối trong thời hạn theo dõi của client, nó được xem là thất bại TIMEOUT.

Mã lỗi

Mọi lỗi đều dùng bộ mã cố định này. INVALID_REQUEST, UNSUPPORTED_FORMAT, FILE_TOO_LARGE và JOB_NOT_FOUND được trả về dưới dạng phản hồi lỗi HTTP; các mã còn lại xuất hiện dưới dạng error.code bên trong đối tượng tác vụ khi tác vụ đó đạt trạng thái cuối failed hoặc cancelled.

Xuất hiện ở đâuÝ nghĩa
INVALID_REQUESTPhản hồi lỗi HTTP 400Yêu cầu này không hợp lệ. Vui lòng kiểm tra thông tin nhập và thử lại.
UNSUPPORTED_FORMATPhản hồi lỗi HTTP 415Định dạng tệp này không được hỗ trợ. Vui lòng dùng JPEG, PNG, WebP, HEIC hoặc HEIF.
FILE_TOO_LARGEPhản hồi lỗi HTTP 413Tệp này quá lớn. Vui lòng dùng ảnh nhỏ hơn.
JOB_NOT_FOUNDPhản hồi lỗi HTTP 404Chúng tôi không tìm thấy công việc này. Có thể nó đã hết hạn.
VLM_FAILEDBên trong trường error của một tác vụ ở trạng thái cuốiChúng tôi không thể phân tích ảnh này. Vui lòng thử lại.
WORKFLOW_FAILEDBên trong trường error của một tác vụ ở trạng thái cuốiXử lý thất bại. Vui lòng thử lại.
TIMEOUTBên trong trường error của một tác vụ ở trạng thái cuốiViệc này đang mất nhiều thời gian hơn dự kiến. Vui lòng thử lại.
CANCELLEDBên trong trường error của một tác vụ ở trạng thái cuốiCông việc này đã bị hủy.
INTERNALPhản hồi lỗi HTTP 500Đã xảy ra sự cố ở phía chúng tôi. Vui lòng thử lại.
INSUFFICIENT_CREDITSPhản hồi lỗi HTTP 402Bạn không có đủ tín dụng cho công việc này. Nạp thêm để tiếp tục.
STORAGE_QUOTA_EXCEEDEDPhản hồi lỗi HTTP 413Album của bạn đã đầy. Hãy xóa bớt ảnh hoặc nâng cấp để tiếp tục.