Resize, crop, rotate, flip, trim, pad, deskew, and adjust image geometry.
resize
crop
rotate
flip
mirror
deskew
straighten
trim
pad
extend_canvas
change_dimensions
Responsive asset generation
Thumbnail pipelines
Image normalization for ML inputs
Todos los puntos finales de procesamiento ImageHQ son asíncronos. Tras un POST exitoso, recibirá un 202 Acceptedrespuesta con un job_id. Sondear el punto final de estado hasta que alcance el estado succeeded.
Ejemplo de solicitud
import requests
url = "https://api.imagehq.io/transform"
payload = {
"tool_slug": "resize-image",
"operations": [
{
"type": "resize",
"width": 1200,
"mode": "fit"
}
],
"output_format": "same_as_input"
}
files = [("files[]", open("image.png", "rb"))]
data = {"request": json.dumps(payload)}
response = requests.post(url, files=files, data=data)
print(response.json())const form = new FormData();
form.append("files[]", file);
form.append("request", JSON.stringify({
"tool_slug": "resize-image",
"operations": [
{
"type": "resize",
"width": 1200,
"mode": "fit"
}
],
"output_format": "same_as_input"
}));
const response = await fetch("https://api.imagehq.io/transform", {
method: "POST",
headers: { "Idempotency-Key": crypto.randomUUID() },
body: form
});
const data = await response.json();
console.log(data);const form = new FormData();
form.append("files[]", file);
form.append("request", JSON.stringify({
"tool_slug": "resize-image",
"operations": [
{
"type": "resize",
"width": 1200,
"mode": "fit"
}
],
"output_format": "same_as_input"
}));
const response = await fetch("https://api.imagehq.io/transform", {
method: "POST",
headers: { "Idempotency-Key": crypto.randomUUID() },
body: form
});
const data = await response.json();
console.log(data);curl -X POST "https://api.imagehq.io/transform" \
-H "Idempotency-Key: $(uuidgen)" \
-F "files[]=@image.png" \
-F 'request={"tool_slug":"resize-image","operations":[{"type":"resize","width":1200,"mode":"fit"}],"output_format":"same_as_input"}'$client = new GuzzleHttp\Client();
$response = $client->post("https://api.imagehq.io/transform", [
"multipart" => [
["name" => "files[]", "contents" => fopen("image.png", "r")],
["name" => "request", "contents" => '{"tool_slug":"resize-image","operations":[{"type":"resize","width":1200,"mode":"fit"}],"output_format":"same_as_input"}']
]
]);require "faraday"
response = Faraday.post("https://api.imagehq.io/transform") do |req|
req.headers["Idempotency-Key"] = SecureRandom.uuid
req.body = { "files[]" => Faraday::UploadIO.new("image.png", "image/png"), "request" => '{"tool_slug":"resize-image","operations":[{"type":"resize","width":1200,"mode":"fit"}],"output_format":"same_as_input"}' }
endbody := &bytes.Buffer{}
writer := multipart.NewWriter(body)
writer.WriteField("request", `{"tool_slug":"resize-image","operations":[{"type":"resize","width":1200,"mode":"fit"}],"output_format":"same_as_input"}`)
file, _ := writer.CreateFormFile("files[]", "image.png")
_ = file
writer.Close()
http.Post("https://api.imagehq.io/transform", writer.FormDataContentType(), body)HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.imagehq.io/transform"))
.header("Idempotency-Key", UUID.randomUUID().toString())
.POST(HttpRequest.BodyPublishers.ofString("multipart form data"))
.build();using var form = new MultipartFormDataContent();
form.Add(new StringContent('{"tool_slug":"resize-image","operations":[{"type":"resize","width":1200,"mode":"fit"}],"output_format":"same_as_input"}'), "request");
form.Add(new StreamContent(File.OpenRead("image.png")), "files[]", "image.png");
await httpClient.PostAsync("https://api.imagehq.io/transform", form);var request = URLRequest(url: URL(string: "https://api.imagehq.io/transform")!) request.httpMethod = "POST" request.setValue(UUID().uuidString, forHTTPHeaderField: "Idempotency-Key") // Attach multipart files[] and request fields before sending.
{
"queued": {
"id": "job_123",
"status": "queued",
"operation": "transform",
"tool_slug": "png-to-jpg",
"client_reference_id": "example-123",
"progress": 0,
"current_stage": "queued",
"poll_url": "/jobs/job_123",
"created_at": "2026-05-02T00:00:00Z",
"expires_at": "2026-05-03T00:00:00Z"
},
"completed": {
"id": "job_123",
"status": "succeeded",
"progress": 100,
"inputs": [
{
"filename": "input.png",
"format": "png",
"mime_type": "image/png",
"size_bytes": 420122
}
],
"outputs": [
{
"id": "0",
"filename": "output.jpg",
"format": "jpg",
"mime_type": "image/jpeg",
"size_bytes": 161002
}
],
"warnings": [],
"stages": [
{
"name": "queued",
"status": "succeeded",
"progress": 100
},
{
"name": "processing",
"status": "succeeded",
"progress": 100
}
],
"download_url": "/jobs/job_123/download",
"retention_policy": {
"ttl_hours": 24,
"clamp": true
},
"expires_at": "2026-05-03T00:00:00Z"
}
}Yes. Transform requests support ordered operations in one job.
The backend validates operation payloads before queueing a job.
Use output_format as same_as_input to preserve source format where possible.