Skip to main content
POST
Submit a signed pull and poll its requestId

Submit and track a pull

  1. Sign the purchase. Have the buyer sign the full Permit2 payload from Prepare a pull. Send it with your builder key. The streaming endpoint accepts the same body and checks the same signature.
  2. Save the request ID. The API returns HTTP 202 with requestId and the current status. The purchase belongs to this builder and buyer wallet.
  3. Check the result. Use the ID to get pull status about once per second. Stop at RESOLVED or FAILED.
If you lose the response, resend the same signed payload to recover the same requestId. A failed request can restart. The same signature can charge the buyer only once.If the pull stays in PENDING_PAYMENT for more than 10 minutes, stop polling and contact Renaiss with the original requestId before signing again.

Request

Builder key and wallet signature

Response

Failures after submission

A new submission returns HTTP 202 with PENDING_PAYMENT. Resubmitting the same signed pull can restart a failed attempt. To check an existing request without restarting it, poll its requestId. A recorded FAILED means nothing was charged.Most codes return Unable to fund the pull. in error.message. The table quotes the other messages where they apply.
For an unrecognized code, check the wallet’s pull history before signing again.On mainnet, a refused USDT transfer can still return INSUFFICIENT_USDT_AMOUNT when the allowance is short. Check both the balance and the USDT allowance for Permit2. On testnet, INSUFFICIENT_ALLOWANCE identifies a short approval when the balance covers the price.

Error codes

For HTTP 4xx or 5xx, match the status and response text below. For guidance on codes shared across endpoints, see Error meanings and recovery.

Authorizations

x-builder-api-key
string
header
required

Your approved builder API key. Keep it on your backend. Gacha and marketplace writes also require wallet action signatures. Redeem also needs a wallet access token, a Bearer token the API issues after the wallet signs a sign-in message.

Body

application/json
packId
string<uuid>
required
numOfTokens
integer
required
Required range: 1 <= x <= 10
amountPerToken
string
required
Pattern: ^\d+$
nonce
string
required
Pattern: ^\d+$
deadline
integer
required
buyerWalletAddress
string
required
permitSignature
string
required

Signature over the typed data that prepare returned, as hex of at most 4,096 bytes. An EOA signs the typed data. A contract wallet submits what its isValidSignature accepts for that data's EIP-712 digest, which can be empty (0x); Permit2 is the caller. The signature is checked before payment and again on chain.

Response

The pull was accepted. The body is the pull status.

requestId
string<uuid>
required
status
enum<string>
required
  • PENDING_PAYMENT — The API accepted the pull and is processing the payment.
  • PENDING_RESOLUTION — Payment is confirmed and the API is assigning cards. The status can no longer change to FAILED.
  • RESOLVED — The pull is complete. Read result.draws for the cards.
  • FAILED — The buyer was never charged. Read error.code for the reason.
Available options:
PENDING_PAYMENT,
PENDING_RESOLUTION,
RESOLVED,
FAILED
buyerWalletAddress
string
required

20-byte, 0x-prefixed wallet or contract address. Use lowercase or a valid checksum.

packId
string<uuid>
required
nonce
string
required
numOfTokens
integer
required
permitFundTxHash
string | null
required

The funding transaction hash. Null until payment is confirmed.

error
object | null
required

Contains code and message when status is FAILED. Null for all other statuses. See pull failures and recovery.

result
object · null · null
required

The same body as GET /v2/gacha/draw-status for this pull. Null unless the status is RESOLVED.