Quickstart
Create a key in your dashboard, then send your first request. By default the response arrives when the file is ready, usually within seconds for images and under a minute for video. If it takes longer than four minutes you get a 202 to poll instead, so use a client timeout of at least 300 seconds. For queues and serverless callers, send "async": true to get the 202 straight away. Every removal also has a page_url: a phone-friendly page with a Save to Photos button, handy to send to whoever posts it.
curl https://hideslop.com/api/v1/remove/video \
-H "Authorization: Bearer hs_live_your_key" \
-H "Content-Type: application/json" \
-d '{
"video_url": "https://example.com/clip.mp4",
"device": "random"
}'Authentication
Send your key as Authorization: Bearer hs_live_.... The X-API-Key header also works. Keys are shown once when created and stored only as a hash, so keep them in a secret manager. Revoke a key from the dashboard at any time.
Remove AI from a video
POST/api/v1/remove/video
Costs 10 credits. The source must be a publicly downloadable MP4, MOV or WebM file.
| Field | Type | Description |
|---|---|---|
| video_url | string | Required. Public http(s) URL of the source video. |
| preset | "auto" | "random" | "none" | Defaults to "auto": fresh, invisible micro edits on every call. "random" uses the full range. "none" keeps neutral values and only rewrites metadata. |
| device | string | A device model from the list below, or "random" for a weighted realistic pick. Defaults to the preset's choice. |
| async | boolean | Answer 202 with the removal right away instead of waiting. Poll GET /api/v1/removals/{id}, which the Location header points to. |
| parameters | object | Optional overrides applied on top of the preset. See Parameters. |
Remove AI from images
POST/api/v1/remove/images
Costs 1 credit per image, charged only for images that succeed. Send up to 20 images. Each image draws its own preset values.
| Field | Type | Description |
|---|---|---|
| image_urls | string[] | Public JPG, PNG or WebP URLs. Or use image_url for a single image. |
| images | object[] | Alternative to image_urls with per-image overrides: [{ "image_url": "...", "quality": 97 }]. |
| preset | "auto" | "random" | "none" | Defaults to "auto": fresh, invisible micro edits on every call. "random" uses the full range. "none" keeps neutral values and only rewrites metadata. |
| device | string | A device model from the list below, or "random" for a weighted realistic pick. Defaults to the preset's choice. |
| async | boolean | Answer 202 with the removal right away instead of waiting. Poll GET /api/v1/removals/{id}, which the Location header points to. |
| parameters | object | Optional overrides for every image. See Parameters. |
curl https://hideslop.com/api/v1/remove/images \
-H "Authorization: Bearer hs_live_your_key" \
-H "Content-Type: application/json" \
-d '{
"image_urls": [
"https://example.com/slide-1.png",
"https://example.com/slide-2.png"
],
"device": "iPhone 16 Pro Max"
}'Presets and devices
auto is what the studio uses by default: zoom between 1.02 and 1.08x for video and 1.01 to 1.05x for images, a few percent of color, gamma and speed variation, light grain and a weighted random phone. These values are invisible to viewers and different on every call.
Accepted values for device:
- random
- iPhone 17 Pro Max
- iPhone 17 Pro
- iPhone 17
- iPhone 16 Pro Max
- iPhone 16 Pro
- iPhone 16
- iPhone 15 Pro Max
- iPhone 15 Pro
- iPhone 15
- iPhone 14 Pro Max
- iPhone 14 Pro
- iPhone 14
- iPhone 13 Pro Max
- iPhone 13 Pro
- iPhone 13
- Ray-Ban Meta Smart Glasses
Parameters
All parameters are optional. Values outside the ranges below are rejected with a 400 error.
Video
| Field | Type | Description |
|---|---|---|
| playbackSpeed | 0.5 to 2 | Tiny speed changes shift every frame timestamp. |
| volume | 0 to 2 | Changes the audio waveform fingerprint. |
| timeShift | -5 to 5 | Offsets the start so frame-by-frame matching misaligns. |
| frameBlending | 0 to 1 | Blends neighbouring frames by a hair. |
| zoomFactor | 0.5 to 2 | A slight crop moves every pixel off its original grid. |
| blend | 0 to 1 | Mixes in a faint overlay layer. |
| brightness | -1 to 1 | Keep within ±0.03 to stay invisible. |
| contrast | 0 to 2 | 1.00 is unchanged. |
| saturation | 0 to 2 | 1.00 is unchanged. |
| hueShift | -180 to 180 | A few degrees changes color histograms. |
| gamma | 0.1 to 3 | 1.00 is unchanged. |
| temperature | 0.1 to 2 | Warms or cools the white balance. |
| noise | 0 to 1 | Sensor-like grain, like a real phone camera. |
| sharpness | 0 to 2 | 1.00 is unchanged. |
| hue | -180 to 180 | Secondary hue rotation, separate from hueShift. |
| bilateVariation | 0 to 2 | Bilateral filter variation. 1 is unchanged. |
| removeAudio | boolean | Drop the audio track entirely. |
| deviceModel | string | Same as device, inside parameters. |
Images
| Field | Type | Description |
|---|---|---|
| quality | 60 to 100 | JPEG quality. 92 to 97 matches real phone photos. |
| zoomFactor | 0.5 to 2 | A slight crop moves every pixel off its original grid. |
| brightness | -1 to 1 | Keep within ±0.03 to stay invisible. |
| contrast | 0 to 2 | 1.00 is unchanged. |
| saturation | 0 to 2 | 1.00 is unchanged. |
| hueShift | -180 to 180 | A few degrees changes color histograms. |
| gamma | 0.1 to 3 | 1.00 is unchanged. |
| temperature | 0.1 to 2 | Warms or cools the white balance. |
| noise | 0 to 0.5 | Sensor-like grain, like a real phone camera. |
| sharpness | 0 to 2 | 1.00 is unchanged. |
| flipHorizontal | boolean | Mirror the image left to right. |
| flipVertical | boolean | Flip the image upside down. |
| hue | -180 to 180 | Alias of hueShift. |
Responses and errors
Successful calls return a removal. Each output has a url on hideslop.com that redirects to a short-lived signed download, and a download_url that saves it with a clean filename. Files are deleted at expires_at, 24 hours after processing, so copy anything you want to keep. Errors use a stable code field.
{
"id": "rmv_8fK2c9QwLm3Tn0aXvB7e",
"kind": "video",
"status": "succeeded",
"billing": "credits",
"credits_charged": 10,
"credits_remaining": 290,
"processing_ms": 41234,
"created_at": "2026-10-12T14:03:11.000Z",
"finished_at": "2026-10-12T14:03:52.000Z",
"expires_at": "2026-10-13T14:03:52.000Z",
"page_url": "https://hideslop.com/r/rmv_8fK2c9QwLm3Tn0aXvB7e",
"output_url": "https://hideslop.com/api/files/rmv_8fK2c9QwLm3Tn0aXvB7e/0",
"outputs": [
{
"input_url": "https://example.com/clip.mp4",
"url": "https://hideslop.com/api/files/rmv_8fK2c9QwLm3Tn0aXvB7e/0",
"download_url": "https://hideslop.com/api/files/rmv_8fK2c9QwLm3Tn0aXvB7e/0?download=1",
"parameters": { "deviceModel": "iPhone 16 Pro", "zoomFactor": 1.043, "playbackSpeed": 0.991 }
}
],
"error": null
}| Field | Type | Description |
|---|---|---|
| 400 invalid_request | Missing or invalid fields. See error.details for each issue. | |
| 401 unauthorized | Missing, invalid or revoked API key. | |
| 402 insufficient_credits | Not enough credits. Nothing was charged. | |
| 429 rate_limited | More than 60 requests a minute on one key. Retry after the Retry-After header. | |
| 502 upstream_failed | Processing failed. Credits were refunded automatically. Safe to retry. |
Other endpoints
GET/api/v1/credits
Returns { "credits": 290, "lifetime_purchased": 1250, "lifetime_spent": 960 } for the key's account.
GET/api/v1/removals/{id}
Fetches a removal you created, including its status and outputs. Statuses are processing, succeeded and failed. A failed removal carries error.message, and its credits are already refunded.
GET/api/v1/devices
Lists device profiles and credit costs. No key required.
MCP server
HideSlop speaks the Model Context Protocol over Streamable HTTP at https://hideslop.com/api/mcp. Authenticate with the same API key as a bearer token. Tools: remove_ai_video, remove_ai_images, get_removal, get_credits and list_devices.
claude mcp add --transport http hideslop https://hideslop.com/api/mcp \
--header "Authorization: Bearer hs_live_your_key"Then ask your agent something like "remove the AI label from this video so I can repost it: https://..." and it will call the tool and return the download link.
Limits
- 60 requests per minute per key.
- Videos up to 150 MB, images up to 20 MB each, 20 images per call.
- Source URLs must be publicly reachable over http or https.
- Output files are deleted 24 hours after processing. Their links then answer 410.