Sam3 Image API Documentation
Playground
Try it on WaveSpeedAI!SAM 3 is a unified foundation model for promptable image segmentation using text, points, or boxes to detect and segment objects. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.
Features
SAM3 Image Segmentation segments target objects in an image using flexible prompt inputs. Provide an image and use a text prompt, point prompts, box prompts, or a combination of them to generate a precise segmentation result for the selected subject.
Why Choose This?
-
Image segmentation workflow
Segment people, objects, animals, backgrounds, or other visible targets from a source image. -
Multiple prompt types
Use text prompts, point prompts, box prompts, or combined prompt guidance for more accurate targeting. -
Text-based target selection
Describe what to segment with natural language, such asthe man,the car, orbackground. -
Point and box control
Use coordinates or bounding boxes when you need more precise target selection. -
Mask output control
Useapply_maskto choose whether the mask is applied to the image or returned as a black-and-white mask-style output. -
Low-cost segmentation
Generate segmentation outputs at a fixed price per image.
Parameters
| Parameter | Required | Description |
|---|---|---|
| image | Yes | Source image to segment. Upload an image or provide a public image URL. |
| prompt | Conditional | Text description of the target object or region to segment. |
| point_prompts | Conditional | Point coordinates used to identify the target object or region. |
| box_prompts | Conditional | Bounding box coordinates used to identify the target object or region. |
| apply_mask | No | Whether to apply the mask to the original image. When disabled, the output is a mask-style image with a black background and the selected region in white. |
| output_format | No | Output image format: jpeg, png, or webp. Default: png. |
At least one prompt type must be provided: prompt, point_prompts, or box_prompts.
How to Use
- Upload an image — Provide the source image you want to segment.
- Add a target prompt — Use a text prompt, point prompts, box prompts, or a combination of them.
- Choose mask behavior — Enable
apply_maskto apply the mask to the image. Disable it when you need a black-and-white mask output. - Choose output format — Select
jpeg,png, orwebp. - Submit — Generate the segmentation result.
Pricing
Pricing is fixed at $0.005 per image.
| Output | Cost |
|---|---|
| One segmented image | $0.005 |
Image size, prompt type, apply_mask, and output_format do not add separate charges.
Best Use Cases
- Object segmentation — Segment people, products, animals, vehicles, clothing, or props.
- Background workflows — Target foreground subjects or background regions for downstream editing.
- Mask generation — Create black-and-white mask-style outputs for compositing or image editing.
- Object isolation — Isolate selected objects for design, marketing, or post-production workflows.
- Data annotation — Generate segmentation masks for dataset preparation or labeling workflows.
- E-commerce assets — Segment products for catalog images, ads, and layout workflows.
Pro Tips
- Use short, concrete text prompts such as
person,dog,car, orbackground. - Use point prompts when text alone is ambiguous.
- Use box prompts when you need to constrain segmentation to a specific region.
- Combine text, points, and boxes when the target is difficult to isolate.
- Use
apply_mask=truewhen you want the mask applied to the original image. - Use
apply_mask=falsewhen you need a black-background mask output with the selected region shown in white. - Use
pngwhen working with mask or compositing workflows.
Notes
imageis required.- At least one of
prompt,point_prompts, orbox_promptsmust be provided. - Point and box prompts use image coordinates.
- When
apply_maskis disabled, the output is a mask-style image with a black background and the selected region in white. output_formatdefaults topng.
Related Models
- Bria RMBG — Remove image backgrounds for subject isolation workflows.
- Qwen Image Edit 2511 — Edit images with text instructions.
Authentication
For authentication details, please refer to the Authentication Guide.
API Endpoints
Submit Task & Query Result
set -euo pipefail
export WAVESPEED_API_KEY="your-api-key"
REQUEST_BODY=$(cat <<'JSON'
{
"image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
"apply_mask": true,
"output_format": "png"
}
JSON
)
# 1. Submit the prediction once. Never retry this request automatically:
# a retry after an unclear failure can create a second, billed task.
CHECK='The task may already exist. Check History or the predictions list before submitting again.'
if ! SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
--connect-timeout 10 --max-time 60 \
-X POST "https://api.wavespeed.ai/api/v3/wavespeed-ai/sam3-image" \
-H "Authorization: Bearer ${WAVESPEED_API_KEY}" \
-H "Content-Type: application/json" \
-d "${REQUEST_BODY}"); then
printf 'Submit failed. %s\n' "${CHECK}" >&2
exit 1
fi
TASK=$(printf '%s' "${SUBMIT_RESPONSE}" | jq 'if type == "object" and has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "${TASK}" | jq -r '.id // empty')
if [ -z "${PREDICTION_ID}" ]; then
printf 'Submission response did not contain a prediction id. %s\n' "${CHECK}" >&2
exit 1
fi
RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/${PREDICTION_ID}/result"
# 2. Poll until the prediction reaches a final status.
BODY_FILE=$(mktemp)
trap 'rm -f "${BODY_FILE}"' EXIT
while true; do
# Transient errors (429, 5xx) are retried, honoring Retry-After.
HTTP_CODE=$(curl --silent --show-error --fail-with-body \
--connect-timeout 10 --max-time 60 --retry 5 --retry-delay 2 \
--output "${BODY_FILE}" --write-out '%{http_code}' \
"${RESULT_URL}" \
-H "Authorization: Bearer ${WAVESPEED_API_KEY}" || true)
case "${HTTP_CODE}" in
2??) ;;
000|429|5??) # dropped connection or temporary error: keep polling
printf 'Task %s: HTTP %s, polling again in 10s\n' "${PREDICTION_ID}" "${HTTP_CODE}" >&2
sleep 10; continue ;;
*) printf 'Task %s: HTTP %s\n' "${PREDICTION_ID}" "${HTTP_CODE}" >&2
cat "${BODY_FILE}" >&2; exit 1 ;;
esac
RESULT=$(jq 'if type == "object" and has("data") then .data else . end' "${BODY_FILE}")
STATUS=$(printf '%s' "${RESULT}" | jq -r '.status // empty')
case "${STATUS}" in
completed) printf '%s\n' "${RESULT}" | jq '.outputs'; break ;;
failed|cancelled|timeout|deleted)
printf 'Task %s ended with status %s\n' "${PREDICTION_ID}" "${STATUS}" >&2
printf '%s\n' "${RESULT}" | jq . >&2; exit 1 ;;
*) sleep 2 ;;
esac
doneRetry temporary errors only while polling, never the submit request. Errors, retries and timeouts
Parameters
Task Submission Parameters
Request Parameters
| Parameter | Type | Required | Default | Range | Description |
|---|---|---|---|---|---|
| image | string | Yes | - | URL of the image to segment and analyze | |
| prompt | string | No | - | Text description to guide which objects or regions to segment | |
| point_prompts | array<object> | No | - | 0 ~ 1000 items | List of point coordinates to mark specific locations for segmentation (foreground or background) |
| point_prompts[].label | integer | No | - | - | 1 for foreground object, 0 for background |
| point_prompts[].x | integer | No | - | - | X coordinate of the point |
| point_prompts[].y | integer | No | - | - | Y coordinate of the point |
| box_prompts | array<object> | No | - | 0 ~ 1000 items | List of bounding boxes to define rectangular regions for segmentation |
| box_prompts[].x_max | integer | No | - | - | Right edge X coordinate |
| box_prompts[].x_min | integer | No | - | - | Left edge X coordinate |
| box_prompts[].y_max | integer | No | - | - | Bottom edge Y coordinate |
| box_prompts[].y_min | integer | No | - | - | Top edge Y coordinate |
| apply_mask | boolean | No | true | - | Whether to overlay the segmentation mask on the original image |
| output_format | string | No | png | jpeg, png, webp | Output image format for the segmented result |
Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data.id | string | Unique identifier for the prediction, Task Id |
| data.model | string | Model ID used for the prediction |
| data.outputs | array | Output values, usually URL strings; some models return text strings or structured result objects (empty when status is not completed) |
| data.urls | object | Object containing related API endpoints |
| data.status | string | Task status. completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses. |
| data.created_at | string | ISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”) |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |
Result Request Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| id | string | Yes | - | Task ID |
Result Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data | object | The prediction data object containing all details |
| data.id | string | Unique identifier for the prediction |
| data.model | string | Model ID used for the prediction |
| data.outputs | array<string | object> | Array of generated outputs (empty when status is not completed). Items are usually URL strings, but may be text strings or structured result objects, depending on the model. |
| data.urls | object | Object containing related API endpoints |
| data.status | string | Status: completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses |
| data.created_at | string | ISO timestamp of when the request was created |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |