API Documentation
Integrate undress, face swap, and animation capabilities into your application.
Authorization
Pass your API key in the Authorization header of every request.
Authorization: Bearer <your_api_key>
Undress API
The Undress API generates an undressed image โ or an animated video โ from a source photo. Every request needs the Authorization: Bearer <your_api_key> header and a JSON body.
Four styles, grouped here as sub-sections:
| Style | Output | Credits | Endpoint |
|---|---|---|---|
| Standard | Still image | 1 | POST /api/v1/undress |
| Premium v2 | Still image | 3 | POST /api/v1/undress |
| Premium v3 | Highest-quality still | 5 | POST /api/v3/undress |
| Video | Animated mp4 | 7 initial ยท 5 continue | POST /api/v1/undress |
standard, premium_v2, and video share POST /api/v1/undress โ pick via the style field, then poll GET /api/v1/undress/:id. source_image is always base64-encoded jpeg, png, or webp, up to 12 MB. premium_v2 is the only style where mask/automask actually affect behavior; for the other v1 styles the server always auto-masks.
Premium v3 lives at its own endpoint (POST /api/v3/undress) and always targets one explicitly selected person, so it requires a prior call to the Persons Analysis API to pick the person. See Premium v3 below.
Standard
Cheapest style โ 1 credit, single still image, server-generated mask, no customization knobs.
Create Undress
POST /api/v1/undress
| Param | Type | Required | Description |
|---|---|---|---|
source_image |
string (base64) | yes | Base64-encoded jpeg/png/webp, up to 12 MB. |
style |
string | yes | Must be "standard". |
curl -X POST https://deepstrip.com/api/v1/undress \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{"source_image": "<base64_encoded_image>", "style": "standard"}'
Responses:
201 {"id": "69d280ab-42c5-4f49-9881-51076afb1747"}
400 {"error": "no_credits"} โ account is out of credits.
400 {"error": "invalid_params", "errors": ["Image is invalid"]} โ validation failed; errors lists the reasons.
400 {"error": "internal_server_error"} โ the request was rejected as anomalous.
Get Undress Result
GET /api/v1/undress/:id
Poll until status is completed or failed. result is the image URL.
curl https://deepstrip.com/api/v1/undress/<identifier> \
-H "Authorization: Bearer <your_api_key>"
200 {"status": "pending"}
200 {"status": "completed", "result": "<result url>", "image": "<result url>"} โ image is a deprecated alias of result, kept for backward compatibility.
200 {"status": "failed", "details": "analysis_failed"} โ input was rejected (e.g. no person detected, underage subject). Do not retry with the same input.
200 {"status": "failed", "details": "system_error"} โ generation itself failed. Safe to retry.
404 {"error": "NOT_FOUND"}
Premium v2
3 credits, single still image. Optional user-supplied mask or server-generated, plus body-shape / boobs / hair knobs.
Create Undress
POST /api/v1/undress
| Param | Type | Required | Description |
|---|---|---|---|
source_image |
string (base64) | yes | Base64-encoded jpeg/png/webp, up to 12 MB. |
style |
string | yes | Must be "premium_v2". |
mask |
string (base64) | when automask is not true |
Base64-encoded png, up to 1 MB. White = region to undress, black = keep. |
automask |
boolean | optional | true tells the server to generate the mask for you. |
body_shape |
string | optional | fat, skinny, athletic, or old. Omit for normal. |
boobs |
string | optional | small or large. Omit for normal. |
hair |
string | optional | hairy or shaved. Omit for normal. |
With automask and body customization:
curl -X POST https://deepstrip.com/api/v1/undress \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{"source_image": "<base64_encoded_image>", "style": "premium_v2", "automask": true, "body_shape": "athletic", "boobs": "large", "hair": "shaved"}'
With a user-supplied mask:
curl -X POST https://deepstrip.com/api/v1/undress \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{"source_image": "<base64_encoded_image>", "mask": "<base64_encoded_mask_png>", "style": "premium_v2"}'
Responses:
201 {"id": "69d280ab-42c5-4f49-9881-51076afb1747"}
400 {"error": "no_credits"}
400 {"error": "invalid_params", "errors": ["Image is invalid"]}
400 {"error": "internal_server_error"} โ the request was rejected as anomalous.
Get Undress Result
GET /api/v1/undress/:id โ same response shape as Standard.
Premium v3
Highest-quality still image โ 5 credits. Unlike the other styles, Premium v3 lives at a separate endpoint (POST /api/v3/undress) and requires a prior person detection step.
Prerequisite: call the Persons Analysis API first to obtain a
person_id. Premium v3 always targets one explicitly selected person โ you cannot submit a photo without first choosing who to undress.
Full flow:
POST/api/v1/persons/analyzewith{image_url}โ receive an analysis id.- Poll
GET /api/v1/persons/analyze/:iduntilcompletedโ receive the persons list with ids. POST /api/v3/undresswith the sameimage_urland the chosenperson_idโ receive an undress id.- Poll
GET /api/v3/undress/:iduntilcompletedorfailed.
No mask / automask / body-trait knobs โ everything is derived from the selected person.
Create Undress
POST /api/v3/undress
| Param | Type | Required | Description |
|---|---|---|---|
image_url |
string | yes | HTTPS URL of a jpeg, png, or webp image, up to 12 MB. Must be byte-identical to the URL used in the person analysis. |
person_id |
string | yes | id of the person to undress, taken from the persons[] array of a completed analysis owned by the same API key. |
person_gender |
string | optional | Override the detectorโs gender for this person. Accepts "male" or "female" (case-insensitive). Use this when the detector misclassifies and you want to force the opposite workflow. |
body_shape |
string | optional, female only | Force the body figure. One of "as_in_photo" (let the AI keep what it sees, default), "fat", "skinny", "athletic". |
boobs |
string | optional, female only | Force the breast size. One of "as_in_photo" (let the AI decide, default), "small", "large", "huge". |
curl -X POST https://deepstrip.com/api/v3/undress \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{"image_url": "https://example.com/photo.jpg", "person_id": "6f2a13e4-5b52-4c39-9a7d-29e80a9c1a62"}'
Responses:
201 {"id": "69d280ab-42c5-4f49-9881-51076afb1747"}
400 {"error": "invalid_params", "errors": ["image_url is required"]} โ missing image_url / person_id, invalid person_gender, or the record failed model-level validation.
400 {"error": "invalid_person_id"} โ person_id is unknown, expired (> 3 hours), belongs to a different API key, or the submitted image_url does not match the one analyzed for that person.
400 {"error": "image_fetch_failed"} โ the server could not download the image at image_url (non-HTTPS, non-2xx, disallowed content-type, > 12 MB, timeout, or too many redirects).
400 {"error": "under_age"} โ the picked personโs estimated age is under 18. Do not retry with this person.
400 {"error": "no_credits"} โ account is out of credits.
Regenerate (free, once per undress)
POST /api/v3/undress/:id/regenerate
When a generation comes out unsatisfying, you can run it again for free with a different random seed. Same source image, same person, no credits charged. Exactly one free regeneration is allowed per parent undress, and only within 24 hours of the parentโs creation. The parentโs person_gender override (if any) is inherited.
curl -X POST https://deepstrip.com/api/v3/undress/<parent_id>/regenerate \
-H "Authorization: Bearer <your_api_key>"
Responses:
201 {"id": "<new_undress_id>"} โ poll GET /api/v3/undress/:id with the new id.
400 {"error": "already_regenerated"} โ the free regeneration slot is already used for this parent.
400 {"error": "parent_expired"} โ the parent undress is older than 24 hours.
400 {"error": "parent_not_completed"} โ the parent has not finished generating yet; wait for completed before regenerating.
400 {"error": "not_v3"} โ only premium v3 undresses can be regenerated through this endpoint.
404 {"error": "NOT_FOUND"} โ the parent id is unknown or was created by a different API key.
Get Undress Result
GET /api/v3/undress/:id
Same response shape as GET /api/v1/undress/:id.
curl https://deepstrip.com/api/v3/undress/<id> \
-H "Authorization: Bearer <your_api_key>"
200 {"status": "pending"}
200 {"status": "completed", "result": "<result url>", "image": "<result url>"} โ image is a deprecated alias of result.
200 {"status": "failed", "details": "analysis_failed"} โ input was rejected. Do not retry with the same input.
200 {"status": "failed", "details": "system_error"} โ generation itself failed. Safe to retry.
404 {"error": "NOT_FOUND"}
Video
Animated mp4 output โ 7 credits for the initial video, 5 credits to continue with the next clothing layer. Always auto-masked, no customization knobs.
Create Undress
POST /api/v1/undress
| Param | Type | Required | Description |
|---|---|---|---|
source_image |
string (base64) | yes โ except when using parent |
Base64-encoded jpeg/png/webp, up to 12 MB. |
style |
string | yes โ except when using parent |
Must be "video". |
parent |
string (uuid) | optional | Id of a previous video undress to continue with the next clothing layer. Style and source are inherited; parent must be less than 24 hours old. Costs 5 credits. |
Initial animated undress โ 7 credits:
curl -X POST https://deepstrip.com/api/v1/undress \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{"source_image": "<base64_encoded_image>", "style": "video"}'
Continue a previous video โ 5 credits (style and source inherited from parent):
curl -X POST https://deepstrip.com/api/v1/undress \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{"parent": "<id-of-previous-video-undress>"}'
Responses:
201 {"id": "69d280ab-42c5-4f49-9881-51076afb1747"}
400 {"error": "no_credits"}
400 {"error": "invalid_params", "errors": ["Image is invalid"]}
400 {"error": "parent_expired"} โ the parent undress is older than 24 hours.
400 {"error": "too_many_retries"} โ no free regenerations are left for this parent.
400 {"error": "internal_server_error"} โ the request was rejected as anomalous.
Get Undress Result
GET /api/v1/undress/:id โ same response shape as Standard; result is an mp4 URL instead of an image URL.
Face Swap on Video Result
Applies only to completed video undresses. Runs a free face swap over the animated result to improve face consistency; typically completes in 60โ120 seconds.
POST /api/v1/undress_face_swap_videos
curl -X POST https://deepstrip.com/api/v1/undress_face_swap_videos \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{"undress_id": "<id-of-the-video-undress>"}'
201
{
"id": "69d280ab-42c5-4f49-9881-51076afb1747",
"face_swap_video_id": "35b4a4a8-e5e6-4613-b1a3-d538b8698d06",
"undress_id": "69968efe-556d-4805-87bd-1556a49f4e37",
"undress_result_id": null
}
404 {"error": "NOT_FOUND"} โ undress not found, not owned by the caller, or not a video style.
GET /api/v1/undress_face_swap_videos/:id
curl https://deepstrip.com/api/v1/undress_face_swap_videos/<identifier> \
-H "Authorization: Bearer <your_api_key>"
200 While processing, undress_result_id is null. When completed, undress_result_id points to a new undress โ fetch its video via GET /api/v1/undress/:id:
{
"id": "69d280ab-42c5-4f49-9881-51076afb1747",
"face_swap_video_id": "35b4a4a8-e5e6-4613-b1a3-d538b8698d06",
"undress_id": "69968efe-556d-4805-87bd-1556a49f4e37",
"undress_result_id": "616c2b43-c432-416d-8ecb-470a670fbdee"
}
404 {"error": "NOT_FOUND"}
Persons Analysis API
Detect people on an image so you can undress one specific person with Premium v3. Analyses are created asynchronously and cached for 3 hours. The endpoint is rate-limited to 15 requests per minute per API key.
You never upload the image bytes โ pass an HTTPS URL; the detector service fetches it.
Create Analysis
POST /api/v1/persons/analyze
Request body
| Param | Type | Required | Description |
|---|---|---|---|
image_url |
string | yes | HTTPS URL of a jpeg, png, or webp image. Same URL you will pass to POST /api/v3/undress later โ it is part of the person-id validation. |
curl -X POST https://deepstrip.com/api/v1/persons/analyze \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{"image_url": "https://example.com/photo.jpg"}'
Responses
201 {"id": "a1e0b0c8-..."} โ poll GET /api/v1/persons/analyze/:id for the result.
400 {"error": "invalid_params", "errors": ["image_url must use HTTPS"]} โ missing, non-HTTPS, or malformed URL.
429 {"error": "rate_limited", "retry_after": 37} โ more than 15 analyses in the current minute for this API key. retry_after is seconds until the next window.
Get Analysis Result
GET /api/v1/persons/analyze/:id
Poll until status is completed or failed. The cache entry expires 3 hours after creation; after that, GET returns 404.
curl https://deepstrip.com/api/v1/persons/analyze/<id> \
-H "Authorization: Bearer <your_api_key>"
Responses
200 {"status": "pending"} โ detector still running.
200 Completed with persons:
{
"status": "completed",
"persons": [
{
"id": "6f2a13e4-5b52-4c39-9a7d-29e80a9c1a62",
"bbox": [112.0, 80.0, 430.0, 920.0],
"age": 27.3,
"gender": "female",
"score": 0.94
}
]
}
Persons whose age or gender could not be recognized are filtered out. Pass persons[].id as person_id to POST /api/v3/undress.
200 {"status": "completed", "persons": []} โ detector ran successfully but found no recognized persons. Not a failure; pick a different image.
200 {"status": "failed", "details": "detector_failed"} โ the detector could not process the URL (unreachable, bad image, service error). Retry later or with a different URL.
404 {"error": "NOT_FOUND"} โ unknown id, cache expired (> 3 hours), or the analysis was created by a different API key.
FaceSwap API
Create FaceSwap
POST /api/v1/face_swaps
Accepts the face image and the target image.
Face and target images should be base64 encoded images in jpeg, webp, or png format.
curl -X POST https://deepstrip.com/api/v1/face_swaps \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{"image": "<base64_encoded_image>", "face": "<base64_encoded_face>"}'
Responses:
201 {"id": "69d280ab-42c5-4f49-9881-51076afb1747"}
400 {"error": "no_credits"}
400 {"error": "invalid_params", "errors": ["Image is invalid"]}
Get FaceSwap Result
GET /api/v1/face_swaps/:id
Returns the generated image or the generation status.
curl https://deepstrip.com/api/v1/face_swaps/<identifier> \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json"
Responses:
200 {"status": "completed", "image": "<result image url>"}
200 {"status": "pending"}
200 {"status": "failed"}
404 {"error": "NOT_FOUND"}
Face Swap Videos API
Analyze Video
POST /api/v1/face_swap_videos/analyze
Calculate the price for processing a video based on its duration.
curl -X POST https://deepstrip.com/api/v1/face_swap_videos/analyze \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{"video_url": "https://example.com/video.mp4", "preview": false, "version": "v2"}'
Responses:
200 {"price": 4.0, "duration": 20}
400 {"error": "INVALID_VIDEO_URL", "details": ["must be a valid URL", "must use HTTPS"]}
422 video dimensions should not exceed 1920x1080 โ {"error": "ANALYSIS_FAILED", "details": "too_large"}
Create Face Swap Video
POST /api/v1/face_swap_videos
Create a new face swap video job using URL.
curl -X POST https://deepstrip.com/api/v1/face_swap_videos \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{"video_url": "https://example.com/video.mp4", "face_url": "https://example.com/face.jpg", "preview": false, "version": "v2"}'
Responses:
201 {"id": "69d280ab-42c5-4f49-9881-51076afb1747", "status": "created", "message": "Face swap video creation started"}
400 {"error": "VALIDATION_ERROR", "details": ["Video is required"]}
Get Face Swap Video Status
GET /api/v1/face_swap_videos/:id
Check the status of a face swap video job and get the result URL when completed.
curl https://deepstrip.com/api/v1/face_swap_videos/<identifier> \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json"
Responses:
200 Processing
{
"id": "69d280ab-42c5-4f49-9881-51076afb1747",
"status": "processing",
"progress": 45.5,
"step": "working",
"result_url": null,
"error_details": null
}
200 Completed
{
"id": "69d280ab-42c5-4f49-9881-51076afb1747",
"status": "completed",
"progress": 100.0,
"step": "uploading",
"result_url": "https://assets.nodress.ai/videos/result.mp4",
"error_details": null
}
404 {"error": "NOT_FOUND"}
Animate Photo API
The Animate Photo API converts static photos into videos with smooth, natural motion.
Create Animation
POST /api/v1/animations
Accepts a source image and a template ID to create an animation job.
Source image should be a base64 encoded data URI in jpeg, png, or webp format (e.g., data:image/jpeg;base64,/9j/4AAQ...).
Available Templates
The template_id parameter is required and determines the animation style. preset_id is also accepted for backward compatibility (deprecated).
GET /api/v1/animation_templates (also available at /api/v1/animation_presets, deprecated)
curl https://deepstrip.com/api/v1/animation_templates
Example response:
[{"id": 1, "name": "Missionary POV", "name_de": "Missionarsstellung POV", "name_es": "Misionero POV", ..., "combo": false, "price": 7}, ...]
The response includes localized names for all supported languages (en, de, es, pt, fr, ru, zh). The name field contains the English name. Each name_XX field contains the translation for that locale, falling back to English if not set.
Current templates:
| ID | Name | Combo | Price (credits) |
|---|---|---|---|
3 |
Reverse Cowgirl | No | 7 |
4 |
Face Sitting | No | 7 |
5 |
Breast Expansion | No | 7 |
6 |
Doggy Style | No | 7 |
8 |
Cumshot on the face | No | 7 |
9 |
Foot Show | No | 7 |
12 |
Pet Play | No | 7 |
13 |
Squirt | No | 7 |
30 |
Breast Play | No | 7 |
16 |
Breast Play Solo | No | 7 |
17 |
Spooning | No | 7 |
18 |
Deep Throat BBC | No | 7 |
19 |
Blowjob | No | 7 |
21 |
Double Blowjob | No | 7 |
7 |
Dildo Handjob | No | 7 |
24 |
Handjob | No | 7 |
26 |
Two-Hand Handjob | No | 7 |
29 |
Standing Doggy | No | 7 |
33 |
Sex Machine | No | 7 |
36 |
Pussy Fingering | No | 7 |
38 |
Doggy POV | No | 7 |
1 |
Missionary POV | No | 7 |
45 |
Missionary Side View | No | 7 |
28 |
Kissing | No | 7 |
46 |
Lesbian Kissing | No | 7 |
47 |
Gay Kissing | No | 7 |
48 |
Smoking | No | 7 |
49 |
Blowjob POV | No | 7 |
79 |
Ahegao | No | 7 |
55 |
Pregnant | No | 7 |
56 |
Deep Throat with Cumshot BBC | Yes | 14 |
57 |
Two Guys Handjob | No | 7 |
58 |
Rough Blowjob | No | 7 |
83 |
Kissing & Undressing | Yes | 14 |
75 |
Pussy Rubbing | No | 7 |
76 |
Pussy rubbing with creampie | Yes | 14 |
77 |
Riding the gear shift | No | 7 |
86 |
Gains weight quickly | No | 7 |
78 |
Continue Action | No | 7 |
Combo templates combine two animation styles and cost 14 credits instead of 7.
Example request:
curl -X POST https://deepstrip.com/api/v1/animations \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{"source_image": "<base64_encoded_image>", "template_id": 1}'
Responses:
201 {"id": "69d280ab-42c5-4f49-9881-51076afb1747"}
400 {"error": "no_credits"}
400 {"error": "invalid_params", "errors": ["Input is invalid"]}
400 Analysis failed โ child detected:
{"error": "analysis_failed", "error_details": {"code": "face.child", "underage_persons": [{"age": 17.6, "face": {"x1": 36, "x2": 99, "y1": 103, "y2": 176}, "body": {"x1": 1, "x2": 170, "y1": 72, "y2": 735}}]}}
400 Analysis failed โ no face found:
{"error": "analysis_failed", "error_details": {"code": "no_face_found"}}
Get Animation Result
GET /api/v1/animations/:id
Returns the generated video URL or the generation status.
curl https://deepstrip.com/api/v1/animations/<identifier> \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json"
Responses:
200 {"status": "completed", "result": "<result video url>"}
200 {"status": "pending"}
200 {"status": "failed"} โ system error or unknown failure
200 Failed โ child detected:
{"status": "failed", "error_details": {"code": "face.child", "underage_persons": [{"age": 17.6, "face": {"x1": 36, "x2": 99, "y1": 103, "y2": 176}, "body": {"x1": 1, "x2": 170, "y1": 72, "y2": 735}}]}}
200 Failed โ no face found:
{"status": "failed", "error_details": {"code": "no_face_found"}}
404 {"error": "NOT_FOUND"}
Changelog
| Date | Change |
|---|---|
| 29.04.2026 | Added "athletic" to body_shape options in Premium v3 (POST /api/v3/undress). |
| 24.04.2026 | Simplified person_gender in Premium v3: only "male" and "female" are accepted (aliases "man"/"woman" are no longer supported). Removed internal gender_score field from Persons Analysis response documentation. |
| 24.04.2026 | Reorganized API documentation: Undress is now a single section with Standard, Premium v2, Premium v3, Video sub-sections. Premium v3 description now links the Persons Analysis API prerequisite explicitly. |
| 21.04.2026 | Added POST /api/v3/undress/:id/regenerate โ one free regeneration per parent undress, valid for 24 hours. |
| 21.04.2026 | Breaking: premium_v3 style removed from POST /api/v1/undress; premium v3 now lives at POST /api/v3/undress and requires image_url + person_id. Added POST /api/v1/persons/analyze + GET /api/v1/persons/analyze/:id (15 req/min per API key, 3-hour cache). |
| 20.04.2026 | Reduced premium_v3 price from 10 credits to 5 credits |
| 19.04.2026 | Rewrote Undress API section; corrected /api/v1/undress_face_swap_videos URL (plural), documented failed details field, added too_many_retries/parent_expired/internal_server_error, added old to body_shape options |
| 07.04.2026 | Simplified Premium v3 to a single premium_v3 style at 2.0 MP, flat 10 credits |
| 01.04.2026 | Added Premium v3 styles |
| 28.03.2026 | Added error_details to Animation API responses (child detection and no face found) |
| 15.03.2026 | Added combo animation templates (14 credits) |
| 24.02.2026 | Renamed animation presets to animation templates; /api/v1/animation_presets still works (deprecated) |
| 03.02.2026 | Added localized names to animation presets endpoint |
| 02.02.2026 | Added animation presets list endpoint |
| 01.02.2026 | Breaking update of the Animate Photo API |
| 21.01.2026 | Added Animate Photo API |
| 21.01.2026 | Added body_shape, boobs, hair options for premium_v2 style |
| 19.12.2025 | Remove basic face swap photo |
| 13.12.2025 | Update documentation about undress videos |
| 12.12.2025 | Added ability to create undress videos |
| 11.12.2025 | Removed legacy options from OpenAPI specification |
| 26.09.2025 | Removed information about unsupported undress styles |
| 30.12.2024 | Added link to beta version of API documentation |
| 27.12.2024 | Added Face Swap Videos API |
| 10.12.2024 | Added version field to FaceSwap API |
| 25.10.2024 | Added FaceSwap API |
| 18.10.2024 | Added premium v2 style |
| 21.09.2024 | Added link to OpenAPI specification |
| 21.09.2024 | Added information about automatic mask generation |
| 16.09.2024 | Added link to pricing page |
| 11.05.2024 | Added curl usage example |
| 10.05.2024 | Updated API documentation to sync with current version |