Convert dull seller catalogue photos into clean marketplace-ready product images. This workflow is built for folded apparel, product bundles, article-number sheets, size-range images, wholesale listings, and messy seller photos that need a clean presentation before upload.
POST https://api.pixelapi.dev/v1/image/product-photo-catalogue-clean
Authorization: Bearer YOUR_API_KEY
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| image | file | Yes | - | Catalogue/product photo. JPG, PNG, or WEBP. Max 20MB. |
| art_no | string | No | Art no. 1595 | Article number or product code shown in the header. |
| size_text | string | No | M to 4XL | Size range, pack size, variant count, or offer text. |
| footer | string | No | Premium product catalogue image | Bottom caption for marketplace context. |
| output_format | string | No | jpeg | jpeg, png, or webp. |
39 credits per image = $0.039.
| Competitor | Current public price basis | Comparable cost | PixelAPI position |
|---|---|---|---|
| Pebblely Pro | $39/month for 500 images | $0.078/image | PixelAPI is exactly 2x cheaper |
| Photoroom Image Editing API | Plus calls listed at $0.10/image | $0.10/image | PixelAPI is about 2.56x cheaper |
Gateway fees, GST, electricity, and local GPU amortisation are covered inside the 39-credit price. Failed 500/503 jobs are auto-refunded.
curl -X POST https://api.pixelapi.dev/v1/image/product-photo-catalogue-clean \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "[email protected]" \
-F "art_no=Art no. 1595" \
-F "size_text=M to 4XL" \
-F "footer=Three colour options shown | Folded catalogue view | Size range: M to 4XL" \
-F "output_format=jpeg"
import time
import requests
API = "https://api.pixelapi.dev"
KEY = "YOUR_API_KEY"
with open("tshirt-catalogue.jpg", "rb") as f:
submit = requests.post(
f"{API}/v1/image/product-photo-catalogue-clean",
headers={"Authorization": f"Bearer {KEY}"},
files={"image": f},
data={
"art_no": "Art no. 1595",
"size_text": "M to 4XL",
"footer": "Three colour options shown | Folded catalogue view | Size range: M to 4XL",
"output_format": "jpeg",
},
timeout=60,
)
submit.raise_for_status()
job = submit.json()
for _ in range(60):
time.sleep(3)
status = requests.get(
f"{API}/v1/image/{job['generation_id']}",
headers={"Authorization": f"Bearer {KEY}"},
timeout=20,
).json()
if status["status"] == "completed":
print(status["output_url"])
break
if status["status"] == "failed":
raise RuntimeError(status.get("error_message") or "Job failed")