Documentation

Quickstart

Watermark your first image with one HTTP request — from zero to a downloadable result in about five minutes.

This guide watermarks an image with a single synchronous call. You send a source URL, Fotovid processes it, and you get the result back in the same response — no polling, no webhooks.

Get an API key

Create a key in the Fotovid dashboard under Account → API Keys. The full key is shown once at creation, in the form p6_<key_id>:<secret> — copy it now and store it somewhere safe.

See Authentication for the details.

Make your first call

Send a POST to /v1/image/watermark with a publicly reachable source_url and your watermark params.

curl -X POST https://api.fotovid.co/v1/image/watermark \
  -H "Authorization: Bearer p6_<key_id>:<secret>" \
  -H "Content-Type: application/json" \
  -d '{
    "source_url": "https://cdn.example.com/photo.jpg",
    "params": { "watermark_type": "text", "text": "Fotovid.co", "position": "bottom-right" }
  }'
const res = await fetch("https://api.fotovid.co/v1/image/watermark", {
  method: "POST",
  headers: {
    Authorization: "Bearer p6_<key_id>:<secret>",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    source_url: "https://cdn.example.com/photo.jpg",
    params: { watermark_type: "text", text: "Fotovid.co", position: "bottom-right" },
  }),
});

const result = await res.json();
console.log(result.url);
import requests

res = requests.post(
    "https://api.fotovid.co/v1/image/watermark",
    headers={"Authorization": "Bearer p6_<key_id>:<secret>"},
    json={
        "source_url": "https://cdn.example.com/photo.jpg",
        "params": {"watermark_type": "text", "text": "Fotovid.co", "position": "bottom-right"},
    },
)
print(res.json()["url"])

Read the result

A synchronous call returns 200 OK with a flat body. There is no status field — a 200 response is success.

{
  "id": "01JABCDEFGHJKMNPQRSTVWXYZ",
  "type": "image.watermark",
  "url": "https://tempfile.fotovid.co/i/<hex>.webp",
  "expires_at": "2026-06-10T12:00:00Z"
}

url is a time-limited download link to your watermarked image. Fetch it before expires_at (outputs are retained for 7 days).

The output defaults to WebP. Override it with params.output_format (webp | jpeg | png) and params.quality (1–100). The full parameter list is in the watermarking guide.

Handling larger files

Synchronous calls are meant for small, fast jobs (roughly a 10-second budget, source images up to 128 MiB). For large or long inputs — or if a sync call returns 413, 409, or 504 — use the asynchronous task API instead:

curl -X POST https://api.fotovid.co/v1/tasks \
  -H "Authorization: Bearer p6_<key_id>:<secret>" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "image.watermark",
    "source_url": "https://cdn.example.com/photo.jpg",
    "params": { "watermark_type": "text", "text": "Fotovid.co" }
  }'

This returns 201 with status: "starting"; then either poll GET /v1/tasks/{id} until it reaches succeeded or supply a webhook URL to be notified. The output there lives in outputs[].url.

Learn when to use each in Synchronous vs. asynchronous, and the full async flow in Tasks & polling.

Next steps