Paradex Subkey API

The Subkey API from Paradex — 5 operation(s) for subkey.

Operations 8

GET /account/keys/subkeys List Subkeys #
POST /account/keys/subkeys Register Subkey #
POST /account/keys/subkeys/activate Activate pending subkey #
GET /account/keys/subkeys/{public_key} Get Subkey #
PUT /account/keys/subkeys/{public_key} Update Subkey #
DELETE /account/keys/subkeys/{public_key} Revoke Subkey #
PUT /account/keys/subkeys/{public_key}/allowed-cidrs Update subkey IP allowlist #
PUT /account/keys/subkeys/{public_key}/block-trade-signing Set subkey block trade signing #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/paradex:paradex-subkey-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

paradex-subkey-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Paradex Subkey API
  version: 1.142.2
  contact: {}
  description: 'Operations tagged Subkey across 2 of this provider''s published API definitions: paradex-openapi-prod.json, paradex-openapi.yml. Each path carries the servers of the definition it was published in.'
servers:
- url: https://api.prod.paradex.trade/v1
tags:
- name: Subkey
paths:
  /account/keys/subkeys:
    get:
      security:
      - BearerToken: []
      description: Get all subkeys for the authenticated account with optional filtering by status.
      tags:
      - Subkey
      summary: List Subkeys
      operationId: list-subkeys
      parameters:
      - description: Include revoked subkeys
        name: with_revoked
        in: query
        schema:
          type: boolean
      responses:
        '200':
          description: List of subkeys
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/responses.APIResults'
                - type: object
                  properties:
                    results:
                      type: array
                      items:
                        $ref: '#/components/schemas/responses.Subkey'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ApiError'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ApiError'
    post:
      security:
      - BearerToken: []
      description: Register a new subkey for the authenticated account.
      tags:
      - Subkey
      summary: Register Subkey
      operationId: register-subkey
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/requests.CreateSubkey'
        description: Subkey registration request
        required: true
      responses:
        '201':
          description: An empty response
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ApiError'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ApiError'
        '403':
          description: IP restrictions not enabled for this account
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ApiError'
    servers:
    - url: https://api.prod.paradex.trade/v1
  /account/keys/subkeys/activate:
    post:
      description: 'Activate a pending subkey by providing a Starknet signature

        over `pedersen(timestamp, eph_public_key)`.'
      tags:
      - Subkey
      summary: Activate pending subkey
      operationId: activate-subkey
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/requests.ActivateSubkey'
        description: Subkey activation request
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/requests.ActivateSubkeyResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ApiError'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ApiError'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ApiError'
    servers:
    - url: https://api.prod.paradex.trade/v1
  /account/keys/subkeys/{public_key}:
    get:
      security:
      - BearerToken: []
      description: Get a specific subkey for the authenticated account by its public key.
      tags:
      - Subkey
      summary: Get Subkey
      operationId: get-subkey
      parameters:
      - description: Subkey public key
        name: public_key
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Subkey details
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.Subkey'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ApiError'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ApiError'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ApiError'
    put:
      security:
      - BearerToken: []
      description: Update properties of an existing subkey for the authenticated account.
      tags:
      - Subkey
      summary: Update Subkey
      operationId: update-subkey
      parameters:
      - description: Subkey public key
        name: public_key
        in: path
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/requests.UpdateSubkey'
        description: Update subkey request
        required: true
      responses:
        '200':
          description: Updated subkey details
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.Subkey'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ApiError'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ApiError'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ApiError'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ApiError'
    delete:
      security:
      - BearerToken: []
      description: Revoke a subkey for the authenticated account.
      tags:
      - Subkey
      summary: Revoke Subkey
      operationId: revoke-subkey
      parameters:
      - description: Subkey public key
        name: public_key
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Subkey revoked successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.RevokeSubkeyResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ApiError'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ApiError'
    servers:
    - url: https://api.prod.paradex.trade/v1
  /account/keys/subkeys/{public_key}/allowed-cidrs:
    put:
      security:
      - BearerToken: []
      description: Replace the IP CIDR allowlist for a subkey. Empty array clears the allowlist (unrestricted). Only callable with the main account; subkeys cannot widen their own allowlist.
      tags:
      - Subkey
      summary: Update subkey IP allowlist
      operationId: update-subkey-allowed-cidrs
      parameters:
      - description: Subkey public key
        name: public_key
        in: path
        required: true
        schema:
          type: string
      requestBody:
        $ref: '#/components/requestBodies/requests.UpdateAllowedCIDRs'
      responses:
        '200':
          description: Updated subkey details
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.Subkey'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ApiError'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ApiError'
        '403':
          description: IP restrictions not enabled for this account
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ApiError'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ApiError'
    servers:
    - url: https://api.prod.paradex.trade/v1
  /account/keys/subkeys/{public_key}/block-trade-signing:
    put:
      security:
      - BearerToken: []
      description: Set whether an active subkey is enabled to sign block trades (create, offer and execute signatures) for the account. Subkeys start with it off. The Paradigm RFQ delegation key follows its delegation instead, and changing it is rejected with 400, as is a subkey that is not active yet. Only callable with the main account.
      tags:
      - Subkey
      summary: Set subkey block trade signing
      operationId: update-subkey-block-trade-signing
      parameters:
      - description: Subkey public key
        name: public_key
        in: path
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/requests.UpdateSubkeyBlockTradeSigning'
        description: Block trade signing setting
        required: true
      responses:
        '200':
          description: Updated subkey details
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.Subkey'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ApiError'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ApiError'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ApiError'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ApiError'
    servers:
    - url: https://api.prod.paradex.trade/v1
