> ## Documentation Index
> Fetch the complete documentation index at: https://docs.renaiss.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# 准备抽卡

> 按买家选定的卡包和数量，获取购买明细及需要签署的 Permit2 数据。

请求签名前，将返回的链、钱包、卡包、单价和数量与买家核对过的信息比对。详见[提交抽卡](https://docs.renaiss.xyz/cn/gacha.md#提交抽卡)。

提交前，请检查钱包在 `approval.token` 上授予 `approval.spender` 的额度。若低于 `approval.requiredAmount`，请授权所需金额并等待确认。

## 请求

需要开发者密钥

## 响应

## 错误码

在下表中查找接口返回的 HTTP 状态码和响应原文。有关各接口通用的处理建议，请参阅[错误码含义与处理方式](https://docs.renaiss.xyz/cn/api-reference/errors.md)。

| HTTP | 错误码 | 文本字段 | 响应文本与处理方式 |
| :- | :- | :- | :- |
| `400` | `API_AUTH_INVALID_INPUT` | `error` | `Request body is too large` 请求体超过 16 KiB。请缩小请求体。 |
| `400` | `CARD_PACK_NOT_ACTIVE` | `error` | `Card pack is not active` 卡包未在售，标记为不可购买，无需重试。 |
| `400` | `CONTRACT_WALLET_CANNOT_RECEIVE_NFT` | `error` | `The contract wallet does not accept ERC-721 transfers from the NFT contract` 合约钱包无法接收藏品。请使用能够接收藏品的钱包。 |
| `400` | `WRONG_REQUEST_PARAMS` | `error` | `Delegated wallets are not supported by the v2 EOA contract` 字段缺失或格式错误，修正后重发。常规不支持的委托账户返回 `{ error, code }`，请更换钱包。 |
| `400` | `WRONG_REQUEST_PARAMS` | `message` | `Bad request - invalid parameters` |
| `400` | 无错误码 | `text/plain` | `Malformed JSON in request body` |
| `401` | `API_AUTH_INVALID_CREDENTIAL` | `error` | `Invalid authentication credential` 开发者密钥格式错误、未知、已过期或已撤销。请核对并更换密钥。 |
| `401` | `API_AUTH_MISSING_CREDENTIAL` | `error` | `Required authentication credential is missing` 请在 `x-builder-api-key` 请求头中提供开发者密钥。 |
| `403` | `API_AUTH_CREDENTIAL_NOT_ALLOWED` | `error` | `Credential is not allowed by this policy` 此路由只接受开发者密钥。移除 `Authorization` 请求头及其他凭据，再重新发送。 |
| `403` | `GACHA_V3_BUILDER_NOT_ACCEPTED_ON_PUBLIC_API` | `error` | `This builder checks out on its own surface, not on the public API` 此密钥无法用于当前 API。请联系 Renaiss，无需重试。 |
| `404` | `CARD_PACK_NOT_FOUND` | `error` | `VRF card pack not found` 卡包 ID 未知或卡包未公开。请通过 `GET /v2/gacha/packs` 查询可用 ID，不要用相同 ID 重试。 |
| `429` | `API_AUTH_RATE_LIMITED` | `error` | `Authentication rate limit exceeded` 已达到密钥的请求频率上限。稍候再以较低频率重试。 |
| `500` | `API_AUTH_ERROR` | `error` | `Internal server error` |
| `500` | `FUNCTION_ERROR` | `error` | `Internal server error` |
| `500` | `CARD_PACKS_QUERY_FAILED` `GACHA_V3_ON_CHAIN_PACK_ID_NOT_SET` `GACHA_V3_VENDING_MACHINE_ADDRESS_NOT_FOUND` `GACHA_V3_OPEN_PACK_CHECKOUT_BUDGET_ERROR` `GACHA_V3_SUB_PACK_LINEUP_LOAD_FAILED` | `error` | `Internal server error` 若问题持续出现，请将 `x-request-id` 提供给 Renaiss。 |
| `500` | 其他错误码 | `error` | `Internal server error` |


## OpenAPI

````yaml cn/api-reference/openapi.json POST /v2/gacha/pull/prepare
openapi: 3.1.1
info:
  version: 1.0.0
  title: Renaiss 开发者 API v2
  description: >-
    在 BNB 智能链（链 ID 56）上使用外部钱包接入抽卡、交易市场和实物兑换。所有已批准且有效的开发者密钥均可准备购买。


    藏品包括钱包可抽取、交易、回售或兑换的物品，例如卡牌。接口路径、字段和描述统一使用 collectible 表示藏品。


    可以匿名浏览目录。准备购买后，请由买家钱包签名。抽卡记录和回购报价需要开发者密钥，购买和回购还需操作签名。私有配送信息及兑换需要钱包访问令牌，由钱包在已注册的合作方来源签署登录消息后签发。抽卡和市场不使用钱包访问令牌。请在后端保管开发者密钥。


    操作钱包可以是 EOA 或已部署的 ERC-1271 合约账户。不支持 EIP-7702 委托账户、ERC-6492 或 ERC-8010 封装签名及
    Renaiss 托管的 Safe（签名验证后才会识别并拒绝该类 Safe）。无法接收 ERC-721 的合约钱包抽卡会返回
    `CONTRACT_WALLET_CANNOT_RECEIVE_NFT`。链上读取失败返回
    `API_AUTH_ERROR`（500）。钱包访问令牌及实物兑换仅支持 EOA。
servers:
  - url: https://api.renaiss.xyz
    description: BNB 智能链主网
  - url: https://dev-api.renaiss.xyz
    description: BNB 测试网
security: []
tags:
  - name: Gacha v2
    description: 使用 EOA 浏览和购买卡包、揭晓藏品、读取购买记录及回购。无需钱包访问令牌。
  - name: Marketplace
    description: 公开浏览藏品，通过外部钱包挂牌、出价、购买或撤单。交易需要开发者授权及钱包操作签名。
  - name: Users
    description: 查询特定钱包的藏品、市场总估值和链上活动。仅需开发者密钥，各接口按相应的可见范围返回记录。
  - name: Redemption
    description: 查询兑换资格、运费报价，准备并提交兑换及跟踪物流。需要开发者密钥及同一钱包的访问令牌。
  - name: Wallet access tokens
    description: >-
      获取、刷新或撤销实物兑换使用的钱包访问令牌。钱包签署一次性登录消息（5 分钟有效）后，API 返回访问令牌（15 分钟）和一次性刷新令牌（7
      天）。先注册精确的合作方前端来源。抽卡和市场无需钱包访问令牌。
paths:
  /v2/gacha/pull/prepare:
    post:
      tags:
        - Gacha v2
      summary: 准备购买及 Permit2 签名数据
      description: 按买家选定的卡包和数量，获取购买明细及需要签署的 Permit2 数据。
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                buyerWalletAddress:
                  type: string
                packId:
                  type: string
                  format: uuid
                quantity:
                  type: integer
                  minimum: 1
                  maximum: 10
                  default: 1
              required:
                - buyerWalletAddress
                - packId
              additionalProperties: false
      responses:
        '200':
          description: 成功
          content:
            application/json:
              schema:
                allOf:
                  - type: object
                    properties:
                      chainId:
                        type: integer
                        exclusiveMinimum: 0
                      buyerWalletAddress:
                        type: string
                        description: 带 0x 前缀的 20 字节钱包或合约地址。请使用全小写或有效的校验和格式。
                      pack:
                        type: object
                        properties:
                          id:
                            type: string
                            format: uuid
                          onChainPackId:
                            type: string
                            description: 32 字节，以 0x 开头，后接 64 个十六进制数字。
                          priceInUsdt:
                            type: string
                            pattern: ^\d+$
                          vendingMachineAddress:
                            type: string
                            description: 带 0x 前缀的 20 字节钱包或合约地址。请使用全小写或有效的校验和格式。
                        required:
                          - id
                          - onChainPackId
                          - priceInUsdt
                          - vendingMachineAddress
                      permit2TypedData:
                        type: object
                        properties:
                          domain:
                            type: object
                            properties:
                              name:
                                type: string
                                enum:
                                  - Permit2
                              chainId:
                                type: integer
                                exclusiveMinimum: 0
                              verifyingContract:
                                type: string
                                description: 带 0x 前缀的 20 字节钱包或合约地址。请使用全小写或有效的校验和格式。
                            required:
                              - name
                              - chainId
                              - verifyingContract
                          types:
                            type: object
                            additionalProperties:
                              type: array
                              items:
                                type: object
                                properties:
                                  name:
                                    type: string
                                  type:
                                    type: string
                                required:
                                  - name
                                  - type
                          primaryType:
                            type: string
                            enum:
                              - PermitWitnessTransferFrom
                          message:
                            type: object
                            properties:
                              permitted:
                                type: object
                                properties:
                                  token:
                                    type: string
                                    description: 带 0x 前缀的 20 字节钱包或合约地址。请使用全小写或有效的校验和格式。
                                  amount:
                                    type: string
                                    pattern: ^\d+$
                                required:
                                  - token
                                  - amount
                              spender:
                                type: string
                                description: 带 0x 前缀的 20 字节钱包或合约地址。请使用全小写或有效的校验和格式。
                              nonce:
                                type: string
                                pattern: ^\d+$
                              deadline:
                                type: string
                                pattern: ^\d+$
                              witness:
                                type: object
                                properties:
                                  packId:
                                    type: string
                                    description: 32 字节，以 0x 开头，后接 64 个十六进制数字。
                                  builder:
                                    type: string
                                    description: 32 字节，以 0x 开头，后接 64 个十六进制数字。
                                  numOfTokens:
                                    type: string
                                    pattern: ^\d+$
                                required:
                                  - packId
                                  - builder
                                  - numOfTokens
                            required:
                              - permitted
                              - spender
                              - nonce
                              - deadline
                              - witness
                        required:
                          - domain
                          - types
                          - primaryType
                          - message
                      unsignedPullPayload:
                        type: object
                        properties:
                          packId:
                            type: string
                            format: uuid
                          builderCode:
                            type: string
                            description: 32 字节，以 0x 开头，后接 64 个十六进制数字。
                          numOfTokens:
                            type: integer
                            minimum: 1
                            maximum: 10
                          amountPerToken:
                            type: string
                            pattern: ^\d+$
                          nonce:
                            type: string
                            pattern: ^\d+$
                          deadline:
                            type: integer
                            exclusiveMinimum: 0
                        required:
                          - packId
                          - builderCode
                          - numOfTokens
                          - amountPerToken
                          - nonce
                          - deadline
                    required:
                      - chainId
                      - buyerWalletAddress
                      - pack
                      - permit2TypedData
                      - unsignedPullPayload
                  - type: object
                    properties:
                      approval:
                        type: object
                        properties:
                          token:
                            type: string
                            description: 带 0x 前缀的 20 字节钱包或合约地址。请使用全小写或有效的校验和格式。
                          spender:
                            type: string
                            description: 带 0x 前缀的 20 字节钱包或合约地址。请使用全小写或有效的校验和格式。
                          requiredAmount:
                            type: string
                        required:
                          - token
                          - spender
                          - requiredAmount
                    required:
                      - approval
        '400':
          description: |-
            请求在执行前被拒绝。

            见[错误码与处理方式](/cn/api-reference/gacha/prepare-pull#http-errors)。
          content:
            text/plain:
              schema:
                type: string
              example: Malformed JSON in request body
            application/json:
              schema:
                anyOf:
                  - type: object
                    properties:
                      error:
                        type: string
                        description: 简短的错误说明。
                      code:
                        type: string
                        enum:
                          - WRONG_REQUEST_PARAMS
                          - API_AUTH_INVALID_INPUT
                          - CARD_PACK_NOT_ACTIVE
                          - CONTRACT_WALLET_CANNOT_RECEIVE_NFT
                    required:
                      - error
                      - code
                  - type: object
                    properties:
                      code:
                        type: string
                        enum:
                          - WRONG_REQUEST_PARAMS
                      message:
                        type: string
                        description: 简短的错误说明。
                    required:
                      - code
                      - message
              example:
                code: WRONG_REQUEST_PARAMS
                message: Bad request - invalid parameters
        '401':
          description: |-
            缺少开发者密钥或密钥未通过验证。

            见[错误码与处理方式](/cn/api-reference/gacha/prepare-pull#http-errors)。
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: 简短的错误说明。
                  code:
                    type: string
                    enum:
                      - API_AUTH_MISSING_CREDENTIAL
                      - API_AUTH_INVALID_CREDENTIAL
                required:
                  - error
                  - code
              example:
                error: Required authentication credential is missing
                code: API_AUTH_MISSING_CREDENTIAL
        '403':
          description: |-
            当前凭据无权执行此请求。

            见[错误码与处理方式](/cn/api-reference/gacha/prepare-pull#http-errors)。
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: 简短的错误说明。
                  code:
                    type: string
                    enum:
                      - API_AUTH_CREDENTIAL_NOT_ALLOWED
                      - GACHA_V3_BUILDER_NOT_ACCEPTED_ON_PUBLIC_API
                required:
                  - error
                  - code
              example:
                error: Credential is not allowed by this policy
                code: API_AUTH_CREDENTIAL_NOT_ALLOWED
        '404':
          description: |-
            未找到该卡包。

            见[错误码与处理方式](/cn/api-reference/gacha/prepare-pull#http-errors)。
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: 简短的错误说明。
                  code:
                    type: string
                    enum:
                      - CARD_PACK_NOT_FOUND
                required:
                  - error
                  - code
              example:
                error: VRF card pack not found
                code: CARD_PACK_NOT_FOUND
        '429':
          description: |-
            该开发者密钥的请求过于频繁。

            见[错误码与处理方式](/cn/api-reference/gacha/prepare-pull#http-errors)。
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: 简短的错误说明。
                  code:
                    type: string
                    enum:
                      - API_AUTH_RATE_LIMITED
                required:
                  - error
                  - code
              example:
                error: Authentication rate limit exceeded
                code: API_AUTH_RATE_LIMITED
        '500':
          description: |-
            服务端暂时失败，请稍后重试。

            见[错误码与处理方式](/cn/api-reference/gacha/prepare-pull#http-errors)。
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: 简短的错误说明。
                  code:
                    type: string
                required:
                  - error
                  - code
              example:
                error: Internal server error
                code: FUNCTION_ERROR
      security:
        - builderAuth: []
components:
  securitySchemes:
    builderAuth:
      type: apiKey
      in: header
      name: x-builder-api-key
      description: >-
        已获准使用的开发者 API 密钥，仅在后端保存。抽卡和市场的写入操作还需钱包签名，实物兑换还需钱包签署登录消息后由 API 签发的 Bearer
        令牌。

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.