Apply Watermark

Apply a Perth v2 watermark to an audio, image, or video file. The media type is automatically detected from the file content.

POST https://app.resemble.ai/api/v2/watermark/apply

Request parameters

FieldTypeRequiredDescription
urlstringYesPublic HTTPS URL to the audio, image, or video file.
strengthnumberNoImage/video watermark strength from 0.0 to 1.0. Defaults to 0.2; ignored for audio.
custom_messagestringNoImage/video message, up to 64 characters. Defaults to resembleai; ignored for audio.

Headers

HeaderValueDescription
AuthorizationBearer YOUR_API_TOKENRequired. Your API token.
Content-Typeapplication/jsonRequired.
PreferwaitOptional. Wait for processing and return the completed job in the initial response.

Examples

Apply an audio watermark

curl --request POST 'https://app.resemble.ai/api/v2/watermark/apply' \
-H 'Authorization: Bearer YOUR_API_TOKEN' \
-H 'Content-Type: application/json' \
--data '{
"url": "https://example.com/audio/source.wav"
}'

Apply an image watermark synchronously

curl --request POST 'https://app.resemble.ai/api/v2/watermark/apply' \
-H 'Authorization: Bearer YOUR_API_TOKEN' \
-H 'Content-Type: application/json' \
-H 'Prefer: wait' \
--data '{
"url": "https://example.com/images/photo.png",
"strength": 0.2,
"custom_message": "resembleai"
}'

Apply a video watermark

curl --request POST 'https://app.resemble.ai/api/v2/watermark/apply' \
-H 'Authorization: Bearer YOUR_API_TOKEN' \
-H 'Content-Type: application/json' \
--data '{
"url": "https://example.com/videos/clip.mp4",
"strength": 0.5
}'

Initial response

Without Prefer: wait, the API returns the queued job. All apply jobs report model_version as perth_v2.

{
"success": true,
"item": {
"uuid": "JOB_UUID",
"media_type": "audio",
"operation_type": "apply",
"status": "pending",
"model_version": "perth_v2",
"source_media_url": "https://example.com/audio/source.wav",
"metrics": null,
"watermarked_media": null,
"created_at": "2026-07-22T12:00:00.000Z",
"updated_at": "2026-07-22T12:00:00.000Z"
}
}

With Prefer: wait, the same shape is returned after processing. On success, status is completed and watermarked_media contains a signed download URL.

Fetch apply result

Retrieve the current state of an apply job using its UUID.

GET https://app.resemble.ai/api/v2/watermark/apply/{uuid}/result

curl --request GET 'https://app.resemble.ai/api/v2/watermark/apply/JOB_UUID/result' \
-H 'Authorization: Bearer YOUR_API_TOKEN'

Completed response

{
"success": true,
"item": {
"uuid": "JOB_UUID",
"media_type": "audio",
"operation_type": "apply",
"status": "completed",
"model_version": "perth_v2",
"source_media_url": "https://example.com/audio/source.wav",
"metrics": null,
"watermarked_media": "https://app.resemble.ai/rails/active_storage/...",
"created_at": "2026-07-22T12:00:00.000Z",
"updated_at": "2026-07-22T12:00:04.000Z"
}
}

For completed image/video jobs, metrics can also contain the applied strength, custom_message, and payload length.

Response fields

FieldTypeDescription
successbooleanWhether the API request succeeded.
item.uuidstringUnique identifier for the watermark job.
item.media_typestringDetected media type: audio, image, or video.
item.operation_typestringapply.
item.statusstringpending, processing, completed, or failed.
item.model_versionstringperth_v2.
item.source_media_urlstringOriginal source URL.
item.watermarked_mediastring | nullSigned output URL when complete; otherwise null.
item.metricsobject | nullApply metadata when available.
item.created_atstringJob creation timestamp.
item.updated_atstringJob update timestamp.

The signed watermarked_media URL expires. Download and store the asset promptly.

Error handling

Invalid input returns an error response, for example:

{
"success": false,
"error": "File must be valid media format"
}

The source must be publicly accessible over HTTPS and remain available while processing. Audio and image sources are limited to 25 MB; video sources are limited to 100 MB.