Erased

Quickstart

Four ways to send an image to Erased. Pick whichever fits your stack; they all converge on the same processing pipeline.

① multipart — one-call upload + process

One HTTP call, no base64 inflation. Recommended for almost every use case.

curl -X POST https://erased.ink/api/v1/jobs \
  -F "image=@photo.png" \
  -F "mode=visible"
# → { "id":"job_xxx", "status":"succeeded", "result_url":"https://..." }
// JavaScript (browser or Node 18+)
const fd = new FormData();
fd.append("image", fileBlob, "photo.png");
fd.append("mode", "visible");
const res = await fetch("https://erased.ink/api/v1/jobs", { method: "POST", body: fd });
const { result_url } = await res.json();
# Python
import requests
with open("photo.png", "rb") as f:
    r = requests.post("https://erased.ink/api/v1/jobs",
                      files={"image": f}, data={"mode": "visible"})
print(r.json()["result_url"])

② JSON + base64 — for JSON-only tools (≤1MB)

Use when your stack can only send JSON (Zapier, n8n, etc.). 1MB decoded cap.

curl -X POST https://erased.ink/api/v1/jobs \
  -H 'content-type: application/json' \
  -d '{
    "image_base64":"iVBORw0KGgo...",
    "content_type":"image/png",
    "mode":"visible"
  }'

③ GET /api/v1/clean — URL in, image out

Single sync call where the response body is the processed image. Works in <img src="..." /> and CDN-cacheable.

<!-- Drop in directly to HTML / Markdown -->
<img src="https://erased.ink/api/v1/clean?image=https%3A%2F%2Fexample.com%2Fphoto.png&mode=visible" />
# curl
curl 'https://erased.ink/api/v1/clean?image=https%3A%2F%2Fexample.com%2Fphoto.png&mode=visible' -o clean.png

Anonymous / Free only — Pro users go via POST /jobs. See API reference for limits.

④ Presigned upload — large files / batch

For files >10MB-tail or batch uploads, request a presigned R2 URL, PUT the bytes directly to R2 (bypassing the Worker), then submit the job by object_key:

# 1) Ask for a presigned PUT URL
curl -X POST https://erased.ink/api/v1/uploads \
  -H 'content-type: application/json' \
  -d '{"filename":"photo.png","content_type":"image/png","size":4823109}'
# → { "upload_url":"https://...", "object_key":"in/2026-05-24/job_xxx.png" }

# 2) PUT bytes directly to R2 (content-type MUST match step 1)
curl -X PUT "<upload_url>" --data-binary @photo.png -H 'content-type: image/png'

# 3) Submit the job by object_key
curl -X POST https://erased.ink/api/v1/jobs \
  -H 'content-type: application/json' \
  -d '{"object_key":"in/2026-05-24/job_xxx.png","mode":"visible"}'

Authentication

Three tiers, in order of capability: