Sora Watermark Remover
Overview
Remove the provider watermark from an existing Sora video using a public `https://sora.chatgpt.com/...` share link.
Authentication
All API requests require a Bearer token in the request header.
Authorization: Bearer YOUR_API_KEYCreate and manage API keys from API Keys or use https://www.apimall.ai/api-keys.
1. Create Generation Task
API Information
- URL:
POST https://gateway.apimall.ai/api/v1/videos/generate - Content-Type:
application/json
Request Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
model | stringsora-watermark-remover | Required | Model identifier for this endpoint. Default: |
type | stringvideo-to-video | Optional | Task mode for the selected model. Default: |
video_url | string | Optional | Source video URL for video-to-video or edit workflows. |
upload_method | strings3oss | Optional | Provider-side storage target for compatible models. |
Request Example
{
"model": "sora-watermark-remover",
"callBackUrl": "https://your-domain.com/api/callback",
"input": {
"video_url": "https://sora.chatgpt.com/p/01JXYZABCDEFGH1234567890",
"upload_method": "s3"
}
}Response Example
{
"success": true,
"data": {
"task_id": "vid_01HQ9MA3M6V6HC6S5R9V7N4Q4D",
"request_id": "provider_req_01HQ9MAGWQJZ0RZN6G40YRMN6E",
"credits_used": 30,
"remaining_credits": 90,
"model": "sora-watermark-remover"
},
"request_id": "req_01HQ9M7J7X9P7Y8T6W5V4U3S2R"
}cURL Example
curl --request POST 'https://gateway.apimall.ai/api/v1/videos/generate' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"model": "sora-watermark-remover",
"callBackUrl": "https://your-domain.com/api/callback",
"input": {
"video_url": "https://sora.chatgpt.com/p/01JXYZABCDEFGH1234567890",
"upload_method": "s3"
}
}'JavaScript Example
const API_KEY = process.env.APIMALL_API_KEY;
const CREATE_URL = 'https://gateway.apimall.ai/api/v1/videos/generate';
const payload = {
"model": "sora-watermark-remover",
"callBackUrl": "https://your-domain.com/api/callback",
"input": {
"video_url": "https://sora.chatgpt.com/p/01JXYZABCDEFGH1234567890",
"upload_method": "s3"
}
};
async function createTask() {
const response = await fetch(CREATE_URL, {
method: 'POST',
headers: {
Authorization: `Bearer ${API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify(payload),
});
if (!response.ok) {
throw new Error(`Create task failed: ${response.status} ${response.statusText}`);
}
const json = await response.json();
const taskId = json.data?.task_id;
if (!taskId) {
throw new Error('Missing task_id in create response');
}
return taskId;
}
async function getTask(taskId) {
const response = await fetch(`https://gateway.apimall.ai/api/v1/videos/${encodeURIComponent(String(taskId))}`, {
headers: {
Authorization: `Bearer ${API_KEY}`,
},
});
if (!response.ok) {
throw new Error(`Query task failed: ${response.status} ${response.statusText}`);
}
const json = await response.json();
return {
...json,
};
}
async function waitForTask(taskId) {
while (true) {
const task = await getTask(taskId);
const state = task.data?.status;
if (state === 'completed') {
return task;
}
if (state === 'failed') {
throw new Error(task.data?.failMsg || 'Task failed');
}
await new Promise((resolve) => setTimeout(resolve, 3000));
}
}
(async () => {
const taskId = await createTask();
const result = await waitForTask(taskId);
console.log(result);
})().catch(console.error);Response Parameters
| Parameter | Type | Description |
|---|---|---|
success | boolean | Whether the request completed successfully. |
data.task_id | string | Task ID used to query task status and results. |
data.request_id | string | Provider-side request identifier for tracing. |
data.credits_used | integer | Credits consumed by this request. |
data.remaining_credits | integer | Credits remaining after the request. |
data.model | string | Model name used for the task. |
request_id | string | Request identifier for debugging and support. |
Error Response Example
{
"success": false,
"error": {
"code": "insufficient_credits",
"message": "Insufficient credits"
},
"request_id": "req_01HQ9M7J7X9P7Y8T6W5V4U3S2R"
}2. Query Task Status
API Information
- URL:
GET https://gateway.apimall.ai/api/v1/videos/{task_id}
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
task_id | string | Required | Video task identifier returned by `POST /api/v1/videos/generate`. |
Request Example
GET https://gateway.apimall.ai/api/v1/videos/vid_01HQ9MA3M6V6HC6S5R9V7N4Q4DcURL Example
curl --request GET 'https://gateway.apimall.ai/api/v1/videos/vid_01HQ9MA3M6V6HC6S5R9V7N4Q4D' \
--header 'Authorization: Bearer YOUR_API_KEY'Response Example
{
"success": true,
"data": {
"task_id": "vid_01HQ9MA3M6V6HC6S5R9V7N4Q4D",
"model": "sora-watermark-remover",
"status": "completed",
"output": {
"resultUrls": [
"https://cdn.apimall.ai/generated/video-01.mp4"
]
},
"video_url": "https://cdn.apimall.ai/generated/result.mp4",
"error_message": null,
"credits_used": 30,
"credits_refunded": 0,
"created_at": "2026-03-12T09:35:00.000Z",
"updated_at": "2026-03-12T09:36:48.000Z",
"completed_at": "2026-03-12T09:36:48.000Z"
},
"request_id": "req_01HQ9M7J7X9P7Y8T6W5V4U3S2R"
}Response Parameters
| Parameter | Type | Description |
|---|---|---|
success | boolean | Whether the request completed successfully. |
data.task_id | string | Task ID used to query task status and results. |
data.model | string | Model name used for the task. |
data.status | string | Current status value returned by the API. Generation task endpoints use normalized values such as `pending`, `processing`, `completed`, `failed`, or `unknown`; management endpoints may return resource states such as `created`, `revoked`, or `active`. |
data.output.resultUrls | array | Generated result URLs returned by the upstream provider payload. |
data.video_url | string | Hosted video result URL. |
data.error_message | string | Failure reason returned when the music task does not complete successfully. |
data.credits_used | integer | Credits consumed by this request. |
data.credits_refunded | integer | Credits refunded after failure or partial refund handling. |
data.created_at | string | Creation timestamp for the returned resource or task record. |
data.updated_at | string | Last update timestamp for the returned resource or task record. |
data.completed_at | string | Completion timestamp for the task when available. |
request_id | string | Request identifier for debugging and support. |
Usage Flow
- Create a generation task by calling `POST https://gateway.apimall.ai/api/v1/videos/generate`.
- Persist `data.task_id` from the create response so you can resume polling later.
- Poll `GET https://gateway.apimall.ai/api/v1/videos/{task_id}` until `data.status` reaches `completed` or `failed`.
- Read the generated video URLs from the final task payload.
Integration Notes
- Store your API key on the server side only.
- Persist the returned `data.task_id` immediately so you can resume polling after restarts.
- Use an `Idempotency-Key` header when retrying create requests from your backend.
- Poll the task endpoint every few seconds with backoff until `data.status` reaches `completed` or `failed`.
- Use `data.video_url` as the final hosted asset URL.
Error Codes
Common Error Codes
| Status Code | Description |
|---|---|
| 200 | Request successful |
| 400 | Invalid request parameters |
| 401 | API key required or invalid API key |
| 402 | Insufficient credits |
| 403 | API access not approved or request made on a non-gateway host |
| 409 | Idempotency-Key conflict |
| 429 | Rate limit exceeded or too many concurrent jobs |
| 503 | Upstream provider is busy or temporarily unavailable |
| 451 | Prompt blocked by content moderation |
| 500 | Internal server error |