API Documentation

Integrate undress, face swap, and animation capabilities into your application.

API Keys

Sign in to create and manage your API keys.

Sign in

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:

  1. POST /api/v1/persons/analyze with {image_url} โ†’ receive an analysis id.
  2. Poll GET /api/v1/persons/analyze/:id until completed โ†’ receive the persons list with ids.
  3. POST /api/v3/undress with the same image_url and the chosen person_id โ†’ receive an undress id.
  4. Poll GET /api/v3/undress/:id until completed or failed.

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