Skip to content
Gemini Watermark Remover AI

API documentation

Base URL: https://geminiwatermarkremoverai.in/api. All requests use HTTPS. Responses are JSON unless you ask for the image itself.

Authentication

Create a key in your dashboard and send it in the Authorization header. Keep keys on your server; never put them in browser or mobile app code.

Authorization: Bearer vm_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Lock a key to your servers

For production, add your servers' public IP addresses (or CIDR ranges such as 10.0.0.0/24) to the key in the dashboard. Requests from any other address are refused with 403 ip_not_allowed, so a leaked key can't be used by anyone else. The API also doesn't allow calls from web pages in a browser (no CORS), so a key copied into another website won't work there either.

Remove a watermark

POST /v1/images/remove-watermark

Send the image in one of two ways:

  • multipart/form-data with the file in a field named image, or
  • the raw image bytes with Content-Type: image/png, image/jpeg or image/webp.

Query parameters

output_formatpng (default, lossless), jpeg or webp (quality 95).
responsebinary (default: the image itself) or json (metadata plus the image as base64).

Supported: original Gemini images in PNG, JPEG or WebP, up to 20 MB.

Responses

With the default binary response you get the cleaned image and these headers:

X-Watermark-Removedtrue, or false when no Gemini watermark was found (the image is returned unchanged).
X-Qualityclean, visible-residual (a faint trace may remain) or possible-content-damage (check the corner).
X-Credits-Charged1 when a watermark was removed, otherwise 0.
X-Credits-RemainingYour balance after this request.
RateLimit-*Your per-minute limit, requests left and seconds until it resets.

With response=json:

{
  "request_id": 18342,
  "watermark_removed": true,
  "quality": "clean",
  "watermark": { "size": 96, "position": { "x": 1888, "y": 1888, "width": 96, "height": 96 } },
  "image": { "width": 2048, "height": 2048, "format": "png", "base64": "iVBORw0KGgo…" },
  "credits": { "charged": 1, "remaining": 1999 }
}

Code examples

cURL

curl -X POST "https://geminiwatermarkremoverai.in/api/v1/images/remove-watermark" \
  -H "Authorization: Bearer $API_KEY" \
  -F "[email protected]" \
  -o clean.png

JavaScript (Node.js 18+)

import { readFile, writeFile } from 'node:fs/promises';

const form = new FormData();
form.set('image', new Blob([await readFile('input.png')], { type: 'image/png' }), 'input.png');

const res = await fetch('https://geminiwatermarkremoverai.in/api/v1/images/remove-watermark', {
  method: 'POST',
  headers: { Authorization: `Bearer ${process.env.API_KEY}` },
  body: form,
});
if (!res.ok) throw new Error((await res.json()).detail);
await writeFile('clean.png', Buffer.from(await res.arrayBuffer()));
console.log('Removed:', res.headers.get('x-watermark-removed'));

Python (requests)

import os, requests

with open("input.png", "rb") as f:
    res = requests.post(
        "https://geminiwatermarkremoverai.in/api/v1/images/remove-watermark",
        headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
        files={"image": ("input.png", f, "image/png")},
        timeout=60,
    )
res.raise_for_status()
open("clean.png", "wb").write(res.content)
print("Removed:", res.headers["X-Watermark-Removed"])

PHP (cURL)

<?php
$ch = curl_init('https://geminiwatermarkremoverai.in/api/v1/images/remove-watermark');
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('API_KEY')],
    CURLOPT_POSTFIELDS => ['image' => new CURLFile('input.png', 'image/png')],
    CURLOPT_RETURNTRANSFER => true,
]);
$image = curl_exec($ch);
if (curl_getinfo($ch, CURLINFO_HTTP_CODE) === 200) file_put_contents('clean.png', $image);

Check your credits

GET /v1/account — free

{
  "email": "[email protected]",
  "credits": { "remaining": 1999, "expiring_within_30_days": 0, "next_expiry": "2027-10-23T09:12:44.000Z" },
  "limits": { "requests_per_minute": 60, "max_image_mb": 20 },
  "key": { "name": "Production", "prefix": "vm_live_Ab12Cd" }
}

Credits and limits

  • 1 credit per image where a watermark is removed. No watermark found: free.
  • Credits are prepaid and valid for the period shown when you buy them (oldest credits are used first).
  • 60 requests per minute per account (all keys together), and up to 2 images processed at the same time. Need more? Contact us.
  • Images up to 20 MB. Requests time out after 60 seconds.
  • Images are processed in memory and not stored.

Errors

Errors use the standard application/problem+json format with a stable code:

{ "status": 402, "code": "insufficient_credits", "title": "Payment required", "detail": "You have no credits left. Buy more at /dashboard/billing." }
StatusCodeMeaning
400missing_imageNo image in the request, or the image is empty.
400invalid_output_formatoutput_format is not png, jpeg or webp.
401missing_api_keyNo API key was sent.
401invalid_api_keyThe key is wrong or has been revoked.
402insufficient_creditsYour credit balance is zero. Buy credits in the dashboard.
403email_not_verifiedConfirm your email address first.
403account_suspendedThe account is suspended. Contact support.
403ip_not_allowedThe key is locked to other IP addresses. Add this server’s IP to the key in the dashboard.
413image_too_largeThe file is larger than the maximum size, or the image is over 20 megapixels (bigger than any Gemini output).
415unsupported_imageThe file is not a PNG, JPEG or WebP image.
415unsupported_bodyUse multipart/form-data with an "image" field, or raw bytes with an image/* Content-Type.
422unprocessable_imageThe image is corrupted or could not be decoded.
429rate_limitedToo many requests per minute. Wait for the Retry-After seconds.
429too_many_concurrent_requestsMore than 2 images from your account are being processed. Wait for a response before sending the next.
429free_limit_reachedOver 300 images in the last hour had no Gemini watermark (these are free). Send only Gemini images, or wait.
503busyThe service is busy. Retry after a few seconds.
503maintenanceTemporary maintenance. Retry later.

Using the API means you agree to the API terms.