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

# private/send_block_proposal

> Posts the caller's signed maker side of a block trade as a block proposal, for a taker to accept with private/accept_block_proposal. The side is signed as the maker side of private/execute_block_trade. The exchange keeps the signature, and no other user can see it. With recipient_wallet, only that wallet can see and accept the proposal. With listed true, the proposal is on the public list that public/get_block_proposals returns, and anyone can accept it. With neither, anyone who has the proposal_id can read and accept the proposal, so share the id only with the intended counterparty. A listed proposal cannot have a recipient_wallet. The proposal can be accepted while the signed side can execute: until 60 seconds before its signature_expiry_sec, or 59 minutes after its nonce time, whichever is first. The response gives that time as expires_at_sec. So the signed signature_expiry_sec sets how long the proposal stays open. A proposal must stay open for at least 60 seconds, or the call fails with invalid_params (-32602). The side must pass the checks that private/verify_block_trade makes for a maker side, except that its nonce time can be up to 59 minutes old. Its total cost must be inside the currency's RFQ price band. A proposal trades with no broker fee. A wallet can have a limited number of open proposals. Returns the proposal with its proposal_id. Its maker and its recipient also receive it on the {wallet}.block_proposals channel. Fails with block_trade_outside_price_band (11123) if the total cost is outside the band, with block_trades_not_available_for_currency (11124) if the currency has no band, with insufficient_funds (11000) if the side does not have enough margin, with block_trade_same_owner (11115) if recipient_wallet is the caller's wallet, with non_unique_nonce (11017) if an open proposal already uses the nonce, and with rate_limit_exceeded (-32000) if the wallet has too many open proposals. Requires the block_trade off-chain scope. A session key that signs the side needs block_trade and an RFQ trade scope for every instrument in the legs.



## OpenAPI

````yaml /openapi.json post /private/send_block_proposal
openapi: 3.1.0
info:
  title: Derive v3 API
  version: 0.2.0
  description: JSON-RPC 2.0 methods, served over WebSocket and HTTP POST.
servers:
  - url: https://api.derive.xyz/v3
    description: Production (HTTP POST base)
  - url: https://testnet.api.derive.xyz/v3
    description: Testnet (HTTP POST base)
security: []
tags:
  - name: Subaccounts
    description: >-
      List, inspect, and label subaccounts, portfolios, positions, and
      collateral.
  - name: Session Keys
    description: Register, edit, and list delegated signing keys.
  - name: Account
    description: Wallet-level account information and settings.
  - name: Orderbook
    description: Place, replace, cancel, and query orders, trigger orders, and algos.
  - name: RFQ
    description: 'Request-for-quote: send RFQs, quote, and execute block trades.'
  - name: Liquidations
    description: >-
      Open a Dutch auction against a breaching subaccount, quote the auctions
      running right now, bid on them, and review past ones.
  - name: Vault Shareholders
    description: >-
      Deposit into and withdraw from vaults, and track shares, requests, and
      performance.
  - name: Vault Curators
    description: >-
      Create and operate curated vaults: settle deposit and withdrawal requests,
      and manage vault metadata.
  - name: History
    description: >-
      Per-account historical records: orders, trades, transfers, and
      settlements.
  - name: Market Maker Protection
    description: Configure, read, and reset market-maker protection.
  - name: Transfers & Withdrawals
    description: Move collateral between subaccounts, to other wallets, and on-chain.
  - name: Onchain Actions
    description: >-
      L1 onchain actions submitted via OnchainActionManager: register deposit
      addresses, list pending deposits, and inspect onchain action history.
  - name: System
    description: Rate limits, transaction lookups, and live incidents.
  - name: Market Data
    description: Instruments, currencies, tickers, and market-wide feeds.
  - name: Maker Scoring
    description: Maker programs, score breakdowns, and detailed scoring snapshots.
  - name: Referrals
    description: Referral codes and program performance.
  - name: Chat
    description: Anonymous chat rooms and conversations with the concierge.
  - name: Other
    description: Uncategorized.
paths:
  /private/send_block_proposal:
    post:
      tags:
        - RFQ
      summary: private/send_block_proposal
      description: >-
        Posts the caller's signed maker side of a block trade as a block
        proposal, for a taker to accept with private/accept_block_proposal. The
        side is signed as the maker side of private/execute_block_trade. The
        exchange keeps the signature, and no other user can see it. With
        recipient_wallet, only that wallet can see and accept the proposal. With
        listed true, the proposal is on the public list that
        public/get_block_proposals returns, and anyone can accept it. With
        neither, anyone who has the proposal_id can read and accept the
        proposal, so share the id only with the intended counterparty. A listed
        proposal cannot have a recipient_wallet. The proposal can be accepted
        while the signed side can execute: until 60 seconds before its
        signature_expiry_sec, or 59 minutes after its nonce time, whichever is
        first. The response gives that time as expires_at_sec. So the signed
        signature_expiry_sec sets how long the proposal stays open. A proposal
        must stay open for at least 60 seconds, or the call fails with
        invalid_params (-32602). The side must pass the checks that
        private/verify_block_trade makes for a maker side, except that its nonce
        time can be up to 59 minutes old. Its total cost must be inside the
        currency's RFQ price band. A proposal trades with no broker fee. A
        wallet can have a limited number of open proposals. Returns the proposal
        with its proposal_id. Its maker and its recipient also receive it on the
        {wallet}.block_proposals channel. Fails with
        block_trade_outside_price_band (11123) if the total cost is outside the
        band, with block_trades_not_available_for_currency (11124) if the
        currency has no band, with insufficient_funds (11000) if the side does
        not have enough margin, with block_trade_same_owner (11115) if
        recipient_wallet is the caller's wallet, with non_unique_nonce (11017)
        if an open proposal already uses the nonce, and with rate_limit_exceeded
        (-32000) if the wallet has too many open proposals. Requires the
        block_trade off-chain scope. A session key that signs the side needs
        block_trade and an RFQ trade scope for every instrument in the legs.
      operationId: private_send_block_proposal
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SendBlockProposalRequest'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BlockProposalPrivateResponse'
        default:
          description: JSON-RPC error (see Error Codes)
          content:
            application/json:
              schema:
                type: object
                required:
                  - error
                properties:
                  error:
                    $ref: '#/components/schemas/RPCError'
      security:
        - DeriveWallet: []
          DeriveTimestamp: []
          DeriveSignature: []
