Cleanup
Cleanup API
To remove unwanted objects or defects from your pictures, you can use the API available at https://clipdrop-api.co/cleanup/v1
.
The request must be an http POST
and its body must be a multipart/form-data
that has two images files and an optional mode
field:
image_file
is the original image to process.- The original image should be a JPG or a PNG, with a maximum resolution of 16 megapixels and a max file size of 30 Mb.
mask_file
is the mask image, defining the areas that need to be removed.- The mask image should be a PNG, and should have the same resolution as the original image and a max file size of 30 Mb.
- The mask should be black and white with no grey pixels (e.g. values of only 0 or 255), the value of 0 indicating a pixel to keep as is and 255 a pixel to 'clean up'
mode
is an optional field that can be set tofast
orquality
to control the tradeoff between speed and quality.fast
is the default mode, it is faster but may produce artifacts in the result image.quality
is slower but produces better results.
note
fast
mode is the equivalent of the default mode in Clipdrop.co, while quality
mode is the equivalent of the "HD" mode.
In case of success:
- the response mime-type is
image/png
and the response image is a PNG image with the same dimensions as theimage_file
. - the response headers will include a
x-remaining-credits
property to tell you how many credits you have left and ax-credits-consumed
property to tell you how many credits were consumed by your request.
In case of an error:
- the response mime-type is
application/json
, error type is indicated by the response status code and details are in the json body, ie
{ "error": "No api key provided" }
Authentication
Requests are authenticated with an API key. If you need one, please contact us at contact@clipdrop.co.
If your key has leaked, you can revoke it and request a new one in your account page.
Credits
1 successful cleanup API call = 1 credit.
Once logged in, you can claim 100 free Clipdrop APIs credits that you can use for development and debugging purposes. Once the 100 images have been consumed, further calls will be rejected.
If you need more credits, you can purchase more credits via the following link.
Quota / Rate limiting
By default, each API key has a limit of 60 requests per minute for the cleanup API. Please let us know if you'd like higher values.
Examples
- CURL
- JavaScript
- Python
- Swift
- Kotlin
curl -X POST https://clipdrop-api.co/cleanup/v1 \
-H 'x-api-key: YOUR_API_KEY' \
-F 'image_file=@image.jpg' \
-F 'mask_file=@mask.png' \
-o result.png
const form = new FormData()
form.append('image_file', photo)
form.append('mask_file', mask)
fetch('https://clipdrop-api.co/cleanup/v1', {
method: 'POST',
headers: {
'x-api-key': YOUR_API_KEY,
},
body: form,
})
.then(response => response.arrayBuffer())
.then(buffer => {
// buffer here is a binary representation of the returned image
})
import requests
r = requests.post('https://clipdrop-api.co/cleanup/v1',
files = {
'image_file': ('image.jpg', image_file_object, 'image/jpeg'),
'mask_file': ('mask.png', mask_file_object, 'image/png')
},
headers = { 'x-api-key': 'YOUR_API_KEY'}
)
if (r.ok):
# r.content contains the bytes of the returned image
else:
r.raise_for_status()
import Alamofire;
let imageData = try Data(contentsOf: inputPath)
let headers: HTTPHeaders = [
"x-api-key": "YOUR_API_KEY"
]
AF.upload(
multipartFormData: { multipartFormData in
multipartFormData.append(
imageData,
withName: "image_file",
fileName: "image.jpg",
mimeType: "image/jpeg"
)
multipartFormData.append(
maskData,
withName: "mask_file",
fileName: "mask.png",
mimeType: "image/png"
)
},
to: "https://clipdrop-api.co/cleanup/v1",
headers: headers
)
.responseData(queue: .global()) { response in
switch response.result {
case .success: do {
// response.data here is an in memory byte buffer of the returned image
}
case let .failure(error): print(error)
}
// this example uses the OkHttp library
// https://square.github.io/okhttp/
val client = OkHttpClient()
val requestBody =
MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart(
"image_file",
"image.jpg",
File("docs/images/image.jpg").asRequestBody("image/jpeg".toMediaType())
)
.addFormDataPart(
"mask_file",
"mask.png",
File("docs/images/mask.png").asRequestBody("image/png".toMediaType())
)
.build()
val request =
Request.Builder()
.header("x-api-key", "YOUR_API_KEY")
.url("https://clipdrop-api.co/cleanup/v1")
.post(requestBody)
.build()
client.newCall(request).execute().use { response ->
if (!response.isSuccessful) throw IOException("Unexpected code $response")
// response.body().bytes() here is a byte array of the returned image
}
Responses
- 200
- 400
- 401
- 402
- 403
- 422
- 429
- 500
The result image, e.g.
Request is malformed or incomplete, non exhaustive causes can be:
- Missing image_file in request
- Input image format is not valid
- Image resolution is too big
Missing api key.
Your account has no remaining credits, you can buy more in your account page.
Invalid or revocated api key.
Input image is not acceptable.
Too many requests, blocked by the rate limiter.
You should space out your requests in time or contact us to increase your quota.
This may be a bug on our side.
Please contact us at contact@clipdrop.co so that we can investigate.
Tips and Tricks
The algorithm performs better if your mask is a bit larger than the object you want to remove. If your mask generation is automatic, expand the detected object mask a bit (15% has proven quite successful) to achieve the best results.
- Original
- Bad mask
- Good mask
- Bad Result
- Good Result
Examples of input and outputs
image_file
mask_file
result
Sample integrations
Support
Any question ? Contact us at contact@clipdrop.co or join the Slack community.