Watermark API and Skill Docs

Install the OpenClaw skill or integrate the runtime-neutral watermark API with authenticated uploads, async task polling, retries, and result downloads.

Choose an Integration Layer

Airemovewatermark exposes the same workflow through three layers:

LayerBest fitCompatibility
ClawHub packageOpenClaw and ClawHub-style runtimesNative skill manifest and folder layout
Bundled Node scriptAgents or automations that can run local Node commandsPortable command interface with structured JSON output
HTTP APIBackends, custom agents, and other automation platformsRuntime-neutral request and response contract

The published skill is not a native package for every agent framework. Runtimes that do not load OpenClaw-style skills should call the bundled Node script or the HTTP API directly.

API_BASE_URL is a deployment override, not an adapter for unrelated watermark APIs. A replacement service must implement the endpoints, response envelope, task states, and output-host behavior documented below.

Authentication

Create a key at API key settings, then send it with either:

Authorization: Bearer <api_key>

or:

x-api-key: <api_key>

Keep API keys in a server-side secret store or the agent runtime environment. Do not embed them in client-side code, prompts, screenshots, or committed skill files. Copy the raw sk-... secret shown once by the dashboard; do not hash it yourself. The API hashes it internally. A revoked or expired key fails both credit checks and watermark requests.

The examples below assume:

export API_BASE_URL="https://airemovewatermark.net"
export API_KEY="sk-your-key-shown-once"

Quickstart: One Request Entry Point

POST /api/v1/watermark/remove is the recommended endpoint for agents. It stores one input, creates one task, and optionally performs a short polling window.

Check credits

curl --silent --show-error \
  --header "Authorization: Bearer $API_KEY" \
  "$API_BASE_URL/api/v1/credits"

Submit a local image

curl --silent --show-error \
  --request POST \
  --header "Authorization: Bearer $API_KEY" \
  --form "file=@/absolute/path/to/image.png" \
  --form "wait=true" \
  "$API_BASE_URL/api/v1/watermark/remove"

The multipart field is named file. An optional fileName field can override the uploaded filename.

Submit a remote image URL

curl --silent --show-error \
  --request POST \
  --header "Authorization: Bearer $API_KEY" \
  --header "Content-Type: application/json" \
  --data '{"imageUrl":"https://example.com/image.png","wait":true}' \
  "$API_BASE_URL/api/v1/watermark/remove"

imageUrl must use HTTP or HTTPS and must be reachable by the service. Send exactly one input source: file or imageUrl, never both.

Poll an unfinished task

curl --silent --show-error \
  --header "Authorization: Bearer $API_KEY" \
  "$API_BASE_URL/api/v1/watermark/tasks/task_xxx"

wait=true polls for up to about 30 seconds. It can still return an unfinished task. Continue polling while the task is queued, processing, or finalizing. Wait at least 1.6 seconds between status requests.

Retry a failed task

curl --silent --show-error \
  --request POST \
  --header "Authorization: Bearer $API_KEY" \
  --header "Content-Type: application/json" \
  --data '{}' \
  "$API_BASE_URL/api/v1/watermark/tasks/task_xxx/retry"

Retry only when the task response has status: "failed" and canRetry: true.

Response Contract

Every JSON response uses this envelope:

{
  "code": 0,
  "message": "ok",
  "data": {}
}
  • code: 0 means the API operation succeeded.
  • code: -1 means the request failed; read message.
  • Clients must inspect both the HTTP status and the JSON code. Some application-level validation errors use a JSON error envelope even when the HTTP response itself is readable.

A create or status response includes a task object similar to:

{
  "code": 0,
  "message": "ok",
  "data": {
    "completed": false,
    "pollUrl": "/api/v1/watermark/tasks/task_xxx",
    "task": {
      "id": "task_xxx",
      "taskId": "task_xxx",
      "status": "processing",
      "costCredits": 1,
      "outputUrl": null,
      "outputFormat": null,
      "expiresAt": "2026-08-19T00:00:00.000Z",
      "error": null,
      "canRetry": false
    }
  }
}

Use task.id or task.taskId for later status requests. Treat provider identifiers as implementation details. When status is succeeded, outputUrl, outputFormat, dimensions, and expiry information describe the stored result.

Task Lifecycle

StatusMeaningClient action
queuedAccepted and waitingPoll again
processingAI processing is runningPoll again
finalizingResult is being validated and storedPoll again
succeededOutput is readyDownload outputUrl
failedProcessing did not completeRead error; retry only when allowed

