cURL · Virtual Try-On API

Virtual Try-On API với cURL

Cách nhanh nhất để hiểu bất kỳ API nào là gọi nó từ shell. Tài liệu của Photta được thiết kế ưu tiên cURL — mọi thứ trên trang này đều chạy được trong một terminal duy nhất, không cần Node hay Python.

Tóm tắt trong một câu

Export `PHOTTA_API_KEY`, POST tới `https://ai.photta.app/api/v1/tryon/apparel` với JSON body phù hợp, lấy ID tạo ảnh, sau đó lặp lại lệnh `curl … /tryon/apparel/:id` mỗi 3 giây cho đến khi `data.status` chuyển sang `completed` — thường trong vòng 1.5 đến 4 phút. Kết hợp với `jq` để trích xuất URL kết quả từ phản hồi cuối cùng.

Đã cập nhật · 2026-04-19

Yêu cầu đầu tiên của bạn

cURLNode.jsPythoncURL
# Submit a try-on job. The API returns 202 Accepted + a generation ID.
JOB=$(curl -s -X POST "$PHOTTA_BASE_URL/tryon/apparel" \
  -H "$AUTH_HEADER" \
  -H "Content-Type: application/json" \
  -d '{
    "product_type": "dress",
    "product_images": ["https://example.com/dress.jpg"],
    "mannequin_id": "mnq_athena_ts",
    "pose_id": "pose_standing_front",
    "resolution": "2K",
    "aspect_ratio": "3:4"
  }')

ID=$(echo "$JOB" | jq -r '.data.id')
echo "Generation $ID queued"

# Poll every 3 seconds until the job completes (max 6 minutes).
for i in $(seq 1 120); do
  RESULT=$(curl -s "$PHOTTA_BASE_URL/tryon/apparel/$ID" -H "$AUTH_HEADER")
  STATUS=$(echo "$RESULT" | jq -r '.data.status')
  if [ "$STATUS" = "completed" ]; then
    echo "$RESULT" | jq -r '.data.output_url'
    break
  fi
  if [ "$STATUS" = "failed" ]; then
    echo "$RESULT" | jq -r '.data.error_message' >&2
    exit 1
  fi
  sleep 3
done

Kỳ vọng gì

Typical completion

1.5–4min

2K / 4K credits

5 / 7

Aspect ratios

5

Product types

6

Cách hoạt động

Virtual Try-On API với cURL

Năm bước shell, không cần thư viện phụ thuộc nào ngoài curl và jq.

  1. 01

    Bước 1

    Đăng ký và tạo key

    Truy cập ai.photta.app, mở tab Nhà phát triển, nhấp Tạo API key. Live key bắt đầu bằng `photta_live_`.

  2. 02

    Bước 2

    Export key

    Đưa `export PHOTTA_API_KEY="photta_live_xxx"` vào shell profile hoặc file `.envrc` để mọi lệnh curl sau đó tự động nhận key.

  3. 03

    Bước 3

    Ghim base URL

    `export PHOTTA_BASE_URL="https://ai.photta.app/api/v1"` giúp các lệnh curl ngắn gọn hơn và dễ dàng thay đổi sang URL sandbox khi cần.

  4. 04

    Bước 4

    Gửi yêu cầu và poll

    POST tới `$PHOTTA_BASE_URL/tryon/apparel` để lấy ID, sau đó lặp lại `curl $PHOTTA_BASE_URL/tryon/apparel/$ID` mỗi 3 giây. Pipe kết quả sang jq để trích xuất `.data.status` một cách gọn gàng.

  5. 05

    Bước 5

    Lưu trữ kết quả

    Khi tác vụ hoàn thành, lấy `.data.output_url` bằng jq và dùng `curl -o` để tải dữ liệu về máy — sẵn sàng cho bước tiếp theo trong pipeline của bạn.

Code toàn quy trình

Copy, paste, done.

Four snippets — install prerequisites, wrap the REST call, submit + poll, then handle the errors that actually happen in production.

01cURL is already installed on macOS, Linux, WSL and modern Windows
bash
# Verify curl is available
curl --version

# Export your API key so the rest of the calls can reference it
export PHOTTA_API_KEY="photta_live_xxxxx"
02Set the base URL + auth header once
bash
# Pin the base URL in a shell variable so every call is a one-liner.
export PHOTTA_BASE_URL="https://ai.photta.app/api/v1"

# Reusable auth header — every request needs it.
AUTH_HEADER="Authorization: Bearer $PHOTTA_API_KEY"
03Submit and poll in one script
bash
# Submit a try-on job. The API returns 202 Accepted + a generation ID.
JOB=$(curl -s -X POST "$PHOTTA_BASE_URL/tryon/apparel" \
  -H "$AUTH_HEADER" \
  -H "Content-Type: application/json" \
  -d '{
    "product_type": "dress",
    "product_images": ["https://example.com/dress.jpg"],
    "mannequin_id": "mnq_athena_ts",
    "pose_id": "pose_standing_front",
    "resolution": "2K",
    "aspect_ratio": "3:4"
  }')

ID=$(echo "$JOB" | jq -r '.data.id')
echo "Generation $ID queued"

