API Reference
Base URL:https://app.zupertry.com
All /v1/* endpoints are authenticated with an API key:
zt_test_sk_...) for development — jobs are processed with a mock output and no credits are consumed.
POST /v1/tryon
Submit a virtual try-on job. Returns immediately with a job ID. The job is processed asynchronously. Request body| Field | Type | Required | Description |
|---|---|---|---|
model_image_url | string | yes | Publicly accessible URL of the model photo (JPEG/PNG/WebP, max 10 MB) |
garment_image_url | string | yes | Publicly accessible URL of the garment photo (JPEG/PNG/WebP, max 10 MB) |
workspace_id | string | no | Workspace to associate the job with. Defaults to your first active workspace. |
webhook_url | string | no | URL to receive the job result. Overrides the org-level default webhook URL. |
| Field | Type | Description |
|---|---|---|
job_id | string | Use this to poll /v1/jobs/{jobId} |
status | string | Always pending on submit |
created_at | string | ISO 8601 UTC timestamp |
mode | string | live or test |
| Status | error.code | When |
|---|---|---|
| 401 | invalid_api_key | Key not found |
| 401 | api_key_revoked | Key has been revoked |
| 402 | insufficient_credits | Credit balance is 0 (live mode only) |
| 403 | account_suspended | Organisation is suspended |
| 404 | workspace_not_found | workspace_id not found or not in this org |
| 422 | validation_error | Missing fields, invalid URL, or unsupported image format |
| 429 | rate_limit_exceeded | Too many requests |
| 500 | internal_error | Server error |
GET /v1/jobs/
Get a single job by ID. Path parameters| Param | Type | Description |
|---|---|---|
jobId | string | The job ID returned from POST /v1/tryon |
| Field | Type | Description |
|---|---|---|
job_id | string | |
status | string | pending | processing | completed | failed | cancelled | refunded |
workspace_id | string | |
mode | string | live or test |
output_url | string | null | Signed URL valid for 1 hour. null if not completed. |
credits_consumed | number | null | null until job completes |
error_code | string | null | Set on failure |
webhook_url | string | null | Webhook URL for this job |
webhook_status | string | null | pending | delivered | failed | retrying | null |
created_at | string | ISO 8601 UTC |
completed_at | string | null | |
duration_ms | number | null | Processing time in milliseconds |
| Status | error.code | When |
|---|---|---|
| 401 | invalid_api_key | Key not found |
| 401 | api_key_revoked | Key revoked |
| 403 | account_suspended | Org suspended |
| 403 | forbidden | Job belongs to a different org |
| 404 | job_not_found | Job ID does not exist |
GET /v1/jobs
List jobs for your account, newest first. Query parameters| Param | Type | Default | Description |
|---|---|---|---|
workspace_id | string | — | Filter to one workspace |
status | string | — | Filter by status: pending, processing, completed, failed, cancelled, refunded |
limit | integer | 20 | Page size, max 100 |
cursor | string | — | Pagination cursor from previous response |
| Field | Type | Description |
|---|---|---|
jobs | array | Array of job objects (same shape as single job, without webhook fields) |
next_cursor | string | null | Pass as cursor param for the next page. null if no more results. |
has_more | boolean | Whether more results exist |
DELETE /v1/jobs/
Cancel a pending job and refund the reserved credit. Only jobs withstatus: pending can be cancelled. Once a job moves to processing, it cannot be stopped.
Path parameters
| Param | Type | Description |
|---|---|---|
jobId | string | Job ID |
| Status | error.code | When |
|---|---|---|
| 401 | invalid_api_key | Key not found |
| 401 | api_key_revoked | Key revoked |
| 403 | forbidden | Job belongs to a different org |
| 404 | job_not_found | Job ID does not exist |
| 409 | job_not_cancellable | Job status is not pending |
GET /v1/workspaces
List all active workspaces for your account. Response 200| Field | Type | Description |
|---|---|---|
id | string | Use as workspace_id when submitting jobs |
name | string | Display name |
status | string | active or archived |
created_at | string | ISO 8601 UTC |
GET /v1/account
Return account info: org name, plan, credit balance, and region. Response 200| Field | Type | Description |
|---|---|---|
org_id | string | |
name | string | Organisation name |
plan | string | starter | growth | scale | enterprise |
region_code | string | IN, US, EU, or GLOBAL |
currency_code | string | INR, USD, or EUR |
credits | number | Current credit balance |
auto_reload_enabled | boolean |
Authentication
All/v1/* endpoints use API key authentication:
| Key prefix | Mode | Credits | Vertex AI |
|---|---|---|---|
zt_live_sk_ | Live | Consumed | Real |
zt_test_sk_ | Test | Free | Mock output |
Rate limits
Default rate limit: 60 requests per minute per organisation. If exceeded, the API returns:Retry-After response header for the number of seconds to wait. Contact sales for higher limits.