Paradex Authentication API

The Authentication API from Paradex — 5 operation(s) for authentication.

Operations 6

POST /auth Get JWT #
GET /jwks.json Get JWKS #
GET /onboarding Check onboarding status #
POST /onboarding Onboarding #
POST /v2/auth EVM Get JWT #
POST /v2/onboarding EVM Onboarding #

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-authentication-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-authentication-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Paradex Authentication API
  version: 1.142.2
  contact: {}
  description: 'Operations tagged Authentication 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: Authentication
paths:
  /auth:
    post:
      description: 'Authenticate using signed payload to get a JWT for usage in other endpoints


        There are multiple valid headers required to be sent as part of this request.


        For onboarding examples, refer to `go`, `java` and `python` code in code-samples.


        #### StarkNet Message Hash and Signature


        Inspired by EIP-712,

        (a standard for hashing and signing typed structured data)

        the encoding of an off-chain message is defined as:


        `signed_data = Enc[PREFIX_MESSAGE, domain_separator, account, hash_struct(message)]`


        where:


        - `PREFIX_MESSAGE = "StarkNet Message"`

        - `domain_separator` is defined as the `hash_struct` of the StarkNetDomain struct:

        * Struct contains: `name`, `chainId` and `version`

        * `chainId` is can be obtained calling `GET /system/config`

        - `account` is the StarkNet account address

        - The message to be hashed is represented as a struct

        * `hash_struct(message) = Enc[type_hash(MyStruct), Enc[param1], ..., Enc[paramN]]`

        * where `type_hash` is defined as in EIP-712 (but using `selector` instead of `keccak`)

        * More details on StarkNet - Hash Functions


        In case of more complex structure of object, you have to work in the spirit of EIP-712.

        This json structure has 4 mandatory items: `types`, `primaryType`, `domain` and `message`.

        These items are designed to be able to be an interface with a wallet.

        At sign request, the wallet will display:


        - `message` will be displayed at the bottom of the wallet display,

        showing clearly (not in hex) the message to sign.

        Its structure has to be in accordance with the type listed in primaryType,

        defined in types.

        - `domain` will be shown above the message.

        Its structure has to be in accordance with `StarkNetDomain`.


        The predefined types that you can use :


        - `felt` : for an integer on 251 bits.

        - `felt*` : for an array of felt.

        - `string` : for a shortString of 31 ASCII characters max.

        - `selector` : for a name of a smart contract function.

        - `merkletree` : for a Root of a Merkle tree, calculated with the provided data.


        Specification details: Signing transactions and off-chain messages


        #### Message Hash Sample Code


        For a complete `message_hash` example, refer to `python` code in code-samples.


        > Examples:


        ```json

        {

        "paradex-signature-expiration": 1682364556,

        "paradex-starknet-account": "0x129f3dc1b8962d8a87abc692424c78fda963ade0e1cd17bf3d1c26f8d41ee7a",

        "paradex-starknet-signature": [

        "1381323390094460587764867648394252677239485992175346764030313478865763678671",

        "396490140510115262427678549757564216013606350105112805717359873954984880589"

        ],

        "paradex-timestamp": 1681759756

        }

        ```'
      tags:
      - Authentication
      summary: Get JWT
      operationId: auth
      parameters:
      - description: Starknet account
        name: PARADEX-STARKNET-ACCOUNT
        in: header
        required: true
        schema:
          type: string
      - description: Starknet signature
        name: PARADEX-STARKNET-SIGNATURE
        in: header
        required: true
        schema:
          type: string
      - description: Timestamp when the signature was created
        name: PARADEX-TIMESTAMP
        in: header
        required: true
        schema:
          type: string
      - description: Timestamp when signature expires (default 30 min | Max 1 week)
        name: PARADEX-SIGNATURE-EXPIRATION
        in: header
        schema:
          type: string
      - description: Optional flag to authorize all isolated market accounts linked to the main account. When set to true, the returned JWT will grant trading access to all isolated accounts. Defaults to false if not specified
        name: PARADEX-AUTHORIZE-ISOLATED-MARKETS
        in: header
        schema:
          type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.AuthResp'
        '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
  /jwks.json:
    get:
      description: Returns the JSON Web Key Set used to validate JWT tokens issued by this service
      tags:
      - Authentication
      summary: Get JWKS
      operationId: jwks
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.JwksResponse'
    servers:
    - url: https://api.prod.paradex.trade/v1
  /onboarding:
    get:
      description: Returns the Paradex address and derivation info for a given identity
      tags:
      - Authentication
      summary: Check onboarding status
      operationId: getOnboarding
      parameters:
      - description: Starknet public key (required when account_signer_type=starknet)
        name: public_key
        in: query
        schema:
          type: string
      - description: Ethereum address (required when account_signer_type=eip191)
        name: eth_address
        in: query
        schema:
          type: string
      - description: 'Signer variant: starknet or eip191'
        name: account_signer_type
        in: query
        required: true
        schema:
          type: string
      - description: EVM vault operator index (eip191 only; requires EnableEvmVaultOperators)
        name: vault_operator_index
        in: query
        schema:
          type: integer
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.GetOnboardingResp'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ApiError'
    post:
      description: 'Onboarding verifies that the caller owns the StarkNet address and enters them

        into the database. This call is idempotent.'
      tags:
      - Authentication
      summary: Onboarding
      operationId: onboarding
      parameters:
      - description: Ethereum account used to onboard
        name: PARADEX-ETHEREUM-ACCOUNT
        in: header
        required: true
        schema:
          type: string
      - description: Starknet address
        name: PARADEX-STARKNET-ACCOUNT
        in: header
        required: true
        schema:
          type: string
      - description: Starknet signature
        name: PARADEX-STARKNET-SIGNATURE
        in: header
        required: true
        schema:
          type: string
      requestBody:
        $ref: '#/components/requestBodies/requests.Onboarding'
      responses:
        '200':
          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'
    servers:
    - url: https://api.prod.paradex.trade/v1
  /v2/auth:
    post:
      description: Authenticate an EVM account using SIWE signature and return a JWT
      tags:
      - Authentication
      summary: EVM Get JWT
      operationId: evmAuth
      parameters:
      - description: Starknet account
        name: PARADEX-STARKNET-ACCOUNT
        in: header
        required: true
        schema:
          type: string
      - description: EVM personal_sign signature
        name: PARADEX-EVM-SIGNATURE
        in: header
        required: true
        schema:
          type: string
      - description: Base64-encoded SIWE message
        name: PARADEX-SIWE-MESSAGE
        in: header
        required: true
        schema:
          type: string
      - description: Optional flag to authorize all isolated market accounts
        name: PARADEX-AUTHORIZE-ISOLATED-MARKETS
        in: header
        schema:
          type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.AuthResp'
        '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
  /v2/onboarding:
    post:
      description: Onboard a new EVM account using SIWE signature
      tags:
      - Authentication
      summary: EVM Onboarding
      operationId: evmOnboarding
      parameters:
      - description: Starknet account
        name: PARADEX-STARKNET-ACCOUNT
        in: header
        required: true
        schema:
          type: string
      - description: EVM personal_sign signature
        name: PARADEX-EVM-SIGNATURE
        in: header
        required: true
        schema:
          type: string
      - description: Base64-encoded SIWE message
        name: PARADEX-SIWE-MESSAGE
        in: header
        required: true
        schema:
          type: string
      requestBody:
        $ref: '#/components/requestBodies/requests.Onboarding'
      responses:
        '200':
          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'
    servers:
    - url: https://api.prod.paradex.trade/v1
components:
  schemas:
    responses.AuthResp:
      type: object
      properties:
        jwt_token:
          description: Authentication token
          type: string
          example: eyJhbGciOiJFUzM4NCIsInR5cCI6IkpXVCJ9.eyJ0eXAiOiJhdCtKV1QiLCJleHAiOjE2ODE0NTI5MDcsImlhdCI6MTY4MTQ1MjYwNywiaXNzIjoiUGFyYWRleCBzdGFnaW5nIiwic3ViIjoiMHg0OTVkMmViNTIzNmExMmI4YjRhZDdkMzg0OWNlNmEyMDNjZTIxYzQzZjQ3M2MyNDhkZmQ1Y2U3MGQ5NDU0ZmEifQ.BPihIbGhnnsuPlReqC9x12JFXldpswg5EdA6tTiDQm-_UHaRz_8RfVBqWc2fPN6CzFsXTq7GowZu-2qMxPvZK_fGcxEhTp2k1r8MUxowlUIT4vPu2scCwrsyIujlCAwS
    responses.JwksResponse:
      type: object
      properties:
        keys:
          type: array
          items:
            $ref: '#/components/schemas/responses.JwkKey'
    requests.Utm:
      type: object
      properties:
        campaign:
          description: UTM campaign parameter
          type: string
          example: summer2024
        source:
          description: UTM source parameter
          type: string
          example: google
        type:
          description: UTM type parameter
          type: string
          example: clickthrough
    requests.Onboarding:
      type: object
      properties:
        marketing_code:
          description: Marketing code of the campaign the user is being onboarded via.
          type: string
          example: abcd:code1
        portfolio_margin:
          description: When true, the new account is onboarded directly into Portfolio Margin mode. Only valid for main accounts and subaccounts.
          type: boolean
        public_key:
          description: Public key of the user being onboarded.
          type: string
          example: '0x3d9f2b2e5f50c1aade60ca540368cd7490160f41270c192c05729fe35b656a9'
        referral_code:
          description: Referral code of the user who referred the user being onboarded.
          type: string
          example: cryptofox8
        utm:
          description: UTM tracking parameters (optional).
          allOf:
          - $ref: '#/components/schemas/requests.Utm'
    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.OnboardingDerivationInfo:
      type: object
      properties:
        class_hash:
          type: string
        proxy_class_hash:
          type: string
    responses.JwkKey:
      type: object
      properties:
        alg:
          type: string
          example: ES256
        crv:
          type: string
          example: P-256
        kid:
          type: string
          example: <thumbprint>
        kty:
          type: string
          example: EC
        use:
          type: string
          example: sig
        x:
          type: string
          example: <base64url>
        y:
          type: string
          example: <base64url>
    responses.GetOnboardingResp:
      type: object
      properties:
        account_signer_type:
          description: 'Signer variant: "starknet" or "eip191"'
          type: string
        address:
          description: Paradex Starknet address
          type: string
        derivation_info:
          description: Class hash(es) used for address derivation
          allOf:
          - $ref: '#/components/schemas/responses.OnboardingDerivationInfo'
        exists:
          description: Whether the account is already onboarded
          type: boolean
    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
  requestBodies:
    requests.Onboarding:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/requests.Onboarding'
      description: Onboarding user public_key and optional referral_code or marketing_code
      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)