Le texte de référence technique est en anglais ; la navigation et les titres sont traduits.
ClearCut API
Supprimez l’arrière-plan d’images et de vidéos avec une seule requête HTTP. Intégrez ClearCut à votre application, votre workflow ou votre backend en quelques minutes, sans aucune infrastructure de ML.
L’API parle en HTTP classique avec des corps multipart ou JSON : elle fonctionne donc avec n’importe quel langage. Authentifiez-vous avec une clé API, envoyez une image ou une vidéo, et recevez un détourage net.
Simple à intégrer
- • Un appel, tous les langages — import multipart, URL ou base64 ; réponse en JSON, en URL hébergée ou en octets bruts.
- • Facturation prévisible — les crédits ne sont débités qu’en cas de succès ; les crédits vidéo sont réservés, ajustés puis remboursés en cas d’échec.
- • Asynchrone quand il le faut — la vidéo est traitée en arrière-plan, avec progression, webhooks et annulation.
- • Contrôles de production — limites de débit par clé, plafonds mensuels, listes d’autorisation d’IP et de domaines.
Premiers pas
1. Créez un compte et récupérez une clé API depuis votre tableau de bord.
2. Envoyez votre première requête :
curl -X POST "https://api.clearcutapi.com/api/v1/removebg" \
-H "X-API-Key: clearcut_live_YOUR_KEY" \
-F "image_file=@/path/to/image.jpg" \
-F "format=png" \
-F "size=auto"Les réponses sont en JSON par défaut et incluent une result.url hébergée ; ou définissez response_type=binary pour recevoir directement les octets de l’image.
Authentification
Envoyez votre clé API dans l’en-tête X-API-Key. Les clés sont créées dans le tableau de bord et ne sont affichées qu’une seule fois (elles sont stockées sous forme de hachage SHA-256).
Créez des clés par programmation avec votre jeton d’accès au tableau de bord :
# Create an API key (use your dashboard JWT)
curl -X POST "https://api.clearcutapi.com/api/v1/api-keys" \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"name": "Production", "mode": "live"}'
# -> the full key is returned ONCE in the "key" fieldSuppression d’arrière-plan d’images
Accepte un fichier importé, une URL ou une chaîne base64. Renvoie un détourage transparent ou une composition sur un arrière-plan couleur ou image.
| Paramètre | Description |
|---|---|
| image_file / image_url / image_file_b64 | Source image — provide exactly one. JPG, PNG or WebP, up to 22 MB / 50 MP. |
| size | preview | full | auto (default auto). Preview is ~0.25 MP and costs 0.25 credit. |
| format | png | jpg | webp | zip | auto (default auto: PNG if transparent, else JPG). |
| type | auto | person | product | animal | car | graphic | transportation. person uses a portrait-tuned model. |
| bg_color | transparent | white | black | #RRGGBB (+0.5 credit when not transparent). |
| bg_image_url | Composite onto this image instead (+0.5 credit). |
| crop | true | false — crop to the subject. |
| margin | Pixels of padding around the cropped subject (0–500). |
| shadow | true | false — add a soft drop shadow. |
| response_type | json (default) | url | binary — binary streams the file bytes. |
| webhook_url | Optional. Receives this job's job.completed / job.failed events, signed. |
curl -X POST "https://api.clearcutapi.com/api/v1/removebg" \
-H "X-API-Key: clearcut_live_YOUR_KEY" \
-F "image_file=@/path/to/image.jpg" \
-F "format=png" \
-F "size=auto"Réponse
{
"success": true,
"job_id": "job_3f9c2a71b0d84e6c9a1f5e2d7b40",
"status": "completed",
"result": {
"url": "https://cdn.clearcutapi.com/results/.../job_3f9c....png",
"format": "png",
"width": 1200,
"height": 1200,
"expires_at": "2026-12-31T23:59:59Z"
},
"usage": { "credits_used": 1, "credits_remaining": 999 }
}Suppression d’arrière-plan de vidéos
Asynchronous — the request validates the clip, reserves credits and returns a queued job. Poll GET /api/v1/jobs/{job_id} or listen for webhooks. Requires a Pro plan or higher. Transparent output defaults to an alpha-channel .webm (VP9); backgrounds default to .mp4. Audio is preserved.
| Paramètre | Description |
|---|---|
| video_file / video_url / video_file_b64 | Source video — exactly one. MP4, MOV, WebM or AVI; up to 200 MB, 60 s, 1080p. |
| format | webm | mov | mp4 | gif | zip_frames (default: webm when transparent, mp4 otherwise). |
| background | transparent | color | image (default transparent). |
| bg_color | Hex color, white or black — required with background=color. |
| bg_image_url | Background image — required with background=image. |
| fps | 15 | 24 | 30 — output frame rate (never above the source). |
| resolution | original | 720p | 1080p — longest side 1280 or 1920 px. |
| webhook_url | Optional. Receives job.created / started / processing / completed / failed. |
Credits: 5 per job + 1 per second, ×1.5 for HD (≥1280 px), +2 for a custom background. The estimate is reserved up front; unused credits are returned when the job finishes, and everything is refunded if it fails or you cancel it (POST /api/v1/jobs/{job_id}/cancel).
# 1. Start the job (returns job_id + status_url)
curl -X POST "https://api.clearcutapi.com/api/v1/remove-video-bg" \
-H "X-API-Key: clearcut_live_YOUR_KEY" \
-F "video_file=@/path/to/clip.mp4" \
-F "format=webm" \
-F "background=transparent"
# 2. Poll the status_url until status == "completed"
curl "https://api.clearcutapi.com/api/v1/jobs/JOB_ID" \
-H "X-API-Key: clearcut_live_YOUR_KEY"Statut de la tâche
{
"success": true,
"job_id": "job_8d1e...",
"type": "video",
"status": "processing", // queued | processing | completed | failed | cancelled | expired
"progress": 45,
"message": "Removing background from video frames.",
"result": null, // filled in when completed: url, format, width, height, duration, poster_url
"usage": { "credits_used": 24, "credits_remaining": 976 }
}Formats de sortie
| Format | Transparence | Remarques |
|---|---|---|
| PNG | Oui (≤ 10 MP) | Idéal pour les détourages |
| JPG | Non | Le plus léger, jusqu’à 50 MP |
| WebP | Oui | Compact, jusqu’à 50 MP |
| ZIP | Oui | color.jpg et alpha.png |
| WebM (video) | Oui (alpha VP9) | Idéal pour le web ; lecture intégrée |
| MOV (video) | Oui (ProRes 4444) | Flux de montage |
| MP4 (video) | Non | Nécessite un arrière-plan couleur ou image |
| GIF (video) | 1 bit | Aperçus courts (≤ 15 fps, ≤ 480 px) |
| ZIP frames | Oui | frames/, alpha/ et metadata.json |
Format ZIP
For apps that composite layers themselves. format=zip on images returns:
color.jpg # full-color image (RGB, no alpha) alpha.png # 8-bit matte: 255 = subject, 0 = background metadata.json # width, height, file names
Apply alpha.png as the alpha channel of color.jpg to rebuild the cutout. Video jobs withformat=zip_frames return the same idea per frame:
frames/00001.jpg ... # color frames alpha/00001.png ... # matching mattes metadata.json # frame_count, fps, width, height
Référence de l’API
URL de base https://api.clearcutapi.com. La documentation OpenAPI interactive est disponible à l’adresse /docs sur l’hôte de l’API.
| Méthode | Chemin | Authentification | Usage |
|---|---|---|---|
| GET | /api/v1/health | Aucune | Service health |
| POST | /api/v1/removebg | X-API-Key | Remove an image background (synchronous) |
| POST | /api/v1/remove-video-bg | X-API-Key | Start an async video job |
| GET | /api/v1/jobs/{job_id} | X-API-Key ou jeton bearer | Job status, progress and result |
| POST | /api/v1/jobs/{job_id}/cancel | X-API-Key ou jeton bearer | Cancel a queued/processing job (refunds credits) |
| GET | /api/v1/remove-video-bg/{job_id} | X-API-Key | Alias of job status for video jobs |
| POST | /api/v1/auth/register | Aucune | Create an account + workspace |
| POST | /api/v1/auth/login | Aucune | Get access + refresh tokens |
| POST | /api/v1/auth/refresh | Jeton d’actualisation | Rotate tokens |
| POST | /api/v1/auth/logout | Bearer | Revoke all sessions |
| GET | /api/v1/me | Bearer | Current user, workspace, role and credits |
| GET / POST | /api/v1/api-keys | Bearer | List / create API keys |
| PATCH / DELETE | /api/v1/api-keys/{id} | Bearer | Edit restrictions / revoke |
| POST | /api/v1/api-keys/{id}/regenerate | Bearer | Rotate a key's secret |
| GET | /api/v1/usage | Bearer | Usage analytics |
| GET / POST | /api/v1/webhooks | Bearer | Manage webhook endpoints |
Limites de débit
Limits apply per API key (your plan's limit, or a lower one you set on the key), per workspace across all keys, per IP address, and per endpoint (video submissions are capped at a quarter of the key limit). Keys can also carry a monthly call cap.
Every API response includes X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset.
HTTP/1.1 429 Too Many Requests
Retry-After: 60
{
"success": false,
"error": {
"code": "rate_limit_exceeded",
"message": "Rate limit reached (api key). Retry after 60 seconds.",
"retry_after": 60,
"request_id": "req_..."
}
}Backoff exponentiel
On 429 or a 5xx, wait and retry with growing delays: honor Retry-Afterwhen present, otherwise wait 1s, 2s, 4s, 8s… (capped) with random jitter. Don't retry other 4xx errors — fix the request.
import random, time, requests
def remove_bg_with_retry(path, max_attempts=5):
for attempt in range(max_attempts):
with open(path, "rb") as fh:
resp = requests.post(
"https://api.clearcutapi.com/api/v1/removebg",
headers={"X-API-Key": "clearcut_live_YOUR_KEY"},
files={"image_file": fh},
)
if resp.status_code != 429 and resp.status_code < 500:
return resp # success, or a 4xx you should fix rather than retry
retry_after = resp.headers.get("Retry-After")
delay = float(retry_after) if retry_after else min(2 ** attempt, 30)
time.sleep(delay + random.uniform(0, 0.5)) # jitter
resp.raise_for_status()Webhooks
Register endpoints in the dashboard to receive signed event notifications (job.completed, job.failed,credits.low, and more). Verify theX-ClearCut-Signature header:
import hmac, hashlib, time
def verify(secret, body, header, tolerance=300):
parts = dict(p.split("=", 1) for p in header.split(","))
if abs(time.time() - int(parts["t"])) > tolerance:
return False
expected = hmac.new(
secret.encode(), f"{parts['t']}.{body}".encode(), hashlib.sha256
).hexdigest()
return hmac.compare_digest(expected, parts["v1"])Events: job.created, job.started, job.processing, job.completed, job.failed,credits.low, api_key.rate_limited. Failed deliveries retry with exponential backoff.
You can also pass webhook_url on a single request. Those deliveries are signed with your workspace signing secret (Dashboard → Webhooks → Per-request webhook URLs).
Codes d’erreur
Les erreurs renvoient une enveloppe cohérente avec un code stable, un message et un request_id.
Workflows
Chain steps into a reusable, versioned pipeline: remove background → QualityGuard gate → compose / AI background → enhance → marketplace export presets → human approval → publish to your store. Every run has a hard max_credits budget, a dry-run quote, step-by-step history and a CSV/JSON manifest. Nothing is published without an approval.
# Quote first (nothing is charged)
curl -X POST "https://api.clearcutapi.com/api/v1/workflows/WORKFLOW_ID/runs" -H "X-API-Key: clearcut_live_YOUR_KEY" -H "Content-Type: application/json" -d '{"inputs": {"asset_ids": ["ASSET_ID"]}, "max_credits": 10, "dry_run": true}'
# Run it under a hard budget, then follow step-by-step progress
curl -X POST "https://api.clearcutapi.com/api/v1/workflows/WORKFLOW_ID/runs" -H "X-API-Key: clearcut_live_YOUR_KEY" -H "Content-Type: application/json" -H "Idempotency-Key: catalog-2026-10-24" -d '{"inputs": {"asset_ids": ["ASSET_ID"]}, "max_credits": 10}'
curl "https://api.clearcutapi.com/api/v1/workflow-runs/RUN_ID" -H "X-API-Key: clearcut_live_YOUR_KEY"SDK et bibliothèques
Official SDKs for Python and TypeScript/JavaScript send an Idempotency-Key on every job-creating call, retry 429 and 5xx with exponential backoff (honouring Retry-After), raise typed errors and verify webhook signatures.
# pip install clearcut-api
from clearcut import ClearCut, RateLimitError
cc = ClearCut("clearcut_live_YOUR_KEY")
result = cc.remove_background("product.jpg", format="png")
print(result.url, result.usage.credits_used)
# Async video: start and wait
job = cc.remove_video_background("clip.mp4", format="webm", wait=True)
print(job.result.url)Prefer generating your own client? Use the OpenAPI schema or import the Postman collection from docs/postman/clearcut.postman_collection.json.
Journal des modifications de l’API
- • Workflows and the Catalog Agent:
/workflows,/workflow-runs, budgets, approvals, publishing. - • Video Studio:
/studio/video/jobswith trim, reframe, blur/AI backgrounds, overlays and multi-export. - • AI backgrounds (
/backgrounds/generate) and AI erase (/images/inpaint). - • Official Python and TypeScript SDKs, Postman collection.
- • New webhook events:
workflow.*,integration.publish_*,subscription.updated.
- • Video options: format (webm, mov, mp4, gif, zip_frames), background color/image, fps, resolution, webhook_url.
- •
GET /jobs/{id}accepts API keys and returns progress, message, result and usage. NewPOST /jobs/{id}/cancel. - • API key IP/domain allow-lists, monthly caps, regeneration; workspace, IP and endpoint rate limits.
- • Per-request
webhook_urlon image and video requests. Job ids now start withjob_. - • New error codes: monthly_limit_exceeded, ip_not_allowed, domain_not_allowed, plan_limit.
- • Video background removal (async jobs, transparent alpha WebM output, preserved audio).
- • Signed webhooks for job lifecycle events.
- • Stripe-ready billing and credit packages.
- • Initial release: image background removal, API keys, credits, usage analytics.