> ## Documentation Index
> Fetch the complete documentation index at: https://apixo.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Video Watermark Remover

> APIXO video watermark removal API for single-video cleanup

## Overview

Video Watermark Remover is an asynchronous video-to-video API for removing watermarks from one source video. Billing is based on billable video duration.

| Capability                | Value                      |
| ------------------------- | -------------------------- |
| Model ID                  | `video-watermark-remover`  |
| Mode                      | `video-to-video`           |
| Input videos              | Exactly 1 public video URL |
| Minimum billable duration | 5 seconds                  |
| Billing                   | Per second                 |

## Endpoint and authentication

Base URL:

```text theme={null}
https://api.apixo.ai/api/v1
```

| Method | Endpoint                                              | Purpose                               |
| ------ | ----------------------------------------------------- | ------------------------------------- |
| `POST` | `/generateTask/video-watermark-remover`               | Submit a watermark-removal task       |
| `GET`  | `/statusTask/video-watermark-remover?taskId={taskId}` | Poll task status and retrieve results |

All requests require your APIXO API key:

```http theme={null}
Authorization: Bearer YOUR_API_KEY
```

Submit requests also require:

```http theme={null}
Content-Type: application/json
```

## Copy-paste async quickstart

```bash theme={null}
curl -X POST "https://api.apixo.ai/api/v1/generateTask/video-watermark-remover" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "request_type": "async",
    "input": {
      "mode": "video-to-video",
      "video_urls": [
        "https://example.com/input.mp4"
      ]
    }
  }'
```

Successful response:

```json theme={null}
{
  "code": 200,
  "message": "success",
  "data": {
    "taskId": "task_12345678"
  }
}
```

Save the `taskId`; you need it to poll for the final result.

## Poll for result

```bash theme={null}
curl -X GET "https://api.apixo.ai/api/v1/statusTask/video-watermark-remover?taskId=task_12345678" \
  -H "Authorization: Bearer YOUR_API_KEY"
```

Success response:

```json theme={null}
{
  "code": 200,
  "message": "success",
  "data": {
    "taskId": "task_12345678",
    "state": "success",
    "resultJson": "{\"resultUrls\":[\"https://file.apixo.ai/clean-video.mp4\"]}",
    "createTime": 1767965610929,
    "completeTime": 1767965652317,
    "costTime": 41388
  }
}
```

Parse `resultJson` after `state` becomes `success`:

```javascript theme={null}
const payload = JSON.parse(data.resultJson);
const videoUrls = payload.resultUrls;
```

## Request body

```json theme={null}
{
  "request_type": "async",
  "callback_url": "https://your-server.com/webhooks/apixo",
  "input": {
    "mode": "video-to-video",
    "video_urls": [
      "https://example.com/input.mp4"
    ]
  }
}
```

## Parameters

<ParamField body="request_type" type="string" required default="async">
  Result delivery mode. Use `async` for polling with `statusTask`, or `callback` for webhook delivery.
</ParamField>

<ParamField body="callback_url" type="string">
  Required when `request_type` is `callback`. Must be a callback URL that can receive the final task payload. See [Webhooks](/docs/api-reference/webhooks).
</ParamField>

<ParamField body="input" type="object" required>
  Video Watermark Remover input parameters.

  <Expandable title="properties">
    <ParamField body="mode" type="string" default="video-to-video">
      Watermark-removal mode. The only supported value is `video-to-video`. If omitted, the backend defaults to `video-to-video`.
    </ParamField>

    <ParamField body="video_urls" type="string[]" required>
      Source video URLs. Must contain exactly 1 non-empty public video URL.
    </ParamField>
  </Expandable>
</ParamField>

## Response format

### Submit task response

`POST /generateTask/video-watermark-remover` returns a task ID when the task is accepted:

<ResponseField name="code" type="integer">
  API status code. `200` means the task was accepted.
</ResponseField>

<ResponseField name="message" type="string">
  Human-readable status message.
</ResponseField>

<ResponseField name="data.taskId" type="string">
  Unique task identifier used with the status endpoint.
</ResponseField>

### Status response fields

<ResponseField name="taskId" type="string">
  Unique task identifier.
</ResponseField>

<ResponseField name="state" type="string">
  Current task state: `pending`, `processing`, `success`, or `failed`.
</ResponseField>

<ResponseField name="resultJson" type="string">
  JSON string containing the cleaned video URL in `resultUrls`. Present when `state` is `success`.
</ResponseField>

