Subclip Logo

Developer API

Subclip Enhance Audio API

Upload an audio or video file, run Subclip's Cleanvoice or Resemble AI enhancement pipeline, poll job status, and download the result.

Get your API key from Developer Portal. API jobs use the same AI credits as the app. Credits are deducted after successful processing. Outputs and input files are deleted 1 hour after completion to free storage quota.

For current credit costs, see API credit costs.

OpenAPI-style reference

API endpoints

Enhance uploaded audio or video and return a cleaned audio/video output.

API v1 storage handling: files uploaded or generated through /api/v1are auto-cleaned and do not count toward the user's storage quota.
POST/api/v1/enhance-video/uploads

Create Enhance Audio upload URL

Creates an upload URL and pending project for an audio or video source.

Bearer auth

Parameters

FieldTypeRequiredDetails
fileNamestringYes
Source file name
body
contentTypestringYes
Supported audio or video content type
body
fileSizenumberYes
Declared source size in bytes, max 5GB
body
projectNamestringNo
Optional project name
body

Examples

Request

{
  "fileName": "podcast.mp4",
  "contentType": "video/mp4",
  "fileSize": 104857600,
  "projectName": "Clean podcast"
}

Response

{
  "projectId": "veproj_...",
  "uploadUrl": "https://...",
  "objectKey": "user_.../voice-enhance/veproj_.../source/podcast.mp4",
  "expiresIn": 900
}

Responses

StatusDescription
200Request succeeded
400Invalid request body or unsupported parameter
401Missing, invalid, or revoked API key
429Rate limit exceeded
500Unexpected processing error
POST/api/v1/enhance-video/jobs

Start Enhance Audio job

Checks duration-based credits, then enhances uploaded audio or video.

Bearer auth

Parameters

FieldTypeRequiredDetails
projectIdstringYes
Project ID returned by upload endpoint
durationSecondsnumberNo
Optional expected duration. Subclip probes and rejects large mismatches
providercleanvoice | resembleNo
Enhancement provider
bodydefault: cleanvoiceProvider options

Examples

Request

{
  "projectId": "veproj_...",
  "durationSeconds": 180,
  "provider": "cleanvoice"
}

Response

{
  "projectId": "veproj_...",
  "status": "queued",
  "runId": "run_...",
  "estimatedCredits": 9,
  "statusUrl": "/api/v1/.../jobs/veproj_...",
  "downloadUrl": "/api/v1/.../jobs/veproj_.../download"
}

Responses

StatusDescription
200Request succeeded
400Invalid request body or unsupported parameter
401Missing, invalid, or revoked API key
429Rate limit exceeded
500Unexpected processing error
GET/api/v1/enhance-video/jobs/{projectId}

Get Enhance Audio status

Returns enhancement progress and output metadata.

Bearer auth

Parameters

FieldTypeRequiredDetails
projectIdstringYes
Enhance Audio project ID
path

Examples

Response

{
  "projectId": "veproj_...",
  "status": "queued | processing | completed | failed",
  "progress": 100,
  "outputReady": true,
  "creditsUsed": 9,
  "errorMessage": null,
  "updatedAt": "2026-06-19T14:20:00.000Z"
}

Responses

StatusDescription
200Request succeeded
400Invalid request body or unsupported parameter
401Missing, invalid, or revoked API key
429Rate limit exceeded
500Unexpected processing error
GET/api/v1/enhance-video/jobs/{projectId}/download

Create Enhance Audio download URL

Returns a signed URL for enhanced audio or video.

Bearer auth

Parameters

FieldTypeRequiredDetails
projectIdstringYes
Enhance Audio project ID
path

Examples

Response

{
  "projectId": "veproj_...",
  "downloadUrl": "https://signed-download-url...",
  "expiresAt": "2026-06-19T15:00:00.000Z",
  "expiresIn": 3600,
  "contentType": "video/mp4",
  "fileSize": 18345678
}

Responses

StatusDescription
200Request succeeded
400Invalid request body or unsupported parameter
401Missing, invalid, or revoked API key
429Rate limit exceeded
500Unexpected processing error

