API reference/POST /smart-crop

Auto-crop to subject bounds

Tight bounding box around the subject. Optional padding. Useful for thumbnails, e-commerce tiles, and uniform aspect ratios across product shots.

POSThttps://useknockout--api.modal.run/smart-crop

Parameters

Send as multipart/form-data unless noted otherwise.

filerequiredfileImage to process. JPG, PNG, WebP, HEIC. Up to 10 MB and 4096×4096.
paddingint8Pixels of padding around the detected subject bounds.
aspectstringForce a specific output aspect ratio. Examples: 1:1, 4:5, 16:9.
detectstringstandardSubject detection mode: standard (default) or high_recall. high_recall runs a second model pass on a contrast-boosted copy and unions the two masks, recovering product regions the single pass misses on low-contrast shots (a pale product on a pale surface). It only ever adds to the mask; it never removes included background (that's decontaminate). Runs double inference, so latency roughly doubles and it requires a paid plan: free-tier requests get a 402.
decontaminatebooleanfalseRe-classify pixels near the mask edge using per-image color models of subject vs background, removing background the model kept: base-paper strips under products, lightbox rig fragments at the boundary. Trade-off: it helps least on a white product on a white background (no color evidence to work with), and it can trim the dark underside edge of stacked or thick products, which is partly real product. Available on every tier.
enginestring(default engine)Set to product-v1 to run the alternate cutout engine built for flat product photography: packaging film, paper, sheet goods and lightbox flat-lays, where the default engine can leave a faint light edge where the background met the product. Opt-in per request, so calls that omit it are unchanged. It runs a second refinement pass at full resolution, which costs roughly 25 seconds per image instead of a few, and it needs a paid plan. Choose it for flat, opaque products; leave it off for plants, hair, and translucent or pale organic subjects, where it performs worse than the default.
formatstringpngOutput format: png (with alpha) or webp.

Request

curl -X POST "https://useknockout--api.modal.run/smart-crop" \
  -H "Authorization: Bearer $TOKEN" \
  -F "file=@cat.jpg" \
  -F "aspect=1:1" -F "padding=16" \
  -o out.png

Response

HTTP/1.1 200 OK
content-type: image/png
content-length: 254312
x-knockout-latency: 184
x-knockout-model: BiRefNet
x-ratelimit-limit: 60
x-ratelimit-remaining: 59

Errors

401unauthorizedMissing or invalid token.
402payment_requiredFree tier exhausted. Add a card to continue.
413payload_too_largeImage exceeds 10 MB or 4096×4096.
422no_subject_detectedForeground could not be isolated from background.
429rate_limit_exceededSlow down. Retry-After header tells you when.
500internal_errorSomething broke on our side. Include request_id when reporting.
Every error response also includes a request_id in the JSON body. Quote it when reporting issues.

Notes

  • If aspect is provided, padding is computed to satisfy the ratio. Subject stays centered.
  • Pair with /remove first if you want a transparent crop instead of an opaque one.