SynthID Remover API

Use the SynthID removal API to add image processing to an automated upload pipeline. Track each file, resume interrupted transfers and retrieve completed results using your SynthIDRemover.com balance.

Quick start

  1. Sign in, fund your account and create an API key in API access. Save the key in a SYNTHID_API_KEY environment variable on your computer or server.
  2. 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.
  3. 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.

  1. 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.
  2. Honor pollAfterSeconds and Retry-After. Frequent status reads do not speed up image processing, and aggressive retries consume your account's request allowance.
  3. 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.png

Pricing 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 }
  ]
}
  1. Check ordered items for not_started outcomes. Admission requires both available balance and room in the queue.
  2. 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.
  3. Call each confirmUrl with 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.
  4. Check status by polling the batch statusUrl. Retrieve ready files one by one from downloadUrl, or collect all ready images with zipUrl.

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

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.