# Poll every 3 seconds until the job completes (max 6 minutes).
for i in $(seq 1 120); do
  RESULT=$(curl -s "$PHOTTA_BASE_URL/tryon/apparel/$ID" -H "$AUTH_HEADER")
  STATUS=$(echo "$RESULT" | jq -r '.data.status')
  if [ "$STATUS" = "completed" ]; then
    echo "$RESULT" | jq -r '.data.output_url'
    break
  fi
  if [ "$STATUS" = "failed" ]; then
    echo "$RESULT" | jq -r '.data.error_message' >&2
    exit 1
  fi
  sleep 3
done
04Read the status code + error body instead of silently failing
bash
# -w pulls out the HTTP status without polluting the JSON body.
RESPONSE=$(curl -s -w "\n%{http_code}" -X POST "$PHOTTA_BASE_URL/tryon/apparel" \
  -H "$AUTH_HEADER" \
  -H "Content-Type: application/json" \
  -d '{ "product_type": "dress" }')

BODY=$(echo "$RESPONSE" | sed '$d')
STATUS=$(echo "$RESPONSE" | tail -1)

case "$STATUS" in
  200|202)
    echo "$BODY" | jq '.data' ;;
  402)
    echo "Out of credits" ; echo "$BODY" | jq '.error' ;;
  429)
    RETRY=$(echo "$BODY" | jq -r '.error.retry_after')
    echo "Rate limited — retry in ${RETRY}s" ;;
  *)
    echo "Error $STATUS" ; echo "$BODY" | jq '.error' ;;
esac

Tại sao lại có cấu trúc này

Tại sao cURL vẫn là cách nhanh nhất để xác minh một API

  • Zero install — cURL ships with every major OS
  • Pairs with `jq` for scripted pipelines (CI, cron, bash hooks)
  • Ideal for smoke-testing endpoints before wiring them into code
  • All code in this page copy-pastes into any POSIX shell

Những gì nó không làm

Honest caveats

  • cURL's polling loop blocks your terminal — move to Node/Python for parallel workers
  • No streaming parser for the result; you fetch the final URL when the job is done
  • Windows Command Prompt users should run WSL or PowerShell's curl.exe wrapper

Câu hỏi từ các nhà phát triển khác

Questions other developers ask

Có công cụ Photta CLI không?+

Chưa có — nhưng cURL cộng với một bash wrapper mười lăm dòng là đủ dùng. Tài liệu ưu tiên các ví dụ cURL vì mọi ngôn ngữ đều có thể chạy một tiến trình con (subprocess), và shell là mẫu số chung trong các CI pipeline.

Tôi có cần jq để sử dụng API không?+

Không bắt buộc — nhưng các script pipeline sẽ dễ dàng hơn nhiều nếu có nó. jq cho phép bạn trích xuất `.data.id`, `.data.status` và `.data.output_url` từ phản hồi JSON mà không cần parse thủ công. Cài đặt bằng `brew install jq` trên macOS hoặc `apt install jq` trên Debian/Ubuntu.

Làm thế nào để xác thực với curl?+

Thêm `-H "Authorization: Bearer $PHOTTA_API_KEY"` vào mỗi yêu cầu. Hãy giữ key trong biến môi trường, đừng bao giờ viết trực tiếp vào script bạn định commit. `curl --oauth2-bearer` cũng hoạt động nhưng dạng header tường minh sẽ rõ ràng hơn trong tài liệu và log.

Tôi có thể dùng script dựa trên curl trong production không?+

Đối với các đợt nạp dữ liệu hàng loạt một lần hoặc các cron job thì có thể — hàng ngàn team vẫn xử lý dữ liệu danh mục sản phẩm theo cách này. Với ứng dụng lâu dài, sử dụng một ngôn ngữ lập trình thực thụ thường tốt hơn vì bạn có khả năng xử lý lỗi, thử lại và giám sát (observability) tốt hơn. Các ví dụ curl trên trang này vẫn sẽ chính xác ngay cả khi bạn chuyển sang Node hoặc Python; cấu trúc yêu cầu là như nhau.

Làm thế nào để poll từ vòng lặp bash?+

Sử dụng `for i in $(seq 1 120); do … ; sleep 3; done` với lệnh kiểm tra trạng thái trong thân vòng lặp. Thoát ra khi `.data.status` là `completed` hoặc `failed`. Mã mẫu trên trang này hiển thị chính xác mô hình này, bao gồm cả giới hạn tối đa để tác vụ bị kẹt không làm treo script mãi mãi.

Làm thế nào để đọc phản hồi lỗi trong curl?+

Sử dụng `curl -w "\n%{http_code}"` để lấy mã trạng thái HTTP cùng với JSON body. Phân nhánh dựa trên mã trạng thái: 402 cho thiếu credit, 429 cho giới hạn tốc độ (tuân thủ giá trị Retry-After), 5xx cho lỗi máy chủ tạm thời. Phản hồi lỗi luôn có trường `error.code` và `error.message`.

cURL · Virtual Try-On API

Tạo tài khoản và lấy API key

Export `PHOTTA_API_KEY`, POST tới `https://ai.photta.app/api/v1/tryon/apparel` với JSON body phù hợp, lấy ID tạo ảnh, sau đó lặp lại lệnh `curl … /tryon/apparel/:id` mỗi 3 giây cho đến khi `data.status` chuyển sang `completed` — thường trong vòng 1.5 đến 4 phút. Kết hợp với `jq` để trích xuất URL kết quả từ phản hồi cuối cùng.

Virtual Try-On API với cURL — Photta | Photta