Paradex Market Maker Protection API

The MarketMakerProtection API from Paradex — 3 operation(s) for marketmakerprotection.

Operations 4

GET /account/mmp List market maker protection configs #
POST /account/mmp/reset Reset market maker protection #
POST /account/mmp/{base_asset} Set market maker protection config #
DELETE /account/mmp/{base_asset} Remove market maker protection config #

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-marketmakerprotection-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-marketmakerprotection-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Paradex Market Maker Protection API
  version: 1.142.2
  contact: {}
  description: 'Operations tagged MarketMakerProtection 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: MarketMakerProtection
paths:
  /account/mmp:
    get:
      security:
      - BearerToken: []
      description: Lists the account's market maker protection (MMP) configs, one per base asset, with live state (frozen, until when, window sums) when available. Filter with base_asset. A base asset with no entry has MMP off. Also works when MMP is not enabled for the account (`enabled` false), so enforced configs can be found and removed.
      tags:
      - MarketMakerProtection
      summary: List market maker protection configs
      operationId: get-account-mmp
      parameters:
      - description: 'Base asset - example: BTC'
        name: base_asset
        in: query
        schema:
          type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.GetAccountMmpConfigsResp'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ApiError'
    servers:
    - url: https://api.prod.paradex.trade/v1
  /account/mmp/reset:
    post:
      security:
      - BearerToken: []
      description: Lifts the account's market maker protection (MMP) freeze and clears the window, keeping the config, for `base_asset` or else every base asset with MMP enabled. Refused with MMP_MIN_FREEZE_NOT_ELAPSED within 1 second of a trip; when resetting every base asset, that error's `data.refused` and `data.reset` say which were reset. Works after MMP is no longer enabled for the account. Limited per account by a token bucket of 60 resets refilling at 60 per minute, plus a shorter burst limit; either returns 429. Read-only tokens are rejected.
      tags:
      - MarketMakerProtection
      summary: Reset market maker protection
      operationId: reset-account-mmp
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/requests.AccountMmpResetRequest'
        description: Base asset to reset; every base asset when omitted
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.AccountMmpResetResp'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/responses.ApiError'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/responses.AccountMmpResetRefusedData'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ApiError'
        '503':
          description: Service Unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ApiError'
    servers:
    - url: https://api.prod.paradex.trade/v1
  /account/mmp/{base_asset}:
    post:
      security:
      - BearerToken: []
      description: Replaces the account's market maker protection (MMP) config for a base asset with dated option or perpetual futures markets. An omitted limit becomes 0, disabling that check; at least one limit must be above 0. `vega_limit` counts only dated option fills, so it cannot be the only limit where there are none. 403 MMP_NOT_ENABLED unless MMP is enabled for the account. Read-only tokens are rejected.
      tags:
      - MarketMakerProtection
      summary: Set market maker protection config
      operationId: upsert-account-mmp
      parameters:
      - description: 'Base asset - example: BTC'
        name: base_asset
        in: path
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/requests.AccountMmpConfigRequest'
        description: MMP configuration
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.AccountMmpConfigResp'
        '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'
        '503':
          description: Service Unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ApiError'
    delete:
      security:
      - BearerToken: []
      description: Removes the account's market maker protection (MMP) config for a base asset, cancelling its open MMP orders there with MMP_DISABLED. Succeeds when there is none, and works after MMP is no longer enabled for the account, since a stored config is still enforced. Read-only tokens are rejected.
      tags:
      - MarketMakerProtection
      summary: Remove market maker protection config
      operationId: delete-account-mmp
      parameters:
      - description: 'Base asset - example: BTC'
        name: base_asset
        in: path
        required: true
        schema:
          type: string
      responses:
        '204':
          description: No Content
        '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'
        '503':
          description: Service Unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ApiError'
    servers:
    - url: https://api.prod.paradex.trade/v1
components:
  schemas:
    requests.AccountMmpConfigRequest:
      type: object
      required:
      - frozen_time_ms
      - interval_ms
      properties:
        delta_limit:
          description: Trips when the absolute net delta of fills in the window exceeds this, in base asset units. Up to 4 decimal places; 0 or omitted disables the check
          type: string
          example: '20'
        frozen_time_ms:
          description: How long a trip freezes MMP orders, in milliseconds, 0 to 3600000. 0 freezes until a manual reset
          type: integer
          example: 5000
        interval_ms:
          description: Sliding window length in milliseconds, 100 to 3600000
          type: integer
          example: 1000
        protect_block_trades:
          description: 'Protects this base asset''s block trade legs, RFQ executions included,

            where the account is the maker: the desk that responds with a quote or

            offer. Omitting it keeps the stored value (false if never set).

            Protected block trades share the window with order book fills. A change

            applies to block trades and offers created afterwards.'
          type: boolean
          example: true
        size_limit:
          description: Trips when the sum of fill sizes in the window exceeds this, in base asset units. Up to 4 decimal places; 0 or omitted disables the check
          type: string
          example: '60'
        vega_limit:
          description: Trips when the absolute net vega of fills in the window exceeds this, in USD. Up to 4 decimal places; 0 or omitted disables the check
          type: string
          example: '5000'
    responses.AccountMmpConfigResp:
      type: object
      properties:
        base_asset:
          description: Base asset the config applies to, across its dated options and perpetual futures
          type: string
          example: BTC
        delta_limit:
          description: Delta limit in base asset units; 0 = check disabled
          type: string
          example: '20'
        frozen_time_ms:
          description: How long a trip freezes MMP orders, in milliseconds. 0 freezes until a manual reset
          type: integer
          example: 5000
        frozen_until:
          description: Unix millis the freeze ends. 0 while frozen means until a manual reset; 0 when not frozen
          type: integer
          example: 1717171722000
        interval_ms:
          description: Sliding window length in milliseconds. 0 when MMP was removed
          type: integer
          example: 1000
        is_frozen:
          description: Whether MMP orders on the base asset are frozen
          type: boolean
          example: true
        protect_block_trades:
          description: Whether block trade legs, RFQ executions included, are protected
          type: boolean
          example: true
        size_limit:
          description: Size limit in base asset units; 0 = check disabled
          type: string
          example: '60'
        updated_at:
          description: Unix milliseconds the config was last written
          type: integer
          example: 1717171717000
        vega_limit:
          description: Vega limit in USD; 0 = check disabled
          type: string
          example: '5000'
        window_delta:
          description: Net signed delta of fills in the current window, in base asset units
          type: string
          example: '-3.2'
        window_size:
          description: Sum of fill sizes in the current window, in base asset units
          type: string
          example: '12.5'
        window_vega:
          description: Net signed vega of fills in the current window, in USD
          type: string
          example: '840'
    responses.AccountMmpResetRefusedData:
      type: object
      properties:
        refused:
          description: Base assets tripped less than 1 second ago, not reset
          type: array
          items:
            type: string
        reset:
          description: Base assets that were reset
          type: array
          items:
            $ref: '#/components/schemas/responses.AccountMmpResetResult'
    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.AccountMmpResetResp:
      type: object
      properties:
        results:
          description: Ordered by base asset. Empty when no base asset has MMP enabled
          type: array
          items:
            $ref: '#/components/schemas/responses.AccountMmpResetResult'
    responses.GetAccountMmpConfigsResp:
      type: object
      properties:
        account:
          description: Account ID
          type: string
        enabled:
          description: Whether MMP is enabled for the account. When false, configs can only be removed, and those listed are still enforced until they are
          type: boolean
        results:
          description: Configs per base asset, ordered by base asset. A base asset with no entry has MMP off
          type: array
          items:
            $ref: '#/components/schemas/responses.AccountMmpConfigResp'
    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
    responses.AccountMmpResetResult:
      type: object
      properties:
        base_asset:
          description: Base asset that was reset
          type: string
          example: BTC
        reset_at:
          description: Unix millis the freeze and window were cleared
          type: integer
          example: 1717171717000
    requests.AccountMmpResetRequest:
      type: object
      properties:
        base_asset:
          description: Base asset to reset; every base asset with MMP enabled when omitted
          type: string
          example: BTC
  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)