> ## 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.

# Submit a buyback for polling

> Each accepted submission creates a new request. Poll `GET /v2/gacha/buyback/status` with its `requestId` for the outcome.

1. **Sign.** Have the seller sign `BuybackUserAuthorization` for settlement IDs from the same pack. Submit the same body and builder key used by [Settle a buyback](https://docs.renaiss.xyz/api-reference/gacha/settle-buyback.md). An ID from another pack can return HTTP `404` with `EOA_PURCHASE_REJECTED`.
2. **Track.** Save `requestId` from HTTP `202`. [Check buyback status](https://docs.renaiss.xyz/api-reference/gacha/get-buyback-status.md) about once per second until `COMPLETED` or `FAILED`. Each submission creates a separate request.
3. **Handle a failure.** A failed request carries the same error code as a direct settlement. For `OP_WALLET_BUSY`, retry with the same signature. For other failures, refresh the offers and request a new signature.

## Request

Builder key and wallet signature

## Response

HTTP `202` returns `status: "PENDING"`, `error: null` and a new `requestId`. Use [Get buyback status](https://docs.renaiss.xyz/api-reference/gacha/get-buyback-status.md) for settlement failures.

## Error codes

Match the HTTP status and response text to a row below. For guidance on codes shared across endpoints, see [Error meanings and recovery](https://docs.renaiss.xyz/api-reference/errors.md).

| HTTP | Error code | Text field | Response text and recovery |
| :- | :- | :- | :- |
| `400` | `API_AUTH_INVALID_INPUT` | `error` | `Request body is too large` The request body exceeds 16 KiB. Send a smaller body. |
| `400` | `EOA_PURCHASE_REJECTED` | `error` | `SAFE addresses are not supported by v2` The wallet cannot be used for this buyback. Use another wallet. |
| `400` | `WRONG_REQUEST_PARAMS` | `message` | `Bad request - invalid parameters` A field is missing or has the wrong form. Fix the request and send it again. |
| `400` | No code | `text/plain` | `Malformed JSON in request body` |
| `401` | `API_AUTH_INVALID_CREDENTIAL` | `error` | `Invalid authentication credential` The builder key is malformed, unknown, expired or revoked. Check the key. Do not retry with the same key. |
| `401` | `API_AUTH_MISSING_CREDENTIAL` | `error` | `Required authentication credential is missing` No builder key was sent. Send your builder key in the `x-builder-api-key` header. |
| `403` | `API_AUTH_CREDENTIAL_NOT_ALLOWED` | `error` | `Credential is not allowed by this policy` This route takes a builder key only. Remove the `Authorization` header and any other credential, then send the request again. |
| `403` | `API_AUTH_INVALID_ACTION` | `error` | `Invalid wallet action proof` The signature was not accepted for the wallet and the signed data, or the buyback window has closed. Read the offers again and sign the new data. For a contract wallet, its `isValidSignature` must return `0x1626ba7e` for the EIP-712 digest of the signed data. |
| `403` | `GACHA_V3_BUILDER_NOT_ACCEPTED_ON_PUBLIC_API` | `error` | `This builder checks out on its own surface, not on the public API` This builder key cannot be used on this API. Do not retry; contact Renaiss. |
| `404` | `EOA_PURCHASE_REJECTED` | `error` | `One or more builder draws were not found` `Pack not found` One or more of the collectibles were not pulled by this wallet under your builder key, or the pack was not found. Check the pack id and the settlement ids from `GET /v2/gacha/buyback/offers`. |
| `404` | Other code | `error` | Read the returned `error` string. |
| `429` | `API_AUTH_RATE_LIMITED` | `error` | `Authentication rate limit exceeded` The builder key hit its rate limit. Wait a little, then retry at a lower rate. |
| `500` | `API_AUTH_ERROR` | `error` | `Internal server error` The signature could not be checked because the chain could not be read. Retry the request. |
| `500` | `FUNCTION_ERROR` | `error` | `Internal server error` |
| `500` | Other code | `error` | `Internal server error` |


## OpenAPI

````yaml api-reference/openapi.json POST /v2/gacha/buyback/request
openapi: 3.1.1
info:
  version: 1.0.0
  title: Renaiss Builder API v2
  description: >-
    Builder API v2 for gacha, marketplace and redemption with external wallets
    on BNB Smart Chain (chain 56). Any active, approved builder key can prepare
    purchases.


    A collectible is an item a wallet can pull, trade, sell back or redeem, such
    as a card. This API calls every such item a collectible (e.g. cards), in
    paths, fields and descriptions.


    Browse publicly, then prepare and sign actions with the buyer wallet. Gacha
    history and buyback offers require your builder key; purchases and buybacks
    also require a wallet action signature. Private shipping data and redemption
    require a wallet access token, which the API issues from a registered
    partner origin after the wallet signs a sign-in message. Gacha and
    marketplace never use a wallet access token. Keep the builder key on your
    backend.


    The acting wallet is an EOA or a deployed ERC-1271 contract account.
    EIP-7702 delegated accounts, ERC-6492 and ERC-8010 wrapped signatures and
    Renaiss-managed Safes are refused (a Safe only after its signature
    verified). A pull to a contract account that cannot receive ERC-721 tokens
    returns `CONTRACT_WALLET_CANNOT_RECEIVE_NFT`. A failed chain read returns
    `API_AUTH_ERROR` (500). Wallet access tokens and redemption are EOA only.
servers:
  - url: https://api.renaiss.xyz
    description: BNB Smart Chain
  - url: https://dev-api.renaiss.xyz
    description: BNB testnet
security: []
tags:
  - name: Gacha v2
    description: >-
      Direct-EOA pack browsing, purchases, collectible (e.g. card) reveals,
      purchase history and buybacks. Start here; no wallet access token is
      needed.
  - name: Marketplace
    description: >-
      Public collectible (e.g. card) browsing and external-wallet asks, bids,
      purchases and cancellations. Trading requires builder authorization and
      wallet action signatures.
  - name: Users
    description: >-
      What one wallet address has and did: its collectibles (e.g. cards), their
      total market value and its activities. The whole wallet, whichever builder
      it used. Requires your builder key only.
  - name: Redemption
    description: >-
      Shipping eligibility, quotes, redemption preparation, submission and
      tracking. Requires your builder key and a wallet access token for the same
      wallet.
  - name: Wallet access tokens
    description: >-
      Get, refresh and revoke the wallet access tokens that Redeem needs. The
      wallet signs a sign-in message (valid 5 minutes, one use); the API returns
      a wallet access token (15 minutes) and a refresh token (7 days, single
      use). Register exact partner frontend origins with Renaiss before use.
      Gacha and marketplace never use a wallet access token.
paths:
  /v2/gacha/buyback/request:
    post:
      tags:
        - Gacha v2
      summary: Submit a signed buyback and poll its requestId
      description: >-
        Each accepted submission creates a new request. Poll `GET
        /v2/gacha/buyback/status` with its `requestId` for the outcome.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                buyerWalletAddress:
                  type: string
                cardPackId:
                  type: string
                  format: uuid
                buybackAuth:
                  type: object
                  properties:
                    buybackIds:
                      type: array
                      items:
                        type: string
                      minItems: 1
                      maxItems: 10
                    token:
                      type: string
                    amount:
                      type: string
                      pattern: ^\d+$
                  required:
                    - buybackIds
                    - token
                    - amount
                userSignature:
                  type: string
              required:
                - buyerWalletAddress
                - cardPackId
                - buybackAuth
                - userSignature
              additionalProperties: false
      responses:
        '202':
          description: >-
            Each accepted submission creates a new request. Poll `GET
            /v2/gacha/buyback/status` with its `requestId` for the outcome.
          content:
            application/json:
              schema:
                type: object
                properties:
                  requestId:
                    type: string
                    format: uuid
                  status:
                    type: string
                    enum:
                      - PENDING
                  buyerWalletAddress:
                    type: string
                    description: >-
                      20-byte, 0x-prefixed wallet or contract address. Use
                      lowercase or a valid checksum.
                  cardPackId:
                    type: string
                    format: uuid
                  settlementIds:
                    type: array
                    items:
                      type: string
                      description: >-
                        32 bytes encoded as 0x followed by 64 hexadecimal
                        digits.
                  txHash:
                    type: 'null'
                  totalAmountInUsdt:
                    type: 'null'
                  itemCount:
                    type: 'null'
                  error:
                    type: 'null'
                required:
                  - requestId
                  - status
                  - buyerWalletAddress
                  - cardPackId
                  - settlementIds
                  - txHash
                  - totalAmountInUsdt
                  - itemCount
                  - error
              examples:
                PENDING:
                  summary: The buyback is in progress.
                  value:
                    requestId: b81d0f7e-2c4a-4d6b-8e13-5a9c7d1f3b20
                    buyerWalletAddress: '0x4f2a9c1e7b3d58a60c9e1f2b3d4a5c6e7f8091a2'
                    cardPackId: 3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6c4f13
                    settlementIds:
                      - >-
                        0x2222222222222222222222222222222222222222222222222222222222222222
                    status: PENDING
                    txHash: null
                    totalAmountInUsdt: null
                    itemCount: null
                    error: null
        '400':
          description: >-
            The request was refused before anything happened.


            See [error codes and
            recovery](/api-reference/gacha/submit-buyback#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: A short sentence about what went wrong.
                      code:
                        type: string
                        enum:
                          - API_AUTH_INVALID_INPUT
                          - EOA_PURCHASE_REJECTED
                    required:
                      - error
                      - code
                  - type: object
                    properties:
                      code:
                        type: string
                        enum:
                          - WRONG_REQUEST_PARAMS
                      message:
                        type: string
                        description: A short sentence about what went wrong.
                    required:
                      - code
                      - message
              example:
                code: WRONG_REQUEST_PARAMS
                message: Bad request - invalid parameters
        '401':
          description: >-
            The builder key is missing or not accepted.


            See [error codes and
            recovery](/api-reference/gacha/submit-buyback#http-errors).
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: A short sentence about what went wrong.
                  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: >-
            The request is refused.


            See [error codes and
            recovery](/api-reference/gacha/submit-buyback#http-errors).
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: A short sentence about what went wrong.
                  code:
                    type: string
                    enum:
                      - API_AUTH_INVALID_ACTION
                      - API_AUTH_CREDENTIAL_NOT_ALLOWED
                      - GACHA_V3_BUILDER_NOT_ACCEPTED_ON_PUBLIC_API
                required:
                  - error
                  - code
              example:
                error: Invalid wallet action proof
                code: API_AUTH_INVALID_ACTION
        '404':
          description: >-
            A collectible or the pack was not found.


            - Other codes can appear. Read `GET /v2/gacha/buyback/offers` before
            you send the request again.


            See [error codes and
            recovery](/api-reference/gacha/submit-buyback#http-errors).
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: A short sentence about what went wrong.
                  code:
                    type: string
                required:
                  - error
                  - code
              example:
                error: One or more builder draws were not found
                code: EOA_PURCHASE_REJECTED
        '429':
          description: >-
            Too many requests with this builder key.


            See [error codes and
            recovery](/api-reference/gacha/submit-buyback#http-errors).
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: A short sentence about what went wrong.
                  code:
                    type: string
                    enum:
                      - API_AUTH_RATE_LIMITED
                required:
                  - error
                  - code
              example:
                error: Authentication rate limit exceeded
                code: API_AUTH_RATE_LIMITED
        '500':
          description: >-
            A failure on our side before the buyback was accepted. Nothing was
            sent. Retry later.


            See [error codes and
            recovery](/api-reference/gacha/submit-buyback#http-errors).
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: A short sentence about what went wrong.
                  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: >-
        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.

````

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