{"activeVersionTag":"latest","latestAvailableVersionTag":"latest","collection":{"info":{"_postman_id":"d705ee86-236c-4566-8067-681603a8ba10","name":"Perpetuals.com API Docs","description":"The Perpetuals.com Platform API helps businesses and developers build their use-cases and cherry-pick the features and functionality they want individually.\n\nThe purpose of the Platform API is to allow businesses/white-label partners to build their own business-case on top of the patent-protected and proprietary Perpetuals Vault (multi-wallet, cross-chain infrastructure) and payment system. Endpoints are bundled into business-case related collections to help organize various work-flows.\n\nThis will allow partners to onboard their users, generate vaults (wallets), initiate transactions, deposits, payments, withdrawals and trades between different currencies and users within the Perpetuals Eco-System (whitelabeled users and native Perpetuals users alike).\n\nA white-label partner will enjoy their individual branded version of the Platform and onboard all of their users in their look-and-feel. Perpetuals remains in the background, powering the logistics of all the transactions behind the scenes.\n\nIf you're looking to interface with the Perpetuals Platform via APIs and are a business, please reach out to [contact@perpetuals.com](https://mailto:contact@perpetuals.com) to apply for a White-Label of the Perpetuals.com Platform.\n\nif you're an individual looking to maximize automation of your user's account, feel free to continue onwards without any custom branding.\n\nImportant Note: the Perpetuals terms and conditions always apply ([https://perpetuals.com/terms-privacy-policy](https://perpetuals.com/terms-privacy-policy/)).\n\n# Direct/Indirect MTF Integration Options\n\nAs an authorized and licensed partner or whitelabel tenant, it's possible to integrate and connect your infrastructure to Perpetuals' MTF in two different ways:\n\n1. Indirect connection to the Multilateral Trading Facility via the Exchange/Front-End infrastructure.\n    \n2. Direct connection to the Multilateral Trading Facility behind the Exchange/Front-End.\n    \n\nThe Exchange/Front-End system is a web-application and API based system, which already has deep synchronizations completed with the MTF. The Exchange also comes with additional features that are otherwise not available when direcly connecting to the MTF (User Management, CRM integration, Reporting options, Wallet and Funding Management system, KYC and Identity Verififcation systems, etc. Please see the Advanced Integrations Chapter for more information). Dominantly, self-provided User Management is likely to be the deciding factor on which option to choose from (besides the available feature-sets).\n\n(Note: Even if chosing an intedirect integration path, a direct integration to the MTF will still have to take place by the tenant/partner - in other words: chosing option 1 doesn't remove the requirement to integrate option 2).\n\nIt's generally advised that tenants with a non-complete feature-set of their current infrastructure evaluate if a connection to the MTF via the Exchange System makes more sense (option 1) and could prove to be a more efficient integration path.  \nTenants that already have a full suite of infrastructure (especially User Management) available may be better suited using the direct connection method (option 2).\n\nDirect Access to the Multilateral Trading Facility requires special permissions and a different infrastructure preparation process alltogether - more information about the authentication process and initial reading on the MTF authentication process can be found here: [https://gist.github.com/connorkephas/8fc149b67781ab1e28094b9b1a53e9b0](https://gist.github.com/connorkephas/8fc149b67781ab1e28094b9b1a53e9b0)\n\nIn terms of data structures and message formats for orders, the MTF uses a Binary Protocol, as described on a high-level here: [https://gist.github.com/connorkephas/ecbccb65bd4e4e5809fcf230828b0ba3](https://gist.github.com/connorkephas/ecbccb65bd4e4e5809fcf230828b0ba3)\n\nBasic fields are described as follows:\n\nEach message sent in either direction will be a block of 88 bytes with sections, in order, designated as follows:\n\n```\nMarket ID: uInt16 (2 bytes)\nOrder ID: uInt64 (8 bytes)\nClient ID: uInt32: (4 bytes)\nMessage Code 1 byte\nOpen Quantity: 8 byte double\nPrice: 8 byte double\nStop Price: 8 byte double\nTimestamp: 8 byte Unsigned Integer\nOrder Condition: 1 byte Unsigned Integer\nTip Quantity: 8 byte double\nTotal Quantity: 8 byte double\nNotional amount: 8 byte double\nMatched quantity: 8 byte double\nMessage ID: uInt64 (8 bytes)\n\n ```\n\nOrder types and other request formatting documentation can be requested by the Perpetuals.com Team.\n\nWhen integrating the Exchange/Front-End system, please note that the most important functions are sorted within the Authentication and Vault/Wallet folders. User information is managed through the User Profile Data Folder. All oither folders within this documentation are considered Advanced Features and are usually not needed for an MVP intergration.\n\n# Technology Concept\n\nPerpetuals's Technology Stack is based on the concept of multi-layered self-custody wallets (also called Perpetuals Vaults). This means that the API's are built in context of individual user accounts. Every User has their own public/private keys, and only the entity/user with these credentials can access and manage/withdraw/transfer/exchange funds.\n\nAny transction and interaction with 3rd parties (such as smart-contracts, credit-card acquirers, banking services, etc.) are automatically managed directly from the user's segregated self-custody wallet. There is no need for the operator (or Perpetuals) to be the counterparty of any trade or transaction, nor do funds need to be routed through any own account. This allows fast and efficient (time and costs) transactions initated by the user.\n\n# Getting Started:\n\nThis chapter lets you understand the general integration workflow. Be sure to read through the Business Cases Cookbook in the next chapter to see these flows being put into practice.\n\n# \\- Basic Integration Flow\n\nAs an ooperator integrating the Vault and Wallet system for your business purpose, the most simple integration always starts with user registration/setup.\n\nThis can be achieved in very few steps, as indicated below:\n\n1. Register User\n    \n2. Log the new user in\n    \n3. Generate and submit 2FA Setup code\n    \n\nOnce the above has been done (per user), further information can be submitted to the system (such as profile and personal information to activate banking features later on).\n\nIn a next step, an operator would want to view the profile of a user, which contains all information and meta-data, including public deposit keys, transaction information, status codes of transfers/payments/referrals, etc.\n\nThis can simply be achieved by calling the \"Get User Profile\" Endpoint (or alternatively, \"Get Basic User Profile\" for a faster, simplified dataset.\n\nTo show deposit options (Crypto Deposit Keys, QR Codes, etc.) the \"Get Crypto Deposit PubKeys\" Endpoint is ideal. Other Endpoints are used to optimize lightweight interactions with the Perpetuals system, by providing specific information, rather than the entire profile dataset.\n\n# \\- Vault Generation Sequence\n\nIt's important to understand when and how vaults are being generated and what kind of status is to be expected while Vaults are being prepared and generated (shown within the user profile's \"main_vault_uuid\" field).\n\n- RSA Keys are generated the moment a user's account gets registered. RSA Keys are used for secure data transmission between the user's device (or server system) and the platform.\n    \n- The Vault, including the internal crypto currency wallets, are generated after the master password was set. This process can take a few seconds, meaning that subsequent calls to the user profile could indicate the status of the wallet creation being either \"PREPARING\" (RSA is generated, but no Vault generation process has started yet - because no master password was set yet), or \"GENERATING\" (RSA Keys are generated and the master password has been submitted, the Vault/Wallets are being generated).\n    \n\nOnce the vault generation process has completed, the main_vault_uuid field within the user's profile will show the vault_uuid (as a unique hexadecimal identifier).\n\n# \\- Advanced Integrations\n\nAfter the basic integration established, which allows for fast user-onboarding, operators can further choose to integrate and offer other features of the Perpetuals Platform, such as:\n\n- NFT SuperStore\n    \n- Decentralized Trading\n    \n- Merchant/Payment Gateways\n    \n- Banking and Card Services\n    \n- ICO Token Offerings\n    \n- and much, much more...\n    \n\n# \\- Mobile Integration\n\nThe Perpetuals Platform is perfectly capable of being integrated into various Mobile and Desktop Platforms.\n\nPerpetuals has already established the compliance aspects with leading mobile platforms (Apple's App Store and Google' PlayStore).\n\nThis means that the integration and offering of a wallet system (and/or some of its functionalities) has already been vetted and approved by the mobile platforms. In practice, this means that submitting a new App and passing the review process will be dramatically accelerated when mentioning that Perpetuals is the underlying technology during the App submission process.\n\n# Business Cases Cookbook:\n\nPerpetuals offers a highly flexible platform to support and accelerate your business case and growth. In this chapter, we'll be looking at how, in a step-by-step fashion, business cases can be implemented in the most efficient way.\n\n# \\- Building a Global Remittance Platform\n\nAt the core of this business case, Perpetuals's Secure Send functionality lets users transmit digital assets and funds in a peer2peer fashion instantly, globally and without limits or barriers.\n\nLeveraging this functionality is the key to building a global Remittance System that allow the operator (you) to onboard virtually any user and allow them to fund/swap/send/remit funds within seconds.\n\nThe integration path is laid out as follows:\n\n1. Register User, Log In, Register 2FA Setup\n    \n2. Show deposit options (by showing the Crypto Deposit keys, or by shopwing additional deposit options via a pop-up link.\n    \n3. Implement the Secure Send functionality, wherein users can send funds by using solely email-addresses (instead of public-keys, etc.).\n    \n4. Optionally, you can allow users to then swap/trade or withdraw these funds to their local bank account, or purchase Tokens/NFT Products.\n    \n\n# \\- Accepting Crypto Payments/Funding\n\nIf you're currently operating a platform that requires users to fund their accounts on your system (i.e. a Gaming Platform, Loyalty Points, Memberships, etc.) you can easily implement a behind-the-scenes wallet system, that provides your users with individual wallets, public keys and deposit options.\n\nAs you're the operator taking in the funds, the concept is to generate a wallet for every user individually, but only show the user the deposit keys in the operator platform when the user wants to initiate a funding operation. The Vault System also has a callback feature, which is used to inform the operator that a new deposit was made. From there, the operator (you)) can pull the funds from the user's wallet and send them to the master-account. This process is instantateous, and will allow the user to be credited with their deposit.\n\nThe Integration path is laid out as follows:\n\n1. Register User, Log In, Register 2FA Setup (in this case, the 2FA Initial Key and Master Password must be securely stored by the operator to later generate the 2FA Key on the Secure Send Request).\n    \n2. Show deposit options (by showing the Crypto Deposit keys, or by shopwing additional deposit options via a pop-up link.\n    \n3. Set the Callback Link per wallet to be informed that there has been an update to the user's balance by an on-chain deposit.\n    \n\nOnce a Callback is received, the following flow can be executed:\n\n1. Log in to the user's wallet and use the stored 2FA Initial Key to authenticate.\n    \n2. Get the balance/transaction history of the account\n    \n3. Initiate a withdrawal via the Secure Send function from the user's wallet to the operator's Master Account (via email). This is done by loading the locally stored 2FA Initial Key and generating the time-based OTP pin for the withdrawal.\n    \n4. Now that the tunds have moved form the user's wallet to the master account, the user can be credited with the balance.\n    \n5. Optionally, the currency can be converted to a stable-currency if required. In this case a BTC Deposit would be converted to USD, eliminating the volatility and liquidity management concerns for the operator.\n    \n\nNote: the Operator of the Master Account can cash-out their remaining funds directly to their own bank account (EUR within Europe or USD globally). There is no holding period for any funds received, they are disposable instantly.\n\n# \\- Launching an ICO Token Offering\n\nIf you're looking to offer an enhanced user experience when raising funds through and ICO Token offering, Perpetuals has the most secure, yet flexible solution on the market.  \nYou can create your own Token through the Whitelabel Admin Dashboard (web-interface), and later use the API Calls to trigger a purchase order, which is submitted, linked and delivered to the corresponding user.\n\nThe Integration flow is the following:\n\n1. Log in to the web-platform as a Whitelabel Admin\n    \n2. Navigate to the ICO Token Launcher and create your new token along with the various token packages, which will be available for sale\n    \n\nNext either register the users via the API Calls (Register User, Log In, Register 2FA Setup), or let the users sign-up themselves.\n\nFrom there, you can use the APIs to get a list of available tokens and token packages, and allow the user to select them in the custom interface (i.e. on your proprietary mobile app).  \nAs soon as the user clicks on an item, or wants to check-out, the following sequence of API calls must be submitted to the Perpetuals Merchant system:\n\n1. Create new Invoice (including description, pricing, etc. for the items to be purchased)\n    \n2. Forward the returned link to the user interface, so the user can check-out via a web-based view.\n    \n3. Call the Get Invoice Status (or view the Payment Gateway Status/Overview in the Whitelabel Admin Dashboard) to check the Payment status.\n    \n4. If the product purchased is an ICO Token or NFT, the delivery after payment will automatically be handled by the smart-contract routing system.\n    \n5. Optionally, the operator can execute other functions based on a status being set to \"PAID\" (i.e. ship physical goods, change the status of a user on the main platform, etc.).\n    \n\nNote: ICO Tokens may be subject to financial regulations, depending on the jurisdiction the operator is launching the token from. Perpetuals takes no liability. The Perpetuals terms and conditions always apply.\n\n# Perpetuals API Endpoints:","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","isPublicCollection":false,"owner":"8832557","team":2939961,"collectionId":"d705ee86-236c-4566-8067-681603a8ba10","publishedId":"2sAYXBFJzR","public":true,"publicUrl":"https://docs.perpetuals.com","privateUrl":"https://go.postman.co/documentation/8832557-d705ee86-236c-4566-8067-681603a8ba10","customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"fc8800"},"documentationLayout":"classic-double-column","customisation":{"metaTags":[{"name":"description","value":""},{"name":"title","value":""}],"appearance":{"default":"light","themes":[{"name":"dark","logo":"https://content.pstmn.io/46100e88-0816-4f86-9df4-02085a4039d6/bG9nby5wbmc=","colors":{"top-bar":"212121","right-sidebar":"303030","highlight":"fc8800"}},{"name":"light","logo":"https://content.pstmn.io/b1757487-71ae-4fc5-b604-9a9c785bef00/bG9nby5wbmc=","colors":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"fc8800"}}]}},"version":"8.10.0","publishDate":"2025-05-21T13:05:57.000Z","activeVersionTag":"latest","documentationTheme":"light","metaTags":{"title":"","description":""},"logos":{"logoLight":"https://content.pstmn.io/b1757487-71ae-4fc5-b604-9a9c785bef00/bG9nby5wbmc=","logoDark":"https://content.pstmn.io/46100e88-0816-4f86-9df4-02085a4039d6/bG9nby5wbmc="}},"statusCode":200},"environments":[{"name":"PRODUCTION","id":"97055bcd-d781-4135-896a-c615c27063f7","owner":"8832557","values":[],"published":true}],"user":{"authenticated":false,"permissions":{"publish":false}},"run":{"button":{"js":"https://run.pstmn.io/button.js","css":"https://run.pstmn.io/button.css"}},"web":"https://www.getpostman.com/","team":{"logo":"https://res.cloudinary.com/postman/image/upload/t_team_logo_pubdoc/v1/team/ee72c9cdf819841bfbe90322ea54def74f4b0a7c46efced9571a1f2bbda63f25","favicon":"https://perpetuals.com/favicon.ico"},"isEnvFetchError":false,"languages":"[{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"HttpClient\"},{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"RestSharp\"},{\"key\":\"curl\",\"label\":\"cURL\",\"variant\":\"cURL\"},{\"key\":\"dart\",\"label\":\"Dart\",\"variant\":\"http\"},{\"key\":\"go\",\"label\":\"Go\",\"variant\":\"Native\"},{\"key\":\"http\",\"label\":\"HTTP\",\"variant\":\"HTTP\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"OkHttp\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"Unirest\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"Fetch\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"jQuery\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"XHR\"},{\"key\":\"c\",\"label\":\"C\",\"variant\":\"libcurl\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Axios\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Native\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Request\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Unirest\"},{\"key\":\"objective-c\",\"label\":\"Objective-C\",\"variant\":\"NSURLSession\"},{\"key\":\"ocaml\",\"label\":\"OCaml\",\"variant\":\"Cohttp\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"cURL\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"Guzzle\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"HTTP_Request2\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"pecl_http\"},{\"key\":\"powershell\",\"label\":\"PowerShell\",\"variant\":\"RestMethod\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"http.client\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"Requests\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"httr\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"RCurl\"},{\"key\":\"ruby\",\"label\":\"Ruby\",\"variant\":\"Net::HTTP\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"Httpie\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"wget\"},{\"key\":\"swift\",\"label\":\"Swift\",\"variant\":\"URLSession\"}]","languageSettings":[{"key":"csharp","label":"C#","variant":"HttpClient"},{"key":"csharp","label":"C#","variant":"RestSharp"},{"key":"curl","label":"cURL","variant":"cURL"},{"key":"dart","label":"Dart","variant":"http"},{"key":"go","label":"Go","variant":"Native"},{"key":"http","label":"HTTP","variant":"HTTP"},{"key":"java","label":"Java","variant":"OkHttp"},{"key":"java","label":"Java","variant":"Unirest"},{"key":"javascript","label":"JavaScript","variant":"Fetch"},{"key":"javascript","label":"JavaScript","variant":"jQuery"},{"key":"javascript","label":"JavaScript","variant":"XHR"},{"key":"c","label":"C","variant":"libcurl"},{"key":"nodejs","label":"NodeJs","variant":"Axios"},{"key":"nodejs","label":"NodeJs","variant":"Native"},{"key":"nodejs","label":"NodeJs","variant":"Request"},{"key":"nodejs","label":"NodeJs","variant":"Unirest"},{"key":"objective-c","label":"Objective-C","variant":"NSURLSession"},{"key":"ocaml","label":"OCaml","variant":"Cohttp"},{"key":"php","label":"PHP","variant":"cURL"},{"key":"php","label":"PHP","variant":"Guzzle"},{"key":"php","label":"PHP","variant":"HTTP_Request2"},{"key":"php","label":"PHP","variant":"pecl_http"},{"key":"powershell","label":"PowerShell","variant":"RestMethod"},{"key":"python","label":"Python","variant":"http.client"},{"key":"python","label":"Python","variant":"Requests"},{"key":"r","label":"R","variant":"httr"},{"key":"r","label":"R","variant":"RCurl"},{"key":"ruby","label":"Ruby","variant":"Net::HTTP"},{"key":"shell","label":"Shell","variant":"Httpie"},{"key":"shell","label":"Shell","variant":"wget"},{"key":"swift","label":"Swift","variant":"URLSession"}],"languageOptions":[{"label":"C# - HttpClient","value":"csharp - HttpClient - C#"},{"label":"C# - RestSharp","value":"csharp - RestSharp - C#"},{"label":"cURL - cURL","value":"curl - cURL - cURL"},{"label":"Dart - http","value":"dart - http - Dart"},{"label":"Go - Native","value":"go - Native - Go"},{"label":"HTTP - HTTP","value":"http - HTTP - HTTP"},{"label":"Java - OkHttp","value":"java - OkHttp - Java"},{"label":"Java - Unirest","value":"java - Unirest - Java"},{"label":"JavaScript - Fetch","value":"javascript - Fetch - JavaScript"},{"label":"JavaScript - jQuery","value":"javascript - jQuery - JavaScript"},{"label":"JavaScript - XHR","value":"javascript - XHR - JavaScript"},{"label":"C - libcurl","value":"c - libcurl - C"},{"label":"NodeJs - Axios","value":"nodejs - Axios - NodeJs"},{"label":"NodeJs - Native","value":"nodejs - Native - NodeJs"},{"label":"NodeJs - Request","value":"nodejs - Request - NodeJs"},{"label":"NodeJs - Unirest","value":"nodejs - Unirest - NodeJs"},{"label":"Objective-C - NSURLSession","value":"objective-c - NSURLSession - Objective-C"},{"label":"OCaml - Cohttp","value":"ocaml - Cohttp - OCaml"},{"label":"PHP - cURL","value":"php - cURL - PHP"},{"label":"PHP - Guzzle","value":"php - Guzzle - PHP"},{"label":"PHP - HTTP_Request2","value":"php - HTTP_Request2 - PHP"},{"label":"PHP - pecl_http","value":"php - pecl_http - PHP"},{"label":"PowerShell - RestMethod","value":"powershell - RestMethod - PowerShell"},{"label":"Python - http.client","value":"python - http.client - Python"},{"label":"Python - Requests","value":"python - Requests - Python"},{"label":"R - httr","value":"r - httr - R"},{"label":"R - RCurl","value":"r - RCurl - R"},{"label":"Ruby - Net::HTTP","value":"ruby - Net::HTTP - Ruby"},{"label":"Shell - Httpie","value":"shell - Httpie - Shell"},{"label":"Shell - wget","value":"shell - wget - Shell"},{"label":"Swift - URLSession","value":"swift - URLSession - Swift"}],"layoutOptions":[{"value":"classic-single-column","label":"Single Column"},{"value":"classic-double-column","label":"Double Column"}],"versionOptions":[],"environmentOptions":[{"value":"0","label":"No Environment"},{"label":"PRODUCTION","value":"8832557-97055bcd-d781-4135-896a-c615c27063f7"}],"canonicalUrl":"https://docs.perpetuals.com/view/metadata/2sAYXBFJzR"}