For AI agents: a documentation index is available at the root level at /llms.txt and /llms-full.txt. Append /llms.txt to any URL for a page-level index, or .md for the markdown version of any page.
Logo
Join CommunityStart Trading
HomeOverviewTradingRisk & LiquidationsParadex ChainEcosystemREST APIWebSocket APIAgentic AI HubRelease Notes
HomeOverviewTradingRisk & LiquidationsParadex ChainEcosystemREST APIWebSocket APIAgentic AI HubRelease Notes
  • General Information
    • Server Location
    • Server URLs
    • Quick Start
    • Authentication
    • Rate Limits
    • Benchmarks
    • API Authentication
    • API Best Practices
  • Production API Reference
  • Testnet API Reference
        • POSTGet JWT
  • Useful Resources
    • Paradex Github
    • Paradex CLI
    • Code Samples
    • Python SDK
    • CCXT Integration
Join CommunityStart Trading
Testnet API ReferenceAuth

Get JWT

POST
https://api.testnet.paradex.trade/v1/auth
POST
/v1/auth
$curl -X POST https://api.testnet.paradex.trade/v1/auth \
> -H 'Accept: application/json' \
> -H 'PARADEX-STARKNET-ACCOUNT: string' \
> -H 'PARADEX-STARKNET-SIGNATURE: string' \
> -H 'PARADEX-TIMESTAMP: string' \
> -H 'PARADEX-SIGNATURE-EXPIRATION: string'
1{
2 "jwt_token": "eyJhbGciOiJFUzM4NCIsInR5cCI6IkpXVCJ9.eyJ0eXAiOiJhdCtKV1QiLCJleHAiOjE2ODE0NTI5MDcsImlhdCI6MTY4MTQ1MjYwNywiaXNzIjoiUGFyYWRleCBzdGFnaW5nIiwic3ViIjoiMHg0OTVkMmViNTIzNmExMmI4YjRhZDdkMzg0OWNlNmEyMDNjZTIxYzQzZjQ3M2MyNDhkZmQ1Y2U3MGQ5NDU0ZmEifQ.BPihIbGhnnsuPlReqC9x12JFXldpswg5EdA6tTiDQm-_UHaRz_8RfVBqWc2fPN6CzFsXTq7GowZu-2qMxPvZK_fGcxEhTp2k1r8MUxowlUIT4vPu2scCwrsyIujlCAwS"
3}
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](https://github.com/tradeparadex/code-samples). #### StarkNet Message Hash and Signature Inspired by [EIP-712](https://eips.ethereum.org/EIPS/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](https://docs.starknet.io/architecture-and-concepts/cryptography/#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](https://github.com/argentlabs/argent-x/discussions/14) #### Message Hash Sample Code For a complete `message_hash` example, refer to `python` code in [code-samples](https://github.com/tradeparadex/code-samples). > Examples: ```json { "paradex-signature-expiration": 1682364556, "paradex-starknet-account": "0x129f3dc1b8962d8a87abc692424c78fda963ade0e1cd17bf3d1c26f8d41ee7a", "paradex-starknet-signature": [ "1381323390094460587764867648394252677239485992175346764030313478865763678671", "396490140510115262427678549757564216013606350105112805717359873954984880589" ], "paradex-timestamp": 1681759756 } ```
Was this page helpful?
Previous

Get market bbo

Next
Built with

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:

1{
2 "paradex-signature-expiration": 1682364556,
3 "paradex-starknet-account": "0x129f3dc1b8962d8a87abc692424c78fda963ade0e1cd17bf3d1c26f8d41ee7a",
4 "paradex-starknet-signature": [
5 "1381323390094460587764867648394252677239485992175346764030313478865763678671",
6 "396490140510115262427678549757564216013606350105112805717359873954984880589"
7 ],
8 "paradex-timestamp": 1681759756
9}

Headers

PARADEX-STARKNET-ACCOUNTstringRequired
Starknet account
PARADEX-STARKNET-SIGNATUREstringRequired
Starknet signature
PARADEX-TIMESTAMPstringRequired
Timestamp when the signature was created
PARADEX-SIGNATURE-EXPIRATIONstringOptional

Timestamp when signature expires (default 30 min | Max 1 week)

PARADEX-AUTHORIZE-ISOLATED-MARKETSstringOptional
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

Response

OK
jwt_tokenstring
Authentication token

Errors

400
Bad Request Error
401
Unauthorized Error