components:
  schemas:
    requests.CreateSubkey:
      type: object
      required:
      - name
      - public_key
      properties:
        allowed_cidrs:
          description: 'Optional IP CIDR allowlist applied atomically at creation, so the subkey

            is never live unrestricted. Empty/omitted = unrestricted. Max 50 entries;

            same format as PUT .../allowed-cidrs (e.g. "203.0.113.0/24"). Not covered

            by the registration signature: the list is mutable post-creation via the

            JWT-only allowed-cidrs endpoint, so signing it would add no protection.'
          type: array
          items:
            type: string
          example:
          - '["203.0.113.0/24"'
          - '"198.51.100.42/32"]'
        encrypted_key:
          description: Encrypted private key (required if state=pending).
          type: string
          example: 0xabc...
        eph_public_key:
          description: Ephemeral public key for signature verification (required if state=pending).
          type: string
          example: 0x123...
        evm_signature:
          description: 'EVM (EIP-191) registration signature, used in place of `signature` /

            `signature_timestamp` / `signature_expiry` when the account''s main

            key is a secp256k1 key (AccountSignerType == EIP191). The server

            reconstructs nothing — the raw SIWE message presented to the user is

            supplied verbatim in `siwe_message` and the personal_sign signature

            in `evm_signature`. The SIWE message''s Statement must equal

            "Paradex Subkey Registration: 0x<new_subkey_pubkey>" (lowercased

            pubkey); that line is what binds the authorisation to the specific

            subkey being registered.'
          type: string
          example: 0x...
        name:
          description: User-friendly name for the subkey.
          type: string
          example: My Trading Subkey
        public_key:
          description: Public key to be registered as a subkey.
          type: string
          example: '0x3d9f2b2e5f50c1aade60ca540368cd7490160f41270c192c05729fe35b656a9'
        signature:
          description: 'Signature from the account''s main StarkNet private key over

            pedersen_array(account, public_key, signature_timestamp, signature_expiry).

            Required when the server enforces main-key authorization on subkey

            registration (feature flag EnableSubkeyRegistrationSignature). Format: [r, s].'
          type: array
          items:
            type: string
          example:
          - '["0xr..."'
          - '"0xs..."]'
        signature_expiry:
          description: Unix seconds; included in signed message and bounds replay window.
          type: integer
          example: 1706400600
        signature_timestamp:
          description: Unix seconds; included in signed message.
          type: integer
          example: 1706400000
        siwe_message:
          type: string
          example: app.paradex.trade wants you to sign in...
        state:
          description: 'State of the subkey: ''active'' or ''pending''. Defaults to ''active''.'
          type: string
          default: active
          example: active
    requests.ActivateSubkeyResponse:
      type: object
      properties:
        encrypted_key:
          description: Encrypted private key returned to client.
          type: string
          example: 0xabc...
    responses.RevokeSubkeyResponse:
      type: object
      properties:
        public_key:
          description: The public key of the revoked subkey
          type: string
          example: '0xabcdef1234567890abcdef'
    requests.UpdateSubkey:
      type: object
      required:
      - name
      properties:
        name:
          description: New name for the subkey.
          type: string
          example: My Updated Device Name
    responses.ErrorCode:
      type: string
      enum:
      - VALIDATION_ERROR
      - BINDING_ERROR
      - INTERNAL_ERROR
      - NOT_FOUND
      - SERVICE_UNAVAILABLE
      - INVALID_REQUEST_PARAMETER
      - ORDER_ID_NOT_FOUND
      - ORDER_IS_CLOSED
      - ORDER_IS_NOT_OPEN
      - INVALID_ORDER_SIZE
      - CLIENT_ORDER_ID_NOT_FOUND
      - DUPLICATED_CLIENT_ID
      - INVALID_SYMBOL
      - INVALID_TOKEN
      - INVALID_ETHEREUM_ADDRESS
      - INVALID_ETHEREUM_SIGNATURE
      - INVALID_STARKNET_ADDRESS
      - INVALID_STARKNET_SIGNATURE
      - STARKNET_SIGNATURE_VERIFICATION_FAILED
      - ETHEREUM_SIGNER_MISMATCH
      - ETHEREUM_HASH_MISMATCH
      - NOT_ONBOARDED
      - INVALID_TIMESTAMP
      - INVALID_BLOCK_EXPIRATION
      - ACCOUNT_NOT_FOUND
      - MEDIA_NOT_FOUND
      - INVALID_ORDER_SIGNATURE
      - PUBLIC_KEY_INVALID
      - UNAUTHORIZED_ETHEREUM_ADDRESS
      - UNAUTHORIZED_ERROR
      - ETHEREUM_ADDRESS_ALREADY_ONBOARDED
      - EVM_ADDRESS_ALREADY_ONBOARDED
      - MARKET_NOT_FOUND
      - ALLOWLIST_ENTRY_NOT_FOUND
      - USERNAME_IN_USE
      - GEO_IP_BLOCK
      - ETHEREUM_ADDRESS_BLOCKED
      - PROGRAM_NOT_FOUND
      - PROGRAM_NOT_SUPPORTED
      - INVALID_DASHBOARD
      - MARKET_NOT_OPEN
      - MARKET_NOT_SETTLED
      - INVALID_REFERRAL_CODE
      - REQUEST_NOT_ALLOWED
      - PARENT_ADDRESS_ALREADY_ONBOARDED
      - INVALID_PARENT_ACCOUNT
      - INVALID_VAULT_OPERATOR_CHAIN
      - VAULT_OPERATOR_ALREADY_ONBOARDED
      - VAULT_NAME_IN_USE
      - VAULT_NOT_FOUND
      - VAULT_STRATEGY_NOT_FOUND
      - VAULT_LIMIT_REACHED
      - VAULT_DATA_PRIVATE
      - BATCH_SIZE_OUT_OF_RANGE
      - ISOLATED_MARKET_ACCOUNT_MISMATCH
      - NO_ACCESS_TO_MARKET
      - POINTS_SUMMARY_NOT_FOUND
      - ALGO_ID_NOT_FOUND
      - INVALID_DERIVATION_PATH
      - PROFILE_STATS_NOT_FOUND
      - INVALID_CHAIN
      - INVALID_LAYERSWAP_SWAP
      - INVALID_DEPOSIT_ADDRESS
      - SOCIAL_USERNAME_IN_USE
      - INVALID_OAUTH_REQUEST
      - RPI_ACCOUNT_NOT_WHITELISTED
      - SYSTEM_STATUS_POST_ONLY
      - SYSTEM_STATUS_CANCEL_ONLY
      - INVALID_MARKETING_CODE
      - OFFER_NOT_FOUND
      - MARKET_MARGIN_RESTRICTED
      - NOT_UNIQUE
      - ACCOUNT_ALREADY_REFERRED
      - ONBOARDING_PERIOD_EXPIRED
      - ONBOARDING_RATE_LIMITED
      - RFQ_CREATE_BUDGET_EXCEEDED
      - SUBACCOUNTS_LIMIT_EXCEEDED
      - INSUFFICIENT_MIN_CHAIN_BALANCE
      - INSUFFICIENT_EVM_BALANCE
      - PORTFOLIO_MARGIN_ONBOARDING_DISABLED
      - PORTFOLIO_MARGIN_INVALID_ACCOUNT_KIND
      - EVM_VAULT_OPERATORS_DISABLED
      - VAULT_OPERATOR_OWNER_PROOF_REQUIRED
      - INVALID_EVM_SIGNATURE
      - EVM_SIGNATURE_VERIFICATION_FAILED
      - INVALID_SUBKEY
      - SUBKEY_NOT_ACTIVATABLE
      - SUBKEY_REVOKED
      - TOKEN_LIMIT_REACHED
      - INVALID_TOKEN_SCOPE
      - IP_NOT_ALLOWED
      - INSUFFICIENT_TRANSFERRABLE_XP
      - TRANSFER_LIMIT_REACHED
      - XP_TRANSFERS_DISABLED
      - BLOCK_TRADE_NOT_FOUND
      - BLOCK_TRADE_NOT_ENABLED
      - BLOCK_TRADE_EXPIRED
      - BLOCK_TRADE_ALREADY_CANCELLED
      - BLOCK_TRADE_INVALID_STATUS
      - BLOCK_TRADE_UNAUTHORIZED
      - BLOCK_TRADE_MISSING_TRADES
      - BLOCK_TRADE_MISSING_SIGNERS
      - BLOCK_TRADE_MISSING_SIGNATURE
      - BLOCK_TRADE_ACCOUNT_MISMATCH
      - BLOCK_TRADE_INVALID_SIGNATURE
      - BLOCK_TRADE_SIGNER_KEY_UNAUTHORIZED
      - BLOCK_TRADE_REPLAYED_SIGNATURE
      - BLOCK_TRADE_SELF_TRADE
      - OFFER_ALREADY_CANCELLED
      - OFFER_INVALID_STATUS
      - OFFER_UNAUTHORIZED
      - OFFER_PARENT_MISMATCH
      - OFFER_PARENT_NOT_ACCEPTING
      - PORTFOLIO_MARGIN_CONFIG_NOT_FOUND
      - MARGIN_CONFIG_NOT_FOUND
      - MMP_CONFIG_INVALID
      - MMP_NOT_ENABLED
      - MMP_MIN_FREEZE_NOT_ELAPSED
      - MMP_NOT_CONFIGURED
      - RFQ_VENUE_UNAVAILABLE
      x-enum-comments:
        ErrorCodeString_SignerMismatch: '#nosec G101'
      x-enum-varnames:
      - ErrorCode_Validation
      - ErrorCode_Binding
      - ErrorCode_InternalError
      - ErrorCode_NotFound
      - ErrorCode_ServiceUnavailable
      - ErrorCodeString_InvalidParameter
      - ErrorCodeString_OrderIdNotFound
      - ErrorCodeString_OrderIsClosed
      - ErrorCodeString_OrderIsNotOpen
      - ErrorCodeString_InvalidSizeForModifyOrder
      - ErrorCodeString_ClientOrderIdNotFound
      - ErrorCodeString_DuplicatedClientOrderId
      - ErrorCodeString_InvalidSymbol
      - ErrorCodeString_InvalidToken
      - ErrorCodeString_BadEthAddress
      - ErrorCodeString_BadEthSignature
      - ErrorCodeString_BadStarkNetAddress
      - ErrorCodeString_BadStarkNetSignature
      - ErrorCodeString_StarknetSigVerificationFailed
      - ErrorCodeString_SignerMismatch
      - ErrorCodeString_HashMismatch
      - ErrorCodeString_NotOnboarded
      - ErrorCodeString_BadTimestamp
      - ErrorCodeString_BadExpiration
      - ErrorCodeString_AccountIdNotFound
      - ErrorCodeString_MediaNotFound
      - ErrorCodeString_InvalidOrderSignature
      - ErrorCodeString_BadPublicKey
      - ErrorCodeString_UnauthorizedEthAddress
      - ErrorCodeString_UnauthorizedError
      - ErrorCodeString_EthAddressAlreadyOnboarded
      - ErrorCodeString_EvmAddressAlreadyOnboarded
      - ErrorCodeString_MarketNotFound
      - ErrorCodeString_AllowlistNotFound
      - ErrorCodeString_UsernameInUse
      - ErrorCodeString_GeoIPBlock
      - ErrorCodeString_EthAddressBlocked
      - ErrorCodeString_ProgramNotFound
      - ErrorCodeString_ProgramNotSupported
      - ErrorCodeString_InvalidDashboard
      - ErrorCodeString_MarketNotOpen
      - ErrorCodeString_MarketNotSettled
      - ErrorCodeString_InvalidReferralCode
      - ErrorCodeString_RequestNotAllowed
      - ErrorCodeString_ParentAddressAlreadyOnboarded
      - ErrorCodeString_InvalidParentAccount
      - ErrorCodeString_InvalidVaultOperatorChain
      - ErrorCodeString_VaultOperatorAlreadyOnboarded
      - ErrorCodeString_VaultNameInUse
      - ErrorCodeString_VaultNotFound
      - ErrorCodeString_VaultStrategyNotFound
      - ErrorCodeString_VaultLimitReached
      - ErrorCodeString_VaultDataPrivate
      - ErrorCodeString_BatchSizeOutOfRange
      - ErrorCodeString_IsolatedMarketAccountMismatch
      - ErrorCodeString_NoAccessToMarket
      - ErrorCodeString_PointsSummaryNotFound
      - ErrorCodeString_AlgoIdNotFound
      - ErrorCodeString_InvalidDerivationPath
      - ErrorCodeString_ProfileStatsNotFound
      - ErrorCodeString_InvalidChain
      - ErrorCodeString_InvalidLayerswapSwap
      - ErrorCodeString_InvalidDepositAddress
      - ErrorCodeString_SocialUsernameInUse
      - ErrorCodeString_InvalidOAuthRequest
      - ErrorCodeString_RPIAccountNotWhitelisted
      - ErrorCodeString_SystemStatusPostOnly
      - ErrorCodeString_SystemStatusCancelOnly
      - ErrorCodeString_InvalidMarketingCode
      - ErrorCodeString_OfferNotFound
      - ErrorCodeString_MarketMarginRestricted
      - ErrorCodeString_NotUnique
      - ErrorCodeString_AccountAlreadyReferred
      - ErrorCodeString_OnboardingPeriodExpired
      - ErrorCodeString_OnboardingRateLimited
      - ErrorCodeString_RfqCreateBudgetExceeded
      - ErrorCodeString_SubaccountsLimitExceeded
      - ErrorCodeString_InsufficientMinChainBalance
      - ErrorCodeString_InsufficientEvmBalance
      - ErrorCodeString_PortfolioMarginOnboardingDisabled
      - ErrorCodeString_PortfolioMarginInvalidAccountKind
      - ErrorCodeString_EvmVaultOperatorsDisabled
      - ErrorCodeString_VaultOperatorOwnerProofRequired
      - ErrorCodeString_BadEvmSignature
      - ErrorCodeString_EvmSigVerificationFailed
      - ErrorCodeString_InvalidSubkey
      - ErrorCodeString_SubkeyNotActivatable
      - ErrorCodeString_SubkeyRevoked
      - ErrorCodeString_TokenLimitReached
      - ErrorCodeString_InvalidTokenScope
      - ErrorCodeString_IPNotAllowed
      - ErrorCodeString_InsufficientTransferrableXP
      - ErrorCodeString_TransferLimitReached
      - ErrorCodeString_XPTransfersDisabled
      - ErrorCodeString_BlockTradeNotFound
      - ErrorCodeString_BlockTradeNotEnabled
      - ErrorCodeString_BlockTradeExpired
      - ErrorCodeString_BlockTradeAlreadyCancelled
      - ErrorCodeString_BlockTradeInvalidStatus
      - ErrorCodeString_BlockTradeUnauthorized
      - ErrorCodeString_BlockTradeMissingTrades
      - ErrorCodeString_BlockTradeMissingSigners
      - ErrorCodeString_BlockTradeMissingSignature
      - ErrorCodeString_BlockTradeAccountMismatch
      - ErrorCodeString_BlockTradeInvalidSignature
      - ErrorCodeString_BlockTradeSignerKeyUnauthorized
      - ErrorCodeString_BlockTradeReplayedSignature
      - ErrorCodeString_BlockTradeSelfTrade
      - ErrorCodeString_OfferAlreadyCancelled
      - ErrorCodeString_OfferInvalidStatus
      - ErrorCodeString_OfferUnauthorized
      - ErrorCodeString_OfferParentMismatch
      - ErrorCodeString_OfferParentNotAccepting
      - ErrorCodeString_PortfolioMarginConfigNotFound
      - ErrorCodeString_MarginConfigNotFound
      - ErrorCodeString_MmpConfigInvalid
      - ErrorCodeString_MmpNotEnabled
      - ErrorCodeString_MmpMinFreezeNotElapsed
      - ErrorCodeString_MmpNotConfigured
      - ErrorCodeString_RfqVenueUnavailable
    responses.Subkey:
      type: object
      properties:
        account_id:
          description: Account ID that owns this subkey
          type: string
          example: '0x1234567890abcdef'
        allowed_cidrs:
          description: IP CIDR allowlist; empty means unrestricted
          type: array
          items:
            type: string
          example:
          - '["203.0.113.0/24"]'
        block_trade_signing_enabled:
          description: 'Whether this subkey is enabled for block trade signing (create, offer

            and execute signatures) for its account: it is active, and either the

            account owner enabled it with the main key or it is the Paradigm RFQ

            delegation key, which follows its delegation. Always false for pending

            and revoked subkeys.'
          type: boolean
          example: false
        created_at:
          description: Subkey creation timestamp (nanoseconds since epoch)
          type: integer
          example: 1640995200
        id:
          description: Unique subkey identifier
          type: integer
          example: 1
        name:
          description: User-provided subkey name
          type: string
          example: My Subkey
        public_key:
          description: Subkey public key
          type: string
          example: '0xabcdef1234567890abcdef'
        revoked_at:
          description: Revocation timestamp (nanoseconds since epoch, 0 if not revoked)
          type: integer
          example: 0
        state:
          description: Subkey state
          type: string
        updated_at:
          description: Last modification timestamp (nanoseconds since epoch)
          type: integer
          example: 1640995200
    requests.UpdateAllowedCIDRs:
      type: object
      properties:
        allowed_cidrs:
          description: Full replacement list. Empty = unrestricted.
          type: array
          items:
            type: string
          example:
          - '["203.0.113.0/24"'
          - '"198.51.100.42/32"]'
    responses.APIResults:
      type: object
      properties:
        results:
          description: Array of results
          type: array
          items:
            type: object
    responses.ApiError:
      type: object
      properties:
        data:
          description: any additional data related to the error
          type: object
        error:
          description: unique immutable string identifier for specific error
          allOf:
          - $ref: '#/components/schemas/responses.ErrorCode'
          example: NOT_ONBOARDED
        message:
          description: detailed description of error and how to address it
          type: string
          example: User has never called /onboarding endpoint
    requests.UpdateSubkeyBlockTradeSigning:
      type: object
      required:
      - enabled
      properties:
        enabled:
          description: Whether the subkey may sign block trades for the account.
          type: boolean
          example: true
    requests.ActivateSubkey:
      type: object
      required:
      - account_id
      - public_key
      - signature
      - timestamp
      properties:
        account_id:
          description: Account ID that the pending subkey belongs to.
          type: string
          example: '0x1234567890abcdef'
        name:
          description: 'Optional: New name for the subkey upon activation.'
          type: string
          example: My Mobile Device
        public_key:
          description: Public key of the pending subkey to activate.
          type: string
          example: '0x3d9f2b2e5f50c1aade60ca540368cd7490160f41270c192c05729fe35b656a9'
        signature:
          description: Starknet signature [r, s] over pedersen(timestamp, eph_public_key).
          type: array
          items:
            type: string
          example:
          - '["0xr..."'
          - '"0xs..."]'
        timestamp:
          description: Unix timestamp (seconds) included in signed message.
          type: integer
          example: 1706400000
  requestBodies:
    requests.UpdateAllowedCIDRs:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/requests.UpdateAllowedCIDRs'
      description: Replacement CIDR list
      required: true
  securitySchemes:
    BearerToken:
      type: apiKey
      name: Authorization
      in: header
x-refined-from:
- paradex-openapi-prod.json
- paradex-openapi.yml
x-hideTryItPanel: true
x-provenance:
  method: harvested
  publisher: Paradex
  source: https://docs.paradex.trade/openapi/rest-endpoints.yaml
  note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json);
    stamped by stamp-openapi-provenance.py (roadmap#793)