---
title: "Submit Draft"
method: POST
path: "/api/jobs/{job_id}/submit"
---

# Submit Draft

`POST /api/jobs/{job_id}/submit`

## Request

- Base URL: `https://api.tintin-x.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.tintin-x.com/api/jobs/{job_id}/submit`
- Auth: HTTP bearer

Pin inputs onto a draft + run the charge fan-out + enqueue.

The draft must belong to the caller (scope-checked) and still be in
'draft' status. Returns the same shape as `POST /api/jobs` so the
frontend can route through either path interchangeably.

## Path parameters

- `job_id` string, uuid, required

## Request body

- SrcNailArtSchemasJobsJobSubmitRequest: POST `/api/jobs/{id}/submit` body. Pins inputs onto the draft and runs the charge fan-out. Either presign-uploaded inputs (the route lists `apps/nail-art/{id}/inputs/` in S3 to discover them automatically) OR explicit keys/file_ids passed in this body. The explicit path is required when inputs came via Platform Storage uploadFile (workspace-visible files) rather than the per-app presign route. The optional ``nail_shape`` / ``nail_length`` / ``shape_terms`` fields let the user override the auto-detected shape from the catalog. Auto-detect still runs as fallback; user override always wins. ``shape_terms`` is echoed VERBATIM into the harmonize prompt so the user's exact words ("super short almond, round shape") flow through without paraphrase — see pain-points doc §4.3. ``output_aspect`` / ``output_max_kb`` / ``output_format`` apply as a post-harmonize encode pass — the raw NB2 PNG is re-encoded to the requested aspect + size budget. See §4.8.
  - `nail_set_s3_key` string, nullable
  - `nail_set_label` string, nullable
  - `hand_s3_keys` string[], nullable
  - `hand_template_ids` string[], nullable
  - `harmonize_num_images` integer
  - `nail_shape` 'almond' | 'square' | 'coffin' | 'round' | 'oval' | 'squoval' | 'stiletto', nullable
  - `nail_length` 'super_short' | 'short' | 'medium' | 'long', nullable
  - `shape_terms` string, nullable
  - `output_aspect` 'auto' | '21:9' | '16:9' | '3:2' | '4:3' | '5:4' | '1:1' | '4:5' | '3:4' | '2:3' | '9:16' | '4:1' | '1:4' | '8:1' | '1:8', nullable
  - `output_max_kb` integer, nullable
  - `output_format` 'png' | 'jpg' | 'webp', nullable
  - `output_resolution` '2K' | '4K', nullable
  - `collection_tag` string, nullable

## Response `200`

Successful Response

- JobCreateResponse
  - `id` string, uuid, required
  - `series_id` string, uuid, required
  - `status` 'draft' | 'pending' | 'running' | 'succeeded' | 'failed', required
  - `nail_set_s3_key` string, required
  - `hands` HandResultResponse[], required
    - `id` string, uuid, required
    - `hand_idx` integer, required
    - `status` 'charging' | 'running' | 'succeeded' | 'failed' | 'refunded', required
    - `hand_s3_key` string, required
    - `hand_template_id` string, uuid, nullable
    - `hand_url` string, nullable
    - `bare_s3_key` string, nullable
    - `warp_s3_key` string, nullable
    - `final_s3_key` string, nullable
    - `final_url` string, nullable
    - `candidate_s3_keys` string[], nullable
    - `candidate_urls` string[], nullable
    - `candidate_video_urls` string[], nullable
    - `cents_charged` integer, nullable
    - `error_message` string, nullable
    - `created_at` string, date-time, required
    - `finished_at` string, date-time, nullable
  - `total_cents_charged` integer, required
  - `created_at` string, date-time, required

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/tintin-x/apis/tintin-api.md) · [All operations](https://skmtc.dev/tintin-x/apis/tintin-api/llms.txt) · [OpenAPI document](https://skmtc.dev/tintin-x/apis/tintin-api/revisions/8839a8d0a66c?raw)
