curl --request POST \
--url https://www.gostudio.ai/api/v2/apps/watermark-remover \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"image_url": "https://example.com/watermarked.jpg"
}
'{
"status": 200,
"data": {
"job_id": 12345,
"status": "completed",
"model_id": "dewatermark/watermark-remover-pro",
"output_urls": [
"<string>"
],
"credits_deducted": 4,
"credit_balance": 38
}
}{
"status": 400,
"error": {
"type": "validation_error",
"code": "invalid_input",
"dev": 40001,
"message": "Some information is invalid."
}
}{
"status": 401,
"error": {
"type": "authentication_error",
"code": "unauthorized",
"dev": 40100,
"message": "Missing or invalid Authorization Bearer token."
}
}{
"status": 402,
"error": {
"type": "billing_error",
"code": "insufficient_credits",
"dev": 40200,
"message": "You don't have enough credits."
}
}{
"status": 403,
"error": {
"type": "permission_error",
"code": "forbidden",
"dev": 40300,
"message": "You don't have permission for this action."
}
}{
"status": 422,
"error": {
"type": "provider_error",
"code": "content_filtered",
"dev": 42205,
"message": "We couldn't generate this image. Please try a different prompt or image."
}
}{
"status": 429,
"error": {
"type": "rate_limit_error",
"code": "rate_limited",
"dev": 42900,
"message": "You're doing that too often. Please wait a moment."
}
}{
"status": 500,
"error": {
"type": "system_error",
"code": "internal_error",
"dev": 50000,
"message": "Something went wrong on our end."
}
}{
"status": 502,
"error": {
"type": "provider_error",
"code": "provider_bad_gateway",
"dev": 50200,
"message": "Generation is having trouble right now. Please try again."
}
}{
"status": 503,
"error": {
"type": "system_error",
"code": "service_unavailable",
"dev": 50300,
"message": "Auth service is temporarily unavailable."
}
}{
"status": 504,
"error": {
"type": "provider_error",
"code": "generation_timeout",
"dev": 50400,
"message": "The request took too long. Please try again."
}
}Remove a watermark
Submits an image for watermark removal. This is the endpoint most integrations should use — it validates the request, runs the generation, writes a generation log, and deducts credits in one call.
This call blocks until the image is ready. Fast models return almost immediately. Slower models are polled server-side on your behalf, so the response still arrives as a completed 200 — but it can take up to four minutes, and the request is cut off at five. Set your client’s HTTP timeout accordingly; the default in most HTTP libraries is far too short.
You never need to poll this endpoint’s result yourself, and there is no fire-and-forget mode — the call always holds the connection until the generation finishes, and the completed 200 body is returned either way. A webhook_url gets you a second copy of that same result payload POSTed to your server; it does not shorten the request.
On the lite tier that webhook is delivered once, on success only. On the async tiers (pro, advance) it can also arrive with status: "failed" and an error field when the provider reports a failure — alongside the HTTP error response — and a completed job may be delivered more than once. Treat deliveries as idempotent and key them on job_id; do not assume output_urls are byte-identical across two deliveries of the same job.
If an async job (pro / advance) is accepted by the provider and is later reported failed, the response is 500 internal_error, not 502. The generation is still marked failed and the credits reserved for it are refunded. Handle all 5xx responses uniformly rather than matching on a specific status.
Allowed callers: user. An internal service token passes the auth gate but carries no user context, so it cannot submit a generation here.
curl --request POST \
--url https://www.gostudio.ai/api/v2/apps/watermark-remover \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"image_url": "https://example.com/watermarked.jpg"
}
'{
"status": 200,
"data": {
"job_id": 12345,
"status": "completed",
"model_id": "dewatermark/watermark-remover-pro",
"output_urls": [
"<string>"
],
"credits_deducted": 4,
"credit_balance": 38
}
}{
"status": 400,
"error": {
"type": "validation_error",
"code": "invalid_input",
"dev": 40001,
"message": "Some information is invalid."
}
}{
"status": 401,
"error": {
"type": "authentication_error",
"code": "unauthorized",
"dev": 40100,
"message": "Missing or invalid Authorization Bearer token."
}
}{
"status": 402,
"error": {
"type": "billing_error",
"code": "insufficient_credits",
"dev": 40200,
"message": "You don't have enough credits."
}
}{
"status": 403,
"error": {
"type": "permission_error",
"code": "forbidden",
"dev": 40300,
"message": "You don't have permission for this action."
}
}{
"status": 422,
"error": {
"type": "provider_error",
"code": "content_filtered",
"dev": 42205,
"message": "We couldn't generate this image. Please try a different prompt or image."
}
}{
"status": 429,
"error": {
"type": "rate_limit_error",
"code": "rate_limited",
"dev": 42900,
"message": "You're doing that too often. Please wait a moment."
}
}{
"status": 500,
"error": {
"type": "system_error",
"code": "internal_error",
"dev": 50000,
"message": "Something went wrong on our end."
}
}{
"status": 502,
"error": {
"type": "provider_error",
"code": "provider_bad_gateway",
"dev": 50200,
"message": "Generation is having trouble right now. Please try again."
}
}{
"status": 503,
"error": {
"type": "system_error",
"code": "service_unavailable",
"dev": 50300,
"message": "Auth service is temporarily unavailable."
}
}{
"status": 504,
"error": {
"type": "provider_error",
"code": "generation_timeout",
"dev": 50400,
"message": "The request took too long. Please try again."
}
}Authorizations
Supabase user JWT (or an internal service token). Send as Authorization: Bearer <token>.
Body
Publicly accessible http/https URL of the watermarked image. The API fetches it server-side, so it must not sit behind authentication or a firewall.
"https://example.com/watermarked.jpg"
Model to run. Accepts either a full model ID or one of the friendly tier aliases lite, pro, advance. Defaults to dewatermark/watermark-remover-pro (the lite tier). Cost per run: lite 4 credits, pro 4 credits, advance 10 credits. Call /info for the authoritative figures rather than hard-coding these — both the model list and the pricing can change.
"pro"
Optional guidance. Ignored by models whose requires_prompt is false in the info response.
HTTPS URL to receive the result when the generation finishes. Must be HTTPS; an http:// URL is rejected with 400 invalid_webhook_url. Delivery is best-effort and fire-and-forget: the POST is sent once and never retried, the response status is ignored, and there is no signature header. If a delivery is missed, reconcile with GET /api/v2/apps/watermark-remover/{jobId}.
"https://your-app.com/webhooks/gostudio"