<ResponseField name="failCode" type="string">
  Machine-readable failure code. Present when `state` is `failed`.
</ResponseField>

<ResponseField name="failMsg" type="string">
  Human-readable failure message. Present when `state` is `failed`.
</ResponseField>

<ResponseField name="createTime" type="integer">
  Task creation timestamp in Unix milliseconds.
</ResponseField>

<ResponseField name="completeTime" type="integer">
  Task completion timestamp in Unix milliseconds. Present after completion.
</ResponseField>

<ResponseField name="costTime" type="integer">
  Processing duration in milliseconds when available.
</ResponseField>

## Webhook callback mode

Use callback mode when your backend should receive the final result automatically instead of polling.

```bash theme={null}
curl -X POST "https://api.apixo.ai/api/v1/generateTask/video-watermark-remover" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "request_type": "callback",
    "callback_url": "https://your-server.com/webhooks/apixo",
    "input": {
      "mode": "video-to-video",
      "video_urls": [
        "https://example.com/input.mp4"
      ]
    }
  }'
```

See [Webhooks](/docs/api-reference/webhooks) for delivery requirements and retry behavior.

## Billing

Video Watermark Remover is billed per billable second. The billable duration is `max(5 seconds, actual input video duration)`.

| Billing dimension         | Value             |
| ------------------------- | ----------------- |
| Unit                      | `PER_SECOND`      |
| APIXO price               | `$0.010 / second` |
| Minimum billable duration | `5` seconds       |

Billing behavior:

```text theme={null}
billable_seconds = max(5, actual_video_seconds)
precharge = billable_seconds * 0.010
```

For current route and market comparison pricing, see [Pricing](https://apixo.ai/pricing).

## Latency and polling

Video Watermark Remover tasks are asynchronous. Actual latency varies by source video duration, file download speed, and queue load.

| Use case                       | Recommended first poll  | Poll interval                 |
| ------------------------------ | ----------------------- | ----------------------------- |
| Short video                    | 30s after task creation | 10s-20s                       |
| Longer or production workloads | Prefer callback mode    | If polling, use 20s or longer |

<Tip>
  For production queues or longer videos, use callback mode to avoid frequent polling.
</Tip>

Rate limits and concurrency can vary by account, API key, and route. If you receive `429`, slow down requests and retry with backoff. For account-level details, see [System APIs](/docs/api-reference/system).

## Errors and troubleshooting

### HTTP errors

| Code  | Meaning                                        | What to do                                       |
| ----- | ---------------------------------------------- | ------------------------------------------------ |
| `400` | Invalid request body, mode, or video URL shape | Fix the request before retrying                  |
| `401` | Missing or invalid API key                     | Check the `Authorization` header                 |
| `402` | Insufficient balance or quota                  | Add balance or switch account/key                |
| `403` | Key or route cannot access the model           | Check permissions and route strategy             |
| `404` | Task not found                                 | Verify the `taskId` and model ID                 |
| `429` | Rate limit or concurrency limit reached        | Retry with exponential backoff                   |
| `500` | Server or unmapped model error                 | Retry with backoff                               |
| `502` | Model service error                            | Retry with backoff                               |
| `504` | Model service timeout                          | Retry or use callback mode for long-running jobs |

### Request validation

| Condition                       | Backend behavior                                                           |
| ------------------------------- | -------------------------------------------------------------------------- |
| Missing `input`                 | Returns `The required parameter {{input}} is missing.`                     |
| Invalid `mode`                  | Returns `Invalid mode type. Supported: video-to-video`                     |
| Missing `video_urls`            | Returns `The required parameter {{video_urls}} is missing.`                |
| `video_urls` is not an array    | Returns `The parameter {{video_urls}} must be Array type.`                 |
| `video_urls` length is not 1    | Returns `The parameter {{video_urls}} must contain exactly 1 video.`       |
| `video_urls[0]` is not a string | Returns `The parameter {{video_urls}} Array elements must be String type.` |
| `video_urls[0]` is empty        | Returns `The parameter {{video_urls}} cannot contain empty string.`        |

See [Error Codes](/docs/api-reference/errors) for the full error reference.

## Related links

* [Generation API Overview](/docs/models)
* [Generate Task](/docs/api-reference/generate-task)
* [Status Task](/docs/api-reference/status-task)
* [Webhooks](/docs/api-reference/webhooks)
* [Error Codes](/docs/api-reference/errors)
* [Parameter Specification](/docs/api-reference/parameters)
* [Pricing](https://apixo.ai/pricing)