components:
  schemas:
    SendBlockProposalRequest:
      description: >-
        The caller's maker side of a block trade, signed as for
        `private/execute_block_trade`, and who can accept it.
      type: object
      required:
        - direction
        - legs
        - max_fee
        - nonce
        - signature
        - signature_expiry_sec
        - signer
        - subaccount_id
      properties:
        direction:
          $ref: '#/components/schemas/Direction'
        legs:
          type: array
          items:
            $ref: '#/components/schemas/PricedLegParamsAndResponse'
        listed:
          description: Whether the proposal is on the public list.
          default: false
          type: boolean
        max_fee:
          description: Highest total fee this side pays, in USD.
          type: string
          format: decimal
        nonce:
          type: string
        recipient_wallet:
          description: >-
            The only wallet that can see and accept the proposal. Not allowed
            with `listed`.
          anyOf:
            - $ref: '#/components/schemas/Address'
            - type: 'null'
        signature:
          type: string
        signature_expiry_sec:
          type: integer
          format: int64
        signer:
          $ref: '#/components/schemas/Address'
        subaccount_id:
          type: integer
          format: int64
    BlockProposalPrivateResponse:
      description: A block proposal as its maker and its recipient see it.
      type: object
      required:
        - block_trade_id
        - creation_timestamp
        - currency
        - direction
        - expires_at_sec
        - last_update_timestamp
        - legs
        - listed
        - maker_wallet
        - proposal_id
        - risk_universe_id
        - status
      properties:
        block_trade_id:
          description: The block trade, once the proposal executes.
          type:
            - string
            - 'null'
          format: uuid
        creation_timestamp:
          type: integer
          format: int64
        currency:
          type: string
        direction:
          $ref: '#/components/schemas/Direction'
          description: The maker's direction. The taker trades the opposite.
        expires_at_sec:
          description: The last second (UTC) at which the proposal can be accepted.
          type: integer
          format: int64
        last_update_timestamp:
          type: integer
          format: int64
        legs:
          type: array
          items:
            $ref: '#/components/schemas/PricedLegParamsAndResponse'
        listed:
          description: Whether the proposal is on the public list.
          type: boolean
        maker_wallet:
          $ref: '#/components/schemas/Address'
        proposal_id:
          description: UUID v4 string
          type: string
          format: uuid
        recipient_wallet:
          description: >-
            The only wallet that can accept the proposal. Null if any wallet
            can.
          anyOf:
            - $ref: '#/components/schemas/Address'
            - type: 'null'
        risk_universe_id:
          type: integer
          format: uint32
          minimum: 0
        status:
          $ref: '#/components/schemas/BlockProposalStatus'
    RPCError:
      type: object
      required:
        - code
        - message
      properties:
        code:
          type: integer
          format: int64
        data:
          type:
            - string
            - 'null'
        message:
          type: string
    Direction:
      type: string
      enum:
        - buy
        - sell
    PricedLegParamsAndResponse:
      type: object
      required:
        - amount
        - direction
        - instrument_name
        - price
      properties:
        amount:
          description: >-
            Non-negative decimal string of the human value (e.g. `"1.5"`), up to
            12 fractional digits; a string or JSON number is accepted
          type: string
          format: decimal
        direction:
          $ref: '#/components/schemas/Direction'
        instrument_name:
          type: string
        price:
          description: >-
            Non-negative decimal string of the human value (e.g. `"1.5"`), up to
            12 fractional digits; a string or JSON number is accepted
          type: string
          format: decimal
    Address:
      description: 20-byte Ethereum address as a 0x-prefixed lowercase hex string.
      type: string
      maxLength: 42
      minLength: 42
      pattern: ^0x[0-9a-fA-F]{40}$
    BlockProposalStatus:
      oneOf:
        - type: string
          enum:
            - open
            - executing
            - executed
            - expired
        - description: By the maker.
          type: string
          enum:
            - cancelled
        - description: By the recipient.
          type: string
          enum:
            - declined
  securitySchemes:
    DeriveWallet:
      type: apiKey
      in: header
      name: X-DeriveWallet
      description: The wallet the request acts for.
    DeriveTimestamp:
      type: apiKey
      in: header
      name: X-DeriveTimestamp
      description: The current time in milliseconds, as a decimal string.
    DeriveSignature:
      type: apiKey
      in: header
      name: X-DeriveSignature
      description: >-
        EIP-191 signature of the timestamp, by the wallet or one of its session
        keys.

````

## Related topics

- [RFQ Trading](https://docs.derive.xyz/trading/rfq.md)
- [Rate Limits](https://docs.derive.xyz/rate-limits.md)
- [Changelog](https://docs.derive.xyz/changelog.md)


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