Quick start
- Sign in, fund your account and create an API key in API access. Save the key in a
SYNTHID_API_KEYenvironment variable on your computer or server. - Add the downloadable Python helper or Node.js helper in your project. Only built-in libraries are required. Alternatively, share https://synthidremover.com/developers/synthid-api/ with your AI agent.
- Save an example below beside the helper, update its image paths and run it. The required runtime is Python 3.10+ or Node.js 22+. Pass one path or up to 20 paths to the same function.
A batch supports 20 images of up to 15 MiB each. The helper takes care of individual transfers and upload confirmations. Pay $0.20 per completed image, or $0.16 each for uploads of 5 or more images. API uploads use prepaid funds and never draw on free website uses.
Python
import os
from synthid_client import upload_images, wait_for_batch, download_result
options = {"origin": "https://synthidremover.com", "api_key": os.environ["SYNTHID_API_KEY"]}
# One path or a list of up to 20 paths; 15 MiB per image.
batch = upload_images(["image.png", "photo.jpg"], **options)
# Save these if your application needs to resume later.
print("Operation:", batch["id"], "Retry key:", batch["idempotencyKey"])
batch = wait_for_batch(batch, **options)
for item in batch["items"]:
if item["state"] != "ready":
print("Not ready:", item["ordinal"], item.get("code") or item["state"])
continue
if item.get("warning"):
print(item["warning"])
download_result(item["downloadUrl"], f"result-{item['ordinal'] + 1}.png", **options)
# Or download all ready images in one archive:
# download_result(batch["zipUrl"], "results.zip", **options)Node.js
import { uploadImages, waitForBatch, downloadResult } from "./synthid-client.mjs";
const options = { origin: "https://synthidremover.com", apiKey: process.env.SYNTHID_API_KEY };
// One path or a list of up to 20 paths; 15 MiB per image.
let batch = await uploadImages(["image.png", "photo.jpg"], options);
// Save these if your application needs to resume later.
console.log("Operation:", batch.id, "Retry key:", batch.idempotencyKey);
batch = await waitForBatch(batch, options);
for (const item of batch.items) {
if (item.state !== "ready") {
console.log("Not ready:", item.ordinal, item.code || item.state);
continue;
}
if (item.warning) console.warn(item.warning);
await downloadResult(item.downloadUrl, "result-" + (item.ordinal + 1) + ".png", options);
}
// Or download all ready images in one archive:
// await downloadResult(batch.zipUrl, "results.zip", options);The upload function returns once the files have been confirmed. The wait function polls until all items are ready or terminal. Check warnings, failures and not-started items. Existing files are never overwritten by downloads, so choose a new output directory or new destination names.
Make retries part of a reliable integration
A timeout can leave your application uncertain even when the service accepted an upload. Keep the submission identity separate from the network connection, and reconcile that operation before starting another one.
- Use one idempotency key for a submission and preserve it across retries. A new key means a new operation; it is not the right recovery action for a response that went missing.
- Honor pollAfterSeconds and Retry-After. Frequent status reads do not speed up image processing, and aggressive retries consume your account's request allowance.
- Record each terminal outcome and any quality warning. Route ready results to download, failed items to your application's error handling, and unstarted items to a deliberate later submission.
The helpers retry transient failures within bounded deadlines and skip confirmed files when resuming. Log operation IDs and stable error codes for troubleshooting while keeping API keys and temporary upload URLs out of logs.
One image with cURL
Send a single file directly as multipart form data. The image status URL is returned in the response. Reuse the idempotency key when retrying that request.
curl "https://synthidremover.com/api/v1/images" \
-H "Authorization: Bearer $SYNTHID_API_KEY" \
-H "Idempotency-Key: my-upload-0001" \
-F "image=@image.png;type=image/png"
# Poll the returned statusUrl with the same API key.
curl "https://synthidremover.com/api/v1/images/IMAGE_ID" \
-H "Authorization: Bearer $SYNTHID_API_KEY"
# Once state is ready, download the returned downloadUrl.
curl "https://synthidremover.com/api/v1/images/IMAGE_ID/download" \
-H "Authorization: Bearer $SYNTHID_API_KEY" -o result.pngPricing and API keys
Pay $0.20 per completed image, or $0.16 each for uploads of 5 or more images. Quality warnings do not remove the charge. Failures or cancellations before completion incur no charge. The service supplies pricing, so uploads need no pricing parameter.
Your API key lets requests spend your account's prepaid funds. Store keys on a server or in your automation platform's secret store. An API key cannot be used to sign in or make payments. Manage and revoke up to five active keys in Account. Revoking a key prevents new requests, while another active key on that account can still access accepted jobs.
At least 5 uploads must pass validation and have funds reserved before the bulk rate qualifies. If fewer qualify, processing does not start and all holds are released. Once qualified, the lower price stays in place if another image fails or is canceled.
Eligible bonus credit contributes to the balance available for API images at the normal price, with paid funds spent first.
Retries and interrupted uploads
The helpers generate a single Idempotency-Key for each operation and reuse it for up to three retries of transient failures. After restarting, resume with the original file list and idempotencyKey in Node.js options or idempotency_key in Python. Preserve the file contents, filenames and ordering.
Upload errors provide the retry key as error.idempotencyKey in Node.js or error.idempotency_key in Python, along with the operation ID/status URL when known. Find file-transfer errors in error.items. The helper lets independent transfers finish before it reports an incomplete upload. Correct the problem and resume within the initial ten-minute window; files already confirmed are skipped.
Metadata changes cause a 409 response. An identical retry uses the original operation even if the API key has been replaced. Idempotency records are retained for seven days. A new operation is needed for terminal failures or rejected items; retries neither restart them nor repeat completed charges.
Raw HTTP: one image or a batch
POST /api/v1/images creates both single-image and batch operations. Provide a JSON files array of 1–20 entries; one-image and multiple-image responses have the same batch structure. The supplied helpers perform this sequence automatically.
POST /api/v1/images
Authorization: Bearer YOUR_API_KEY
Idempotency-Key: my-upload-0001
Content-Type: application/json
{
"files": [
{ "filename": "image.png", "contentType": "image/png", "sizeBytes": 123456 },
{ "filename": "photo.jpg", "contentType": "image/jpeg", "sizeBytes": 234567 }
]
}- Check ordered
itemsfornot_startedoutcomes. Admission requires both available balance and room in the queue. - Send each admitted file with PUT to its entry in
uploads, using the supplied content type. Keep your API key out of requests to the storage URL. Transfer no more than two files simultaneously. - Call each
confirmUrlwith your API key using POST. Confirmation checks the file and reserves the image charge. After admitted uploads are confirmed, processing begins. Complete this within ten minutes. - Check status by polling the batch
statusUrl. Retrieve ready files one by one fromdownloadUrl, or collect all ready images withzipUrl.
Batch status, confirmation, cancellation and ZIP routes refer to the operation returned at creation. Cancel or delete an image by sending DELETE to its status URL. To cancel unfinished images, POST to /api/v1/batches/BATCH_ID/cancel. The charge for a completed result remains after deletion.
Polling and downloads
Follow the returned pollAfterSeconds: usually 15 seconds in the queue and 5 during processing. At zero, stop polling and check every item. Status and download URLs resolve against https://synthidremover.com and require an API key. Polling neither speeds processing nor extends retention.
Save every completed result within one hour. ZIP streams the currently ready files without saving a separate archive. Processing prioritizes image quality, but a finished output does not confirm that all provenance signals are absent. This version provides no webhooks.
n8n, Make and Zapier
For a single image, configure an HTTP request step using a secret Bearer credential and POST multipart/form-data to /api/v1/images. Assign the binary file to image. Use a stable record identifier for Idempotency-Key and allow the tool to generate the multipart boundary. Leave out any price field.
Use the preceding JSON creation and per-file PUT/confirmation steps for several images. For multipart uploads in n8n, select an n8n Binary File field. For Make, choose the HTTP multipart file field. A Zapier action must support binary multipart uploads, or use JSON creation with a separate binary PUT. Include a delay and status request before saving each ready download as a binary file. A dedicated connector is unnecessary.
Limits and errors
- Use JPEG, PNG or WebP with up to 15 MiB and 20 megapixels per image, and up to 20 images per batch. Animation and unnormalized EXIF rotation are unsupported. The direct single-file multipart request has a total 16 MiB limit, separate from batch limits.
- Each account can have one unfinished batch, counting website uploads. Up to 40 images can be outstanding in the processing queue.
- Per account, the per-minute limits are six creation requests and 120 other API requests, shared by its keys. Retries use this allowance. Respect
Retry-Afterwith 429 and 503 responses. - You have ten minutes to upload, six hours for processing admission and one hour to download each completed image. Batch access ends two hours after its processing deadline.
An error contains a stable code and readable error. The status meanings are: 400 invalid input, 401 invalid or revoked key, 402 insufficient balance, 409 conflicting idempotency data or unfinished work, 410 expiry, 429 rate/concurrency limit, and 503 unavailable processing capacity. Helpers report the codes without logging credentials or signed URLs.
Get your balance, current price and limits through GET /api/v1/account. Download the OpenAPI schema for the complete request and response schemas.