curl --request POST \
--url https://www.gostudio.ai/api/v2/apps/watermark-remover/generate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"image_url": "https://example.com/watermarked.jpg",
"model_id": "pro",
"prompt": "<string>",
"webhook_url": "https://your-app.com/webhooks/gostudio"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
image_url: 'https://example.com/watermarked.jpg',
model_id: 'pro',
prompt: '<string>',
webhook_url: 'https://your-app.com/webhooks/gostudio'
})
};
fetch('https://www.gostudio.ai/api/v2/apps/watermark-remover/generate', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://www.gostudio.ai/api/v2/apps/watermark-remover/generate"
payload = {
"image_url": "https://example.com/watermarked.jpg",
"model_id": "pro",
"prompt": "<string>",
"webhook_url": "https://your-app.com/webhooks/gostudio"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"status": 200,
"data": {
"kind": "sync",
"model_id": "<string>",
"output_urls": [
"<string>"
]
}
}{
"status": 202,
"data": {
"kind": "async",
"model_id": "<string>",
"provider_job_id": "<string>",
"status": "processing"
}
}{
"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": 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."
}
}Generate only (no logging or billing)
Runs the model and returns the output without writing a generation log or deducting credits. The result never appears in /api/v2/me/generations, and it cannot be finalized through /record — that endpoint only finalizes a generation log that already exists, and nothing creates one for this call. Use it only when you do your own logging and billing outside GoStudio; most integrations should use POST /api/v2/apps/watermark-remover instead, which logs the job and charges credits for you.
webhook_url also behaves differently here: it is registered directly with the upstream model provider as its own callback, so your server receives the provider’s raw, provider-specific body rather than the GoStudio result payload. Synchronous models — including the default lite tier — ignore it and never call back at all.
Allowed callers: user. An internal service token passes the auth gate but carries no user context, so it cannot start a generation here.
curl --request POST \
--url https://www.gostudio.ai/api/v2/apps/watermark-remover/generate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"image_url": "https://example.com/watermarked.jpg",
"model_id": "pro",
"prompt": "<string>",
"webhook_url": "https://your-app.com/webhooks/gostudio"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
image_url: 'https://example.com/watermarked.jpg',
model_id: 'pro',
prompt: '<string>',
webhook_url: 'https://your-app.com/webhooks/gostudio'
})
};
fetch('https://www.gostudio.ai/api/v2/apps/watermark-remover/generate', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://www.gostudio.ai/api/v2/apps/watermark-remover/generate"
payload = {
"image_url": "https://example.com/watermarked.jpg",
"model_id": "pro",
"prompt": "<string>",
"webhook_url": "https://your-app.com/webhooks/gostudio"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"status": 200,
"data": {
"kind": "sync",
"model_id": "<string>",
"output_urls": [
"<string>"
]
}
}{
"status": 202,
"data": {
"kind": "async",
"model_id": "<string>",
"provider_job_id": "<string>",
"status": "processing"
}
}{
"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": 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."
}
}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.
Behaves differently here than on POST /api/v2/apps/watermark-remover. This URL is registered directly with the upstream model provider as its own callback, so what your server receives is the provider's raw, provider-specific body (Replicate / Astria / Fal) with provider-hosted output URLs — not the GoStudio result payload, and not GoStudio CDN URLs. It is also ignored entirely by synchronous models, including the default dewatermark/watermark-remover-pro (lite), which return their output in the 200 response and never call back at all. Use POST /api/v2/apps/watermark-remover if you want the documented result payload delivered to your endpoint.
"https://your-app.com/webhooks/gostudio"