Authentication

Pass your API key in either header:

Authorization: Bearer YOUR_SUBCLIP_API_KEY
x-api-key: YOUR_SUBCLIP_API_KEY

Before you start

Check API key setup, storage quota, and AI credit status on the API overview.

1. Create an upload URL

This creates a Subclip project id. The same projectId is used for upload, job creation, status, and download.

Audio and video inputs are supported. Use the real contentType and fileSize for the file you will upload.

curl -X POST https://www.subclip.app/api/v1/enhance-video/uploads \
  -H "Authorization: Bearer $SUBCLIP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "fileName": "interview.mp4",
    "contentType": "video/mp4",
    "fileSize": 52428800,
    "projectName": "Interview cleanup"
  }'
{
  "projectId": "veproj_...",
  "uploadUrl": "https://...",
  "objectKey": "user/voice-enhance/...",
  "expiresIn": 900
}

2. Upload the file

Content-Length must match the actual file size. curl --data-binary usually sets it automatically, but Node.js streamed uploads need it explicitly.

curl -X PUT "$UPLOAD_URL" \
  -H "Content-Type: video/mp4" \
  -H "Content-Length: 52428800" \
  --data-binary "@interview.mp4"

3. Start enhancement

durationSeconds is optional. Subclip always detects the uploaded media duration server-side with ffprobe and uses the detected duration for the credit check. If you provide durationSeconds, Subclip verifies it against the uploaded file and rejects mismatches before processing starts.

provider is optional and defaults to cleanvoice. Use cleanvoice when you want an enhanced video output for video input. Use resemble for Resemble AI voice enhancement. For video inputs, Subclip muxes the enhanced Resemble audio back onto the original video and returns final video. For audio inputs, the result is enhanced audio.

Background music separation is disabled for API jobs right now.

curl -X POST https://www.subclip.app/api/v1/enhance-video/jobs \
  -H "Authorization: Bearer $SUBCLIP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "projectId": "veproj_...",
    "durationSeconds": 180,
    "provider": "cleanvoice"
  }'

4. Poll status

Poll every 5 seconds for normal videos. For longer videos, poll every 15 seconds. Do not poll in a tight loop; if you receive 429 rate_limited, wait until X-RateLimit-Reset before trying again.

curl https://www.subclip.app/api/v1/enhance-video/jobs/veproj_... \
  -H "Authorization: Bearer $SUBCLIP_API_KEY"
{
  "projectId": "veproj_...",
  "status": "completed",
  "provider": "cleanvoice",
  "progress": 100,
  "outputReady": true,
  "outputMediaType": "video",
  "creditsUsed": 20
}

5. Download result

The Subclip API returns JSON with a short-lived signed download URL. Download that URL to get the enhanced bytes. Cleanvoice can return video for video inputs. Resemble returns final video for video inputs and enhanced audio for audio inputs.

DOWNLOAD_JSON=$(curl -s https://www.subclip.app/api/v1/enhance-video/jobs/veproj_.../download \
  -H "Authorization: Bearer $SUBCLIP_API_KEY")

DOWNLOAD_URL=$(echo "$DOWNLOAD_JSON" | jq -r '.downloadUrl')

curl -L "$DOWNLOAD_URL" -o enhanced.mp4
{
  "projectId": "veproj_...",
  "downloadUrl": "https://...",
  "expiresIn": 180,
  "mediaType": "video",
  "contentType": "video/mp4"
}

Errors and limits

401: Missing or invalid API key.

403 FREE_TIER_QUOTA_EXCEEDED: Not enough AI credits. Add credits or upgrade, then retry.

404 upload_not_found: The video was not uploaded to the presigned URL.

400 duration_unavailable: Subclip could not determine the uploaded media duration.

400 duration_mismatch: The provided durationSeconds does not match the uploaded media duration.

409 output_not_ready: The job is still queued or processing.

429 rate_limited: Too many requests. Check X-RateLimit-Remaining and X-RateLimit-Reset.

507 storage_quota_exceeded: Not enough storage quota for the uploaded source video.