---
title: "Create, add entries, and seal in one call"
method: POST
path: "/v1/draws/instant"
tags: ["Draws"]
---

# Create, add entries, and seal in one call

`POST /v1/draws/instant`

The recommended endpoint when you already have the full entrant list.
With `wait: true`, blocks until the drand round arrives (~32–35 s with
quicknet defaults) and returns the **resolved** draw with the winner.
If create + entries succeed but the seal step fails, the open draw and
tickets are returned with HTTP 500 / `code: seal_failed` — retry via
`POST /v1/draws/{id}/seal`.

## Request body

- object
  - `name` string, required
  - `description` string, nullable
  - `direction` 'winner' | 'loser'
  - `winner_count` integer — Multi-winner draws are enterprise-only in v1.
  - `drand_chain` 'quicknet' | 'classic'
  - `callback_url` string, nullable — Webhook target for draw.sealed / draw.resolved / draw.cancelled events.
  - `metadata` object, nullable — Opaque
  - `entries` EntryInput[], required
    - `ticket_id` string — Optional — omit to auto-generate. Your own customer ids, order numbers, or email hashes all work.
    - `metadata` object, nullable — Opaque to ProofDraw; stored as-is.
  - `round_offset_seconds` integer
  - `wait` boolean

## Response `201`

Draw sealed (and resolved, when `wait` was true and the round arrived in time).

- SealedDrawResponse
  - `success` boolean
  - `message` string
  - `data` object
    - `draw` object
      - `id` string
      - `name` string
      - `description` string, nullable
      - `state` 'open' | 'sealed' | 'resolved' | 'cancelled'
      - `direction` 'winner' | 'loser'
      - `winner_count` integer
      - `entry_count` integer
      - `drand_chain` 'quicknet' | 'classic'
      - `drand_round` integer, nullable
      - `drand_round_time` string, date-time, nullable
      - `list_hash` string, nullable — SHA-256 over the sealed list bytes.
      - `list_url` string, nullable
      - `verify_url` string, nullable — Public per-draw verification page.
      - `winner_row` integer, nullable — 0-based index into the sealed list.
      - `winner_ticket` string, nullable
      - `callback_url` string, nullable
      - `callback_secret` string, nullable — Returned only on the creating response. HMAC key for webhook signatures.
      - `public_commit_url` string, nullable
      - `sealed_at` string, date-time, nullable
      - `resolved_at` string, date-time, nullable
      - `created_at` string, date-time
      - `ots_proof_url` string, nullable
      - `ots_calendar_url` string, nullable
      - `ots_attested_at` string, date-time, nullable
      - `commitment_text` string — Publish this to a public
      - `tweet_intent_url` string — One-click X post of the commitment.
      - `tickets` string[] — Instant endpoint only: all ticket ids in submission order.

## Other responses

- `401` — Missing or invalid API key (`unauthenticated`).
- `403` — Plan draw cap reached (`tier_limit_exceeded`).
- `409` — Operation not valid in the draw's current state (`state_conflict`).
- `422` — Invalid payload (`validation_failed` / `entry_limit_exceeded`).
- `500` — Draw + entries persisted but the seal step failed (`code: seal_failed`). Retry the seal.

---

[API](https://skmtc.net/proofdraw/apis/proofdraw-api.md) · [All operations](https://skmtc.net/proofdraw/apis/proofdraw-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/proofdraw/proofdraw-api/revisions/5d4ce7cb355d/schema)