One credit is reserved when a task is created successfully. Failed processing tasks return the reserved credit automatically. Check the current balance before starting a large automated workflow.

Current Input and Queue Limits

The current public service defaults are:

  • formats: JPG/JPEG, PNG, and WebP
  • maximum file size: 10MB
  • minimum width and height: 64px
  • maximum image edge: 4096px
  • maximum image area: 16 megapixels
  • maximum aspect ratio: 1:4
  • maximum active queue: 10 tasks per account

Deployment configuration can change operational limits. Treat a validation message returned by the API as authoritative and avoid retrying an unchanged invalid input.

Data Handling and Results

  • Local files are uploaded to the remote API; processing is not local.
  • Remote image URLs are fetched by the service before task creation.
  • Input and output assets remain available in the account for up to 48 hours.
  • Download completed work promptly; output URLs are temporary.
  • The bundled script downloads only when --download true is set.
  • The published script accepts HTTPS results from the API base host or the official Airemovewatermark asset host.
  • Process only images you own or are explicitly authorized to edit. See the Acceptable Use Policy and Privacy Policy.

Install the Published Skill

The current package is airemove-watermark version 0.1.7.

  1. Open the ClawHub listing.
  2. Create an API key.
  3. Set API_KEY in the OpenClaw environment.
  4. Ask the agent to process an authorized local file or remote image URL.

With OpenClaw 2026.5.7, the tested CLI installation command is:

openclaw skills install airemove-watermark

ClawHub may display the scoped command openclaw skills install @isees/airemove-watermark. OpenClaw 2026.5.7 rejects that form as an invalid slug. Use the tested unscoped command above or the version-pinned ZIP below.

For a version-pinned local installation, download:

https://assets.airemovewatermark.net/skills/remove-watermark-skill-0.1.7.zip

Extract it into ./skills or ~/.openclaw/skills. The archive contains:

  • manifest.yaml
  • SKILL.md
  • scripts/remove_watermark.mjs

Required runtime capability:

  • Node execution
  • outbound HTTPS access
  • API_KEY environment variable

Optional configuration:

  • API_BASE_URL
  • REMOVE_WATERMARK_API_KEY
  • REMOVE_WATERMARK_BASE_URL
  • command-level --api-key and --base-url

The rwm_xxx value shown in the published 0.1.7 examples is a legacy placeholder, not a required prefix. Supply the raw sk-... key shown once by the current dashboard.

Bundled Script Commands

Run these commands from the installed airemove-watermark directory:

node scripts/remove_watermark.mjs credits
node scripts/remove_watermark.mjs remove \
  --file /absolute/path/to/image.png \
  --wait true \
  --download true
node scripts/remove_watermark.mjs remove \
  --image-url https://example.com/image.png \
  --wait true
node scripts/remove_watermark.mjs task \
  --task-id task_xxx \
  --download true

The script prints structured JSON to standard output for success and failure. Prefer these top-level fields:

  • status
  • task_id
  • completed
  • result_file
  • output_url
  • result_summary
  • next_action

With --download true, completed results are stored under:

.openclaw-artifacts/remove-watermark/

Advanced Multi-endpoint Flow

Use the lower-level endpoints only when your integration needs to manage upload metadata and task creation separately:

  1. GET /api/v1/credits
  2. POST /api/v1/uploads/images
  3. POST /api/v1/watermark/tasks
  4. GET /api/v1/watermark/tasks/:id
  5. POST /api/v1/watermark/tasks/:id/retry

For POST /api/v1/uploads/images, send multipart field files and scope=watermark. The task-creation endpoint expects the returned storage URL, key, hash, format, MIME type, file size, width, and height. Most agent clients should prefer the single-entry /api/v1/watermark/remove endpoint.

Failure Handling

Message or conditionRecommended action
Missing or invalid API keyReplace the credential; do not retry unchanged
Insufficient creditsAdd credits before another create request
Unsupported format or dimensionsConvert or resize the source image
Remote URL fetch timeoutVerify the URL is public and retry later
Active queue limit reachedWait for current tasks to finish
Temporary provider or network errorRetry after a delay
Failed task with canRetry: trueCall the retry endpoint once, then poll

Do not loop indefinitely. Stop on a terminal failed status unless the response explicitly allows a retry.