# Welcome to Panora

The Super App of Aptos

[Panora](https://panora.exchange/) is the Super App of Aptos offering an all-in-one trading platform designed to provide users with the best rates and routes for their trades. Our mission is to redefine DeFi trading through:

* Superior execution
* Streamlined user experiences
* Intelligent liquidity routing

Panora's current product suite consists of:

1. **Swap:**

   * A Meta-DEX Aggregator that consolidates 100% on-chain liquidity from AMMs, CLAMMs, CLOBs, LSDs, and also other DEX aggregators.
   * Offers the best trading rates through advanced routing strategies, including multi-hop and transaction splitting.

2. **Flows:**

   * Unifies bridge and DEX aggregation in one sleek, intuitive interface empowering users to move and swap assets across 10+ blockchains into Aptos with ease.&#x20;

3. **Limit Orders:**

   * Panora’s Limit Orders bring precision and control to on-chain trading. Instead of constantly watching the market, users can set buy or sell orders at their preferred price points.&#x20;
   * Once the market reaches the target price, the order executes automatically on-chain, without relying on custodians or third parties.

4. **Dollar Cost Averaging (DCA):**

   * Panora’s DCA product makes disciplined investing simple. Users can schedule recurring buys of a token at regular intervals, spreading their entry across time instead of entering the market all at once.&#x20;
   * By automating the execution directly on-chain, DCA helps smooth out volatility and reduces the stress of market timing. Each scheduled purchase is routed through Panora’s aggregator, ensuring the best available execution across Aptos liquidity.&#x20;

5. **Terminal:**

   * Aptos' all-in-one command center for data analytics and quick trading. It combines advanced on-chain insights, real-time data feeds, and swap execution into a single powerful interface with integrated portfolio view and best-rate swap execution via Panora Swap.

6. **Developer Toolkit:**
   * Developer-friendly APIs and SDKs for the entire Panora product suite, including Aptos token list and price feeds - everything one needs to build on top of Aptos .

\
Built on the Aptos blockchain, Panora leverages its proprietary routing algorithms to provide best rates, efficient execution, minimal price impact, and near-instant finality, all of it at 0 network gas fees.&#x20;


# Official Links

Website: <https://panora.exchange/>

App: [https://app.panora.exchange](https://app.panora.exchange/swap)

X: <https://x.com/PanoraExchange>

Discord: <https://discord.gg/PanoraExchange>

Telegram Chat: <https://t.me/PanoraExchange>

Telegram Announcements: <https://t.me/PanoraExchange_Ann>

Medium: <https://panoraexchange.medium.com/>

LinkedIn: <https://www.linkedin.com/company/panora-exchange/>

Documentation: <https://docs.panora.exchange/>

Github: <https://github.com/PanoraExchange>

Brand Kit: <https://panora.exchange/media-kit>


# Swap

The superior swapping experience

Panora's Swap Aggregator provides seamless access to the best prices and liquidity across multiple liquidity sources. It intelligently aggregates:

* AMM DEXs
* On-Chain Orderbooks
* DEX Aggregators

This allows users to get the most optimal swap routes and reduce trading costs, making complex DeFi strategies accessible and profitable.

#### **Key Features:**

1. **Optimal Routing**:
   * Finds the best trading paths using its proprietary routing algorithm to get the best rates across Aptos.
2. **Transaction Splitting**:
   * Splits large trades across multiple DEXs to optimize price and minimize impact on liquidity pools.
3. **Multi-Hop Functionality**:
   * Executes complex trades across different tokens and DEXs in one transaction, reducing time and price impact.
4. **User-Centric Design**:
   * Clean interface with advanced filtering, allowing even novice users to trade like professionals.

#### **Why Choose Panora Swap?**

With integrations across 100% on-chain liquidity venues of Aptos, and support for **5+ wallets** in the Aptos ecosystem, Panora offers an unmatched trading experience by balancing efficiency, transparency, and ease of use. Our platform is designed to handle any trading scenario - from basic swaps to complex arbitrage - while maintaining high performance and security.

<figure><img src="/files/BBJQoGaOQJ9EWWmWhDoN" alt=""><figcaption></figcaption></figure>

**Fees:** Currently, Panora takes 0 fees on swaps done via the Panora frontend. Panora earns via revenue kickback, integrator fee share from certain DEX's, and surplus sharing. These are not extra fee on top of the DEX themselves. We also integrate sources with no fee sharing, and in those cases we don't make any money while routing through them.&#x20;

Alongwith surplus sharing, Panora levies an infrastructure fee on certain API keys. Any fee levied will be reflected in swap API response and quotes displayed would be post fee and surplus share, if any. There aren't any additional Panora swap fees currently. This policy is subject to change, and any new fee categories or adjustments will be reflected here.


# Limit

Trade On Your Own Terms

## Introduction

**Panora Limit Orders** give you full control over your trading strategy. Set your desired token prices in advance, and once market conditions meet your criteria, the trade is executed directly on-chain by Panora’s decentralized network of executors. You can easily place, update, or cancel limit orders at no additional cost using Panora’s intuitive interface.

**No need to constantly watch the markets or wait for the perfect moment.**\
Panora executes your trades automatically when market conditions meet your preset price, and in some cases, you may even receive more tokens than anticipated. Most importantly, your assets remain fully in your control until a suitable match is found and the trade is finalized.\
\
The [Panora Interface](https://app.panora.exchange/limit) offers a streamlined interface to create, adjust, and monitor all your limit orders with ease.

<figure><img src="/files/aSqdaOkEdhvhT1tDDLOc" alt=""><figcaption></figcaption></figure>

## User Guide

**These guides are built for traders who prefer a hands-off approach to market execution.**\
By setting specific price targets, users can let their trades trigger automatically—no constant monitoring needed. [Panora Interface](https://app.panora.exchange/limit) offers a clean and user-friendly dashboard to keep track of all active and historical orders with ease.

<details>

<summary>Connect Wallet</summary>

<figure><img src="/files/iBFEtLDPVxhaPeDNVJhX" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/KyKtM2btPEahPJ3Gj63I" alt=""><figcaption></figcaption></figure>

* To begin, connect your wallet using the **“Connect”** button located at the top-right corner of the interface, or directly through the **“Connect Wallet”** option within the DCA widget.

</details>

<details>

<summary>Create a Limit Order</summary>

**Step 1: Select token pair**

You can either do this manually using the individual token selection buttons on the limit screen or by searching for your desired token pair using the search field.

<figure><img src="/files/M0OQtYS6rb8VvS90yWPQ" alt=""><figcaption></figcaption></figure>

#### **Step 2**: Configure your order amount <a href="#step-4-configure-your-order-amount" id="step-4-configure-your-order-amount"></a>

Specify the amount you would like to offer by typing in an amount manually into the “You Selling” field. Please ensure that your wallet balance is sufficient to cover the order amount.

<figure><img src="/files/n7zgBIJuOShH5Qm2TRKk" alt=""><figcaption></figcaption></figure>

#### **Step 3**: Configure your order price <a href="#step-5-configure-your-order-price" id="step-5-configure-your-order-price"></a>

Set the price by manually entering a price at the rate field. This will calculate an estimate of the amount you should receive in the “You're Buying” field. Panora will provide you with a percentage estimate of how much more favorable/unfavorable to you (the market maker) the specified price is relative to the current market price.

<figure><img src="/files/T3hMuOYOHtUpE9exTMqY" alt=""><figcaption></figcaption></figure>

#### **Step 4**: Specify the time limit of your order <a href="#step-6-specify-the-time-limit-of-your-order" id="step-6-specify-the-time-limit-of-your-order"></a>

If your order is not filled by the end of this time limit, it will be automatically cancelled. You can either select from a list of set times or specify a custom expiry time and date. Note that you can still manually cancel your order (or any unfilled portion of your order) before it expires.

<figure><img src="/files/SQBSNJtL7c4we1QoWHMa" alt=""><figcaption></figcaption></figure>

#### **Step 5**: Review and confirm your order <a href="#step-8-review-and-confirm-your-order" id="step-8-review-and-confirm-your-order"></a>

Once you are satisfied with the details of the limit order, click “Create Order” to proceed.

<figure><img src="/files/KvUmVl39tgFVwixZR5hr" alt=""><figcaption></figcaption></figure>

Once the order has been confirmed you should see it appear in the Active Orders screen of the limit interface.

<figure><img src="/files/XGosMtEfCrsipg7MHwPS" alt=""><figcaption></figcaption></figure>

Note: When your order is *completely* filled it will be moved to the Completed tab of this interface.

</details>

<details>

<summary>Cancel a Limit Order</summary>

Find the active limit order you would like to cancel and click on its red Cancel button.

<figure><img src="/files/tpzvJ55KCusjLjYXTgCJ" alt=""><figcaption></figcaption></figure>

</details>

<figure><img src="/files/xCtcxHOJmnkAD1Ju1pDg" alt=""><figcaption></figcaption></figure>

**Fees:** Currently, 1% fees are levied for Limit orders on the Panora interface.


# DCA

## Introduction

Panora DCA Orders help you invest smarter, consistently.\
Set up recurring token purchases at fixed intervals and let Panora handle the rest — automatically and on-chain. Whether you're entering a volatile market or building a long-term position, DCA smooths out price fluctuations over time and removes the pressure of market timing.

With Panora’s decentralized network of executors, your DCA orders are executed reliably and securely without needing constant supervision. You retain full custody of your assets until each scheduled order is triggered and settled directly on-chain.

You can easily configure the amount, frequency, and duration of your DCA strategy — or cancel through [*Panora’s intuitive interface*](https://app.panora.exchange/dca).

<figure><img src="/files/K3UbBrtPCXbLiXsRFIsn" alt=""><figcaption></figcaption></figure>

## User Guide

These guides are designed for traders who prefer a hands-off, consistent investment strategy.\
By scheduling recurring token purchases, users can steadily build their position over time—no need to constantly watch the markets. The Panora Interface provides a clean and intuitive dashboard to easily manage, track, and adjust all active and past DCA orders. of all active and historical orders with ease.

<details>

<summary>Connect Wallet</summary>

<figure><img src="/files/JqOAAzuJQWxq8eDQZFbh" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/Pqdf7Fj5dAzVLNkfpzZE" alt=""><figcaption></figcaption></figure>

* To begin, connect your wallet using the **“Connect”** button located at the top-right corner of the interface, or directly through the **“Connect Wallet”** option within the DCA widget.

</details>

<details>

<summary>Create DCA Order</summary>

**Step 1: Select token pair**

You can either do this manually using the individual token selection buttons on the dca screen or by searching for your desired token pair using the search field.

<figure><img src="/files/80oviiYkCqvf5wTmQKZR" alt=""><figcaption></figcaption></figure>

**Step 2: Configure your order amount**

Specify the amount you would like to offer by typing in an amount manually into the "Selling” field. Please ensure that your wallet balance is sufficient to cover the order amount.

<figure><img src="/files/Fl278hTYnq0pQ64fLX4I" alt=""><figcaption></figcaption></figure>

**Step 3: Configure your price range**

To add custom price range, click on the gear button at the top right section of the dca widget and enable the pricing strategy option

<figure><img src="/files/kU2s2jjVC8HDxY9wdVBi" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/hBKVgQYWfkZvMLnozjAg" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/T6T5Ftp0Nw51pBcM1CqU" alt=""><figcaption></figcaption></figure>

**Step 4: Set DCA Interval**

Choose how frequently you want each purchase to be executed — such as every hour, day, or week. This interval determines the time gap between each recurring order in your DCA strategy.

<figure><img src="/files/OwhIkoYOwzRHks501cqm" alt=""><figcaption></figcaption></figure>

**Step 5: Specify Number of Orders**

Enter the total number of DCA orders you want to place. Your strategy will automatically stop once this number is reached.\
You can still cancel the strategy manually at any time to stop any remaining unexecuted orders.

<figure><img src="/files/ABFzvGdf8AFZjIr7NLyp" alt=""><figcaption></figcaption></figure>

**Step 6: Review and confirm your order**

Once you are satisfied with the details of the dca order, click “Create Order” to proceed.

<figure><img src="/files/JzvJmIiaQCgUi3iKJUra" alt=""><figcaption></figcaption></figure>

Once the order has been confirmed you should see it appear in the Active Orders screen of the limit interface.

<figure><img src="/files/O6xhQITBMdESA7D5rdpD" alt=""><figcaption></figcaption></figure>

Note: When your order is completely filled it will be moved to the Completed tab of this interface.

</details>

<details>

<summary>Cancel a DCA Order</summary>

<figure><img src="/files/pqCka1fxL4lClyxg6jcl" alt=""><figcaption></figcaption></figure>

</details>

<figure><img src="/files/ZqUrGPdB3D0K6LQNjicy" alt=""><figcaption></figcaption></figure>

**Fees:** Currently, 1% fees are levied for DCA orders on the Panora interface.


# Flows

Seamlessly move and exchange assets across multiple blockchain networks

## Introduction

With the launch of Flows, Panora evolves from a simple swap service into a robust, all-in-one trading platform on Aptos. Users can now bridge and swap across 10+ chains through a unified interface, eliminating the need to navigate across multiple protocols or platforms.

<figure><img src="/files/Y2oj7OyM2VHqxPXZgY1K" alt=""><figcaption></figcaption></figure>

Panora’s Cross-Chain Swap feature leverages aggregated liquidity from multiple third-party cross-chain swap protocols to deliver a seamless and efficient trading experience. Its core capabilities include:

* **Intelligent Quote Aggregation**: Panora automatically scans and compares real-time quotes across integrated providers to secure the best available rate for the user.
* **Multi-Chain Support**: The platform supports both EVM-compatible and non-EVM blockchains, enabling broader access and greater flexibility across diverse ecosystems.
* **Unified Transaction Tracking**: Users can monitor the full lifecycle of their cross-chain transactions through a single, integrated interface, ensuring transparency and ease of use from initiation to completion.

<details>

<summary>Supported Networks</summary>

* Aptos
* Solana
* Sui
* Ethereum
* Optimism
* Arbitrum
* Base
* Bnb
* Polygon
* Avalance

</details>

## User Guide

To experience seamless asset swaps across multiple blockchain networks, navigate to the **Cross-Chain** tab on the Panora interface or visit <https://app.panora.exchange/cross-chain>.&#x20;

<details>

<summary>Connect Wallet</summary>

<figure><img src="/files/uuJ2JwJwpvCq05F46Bzs" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/0XzvG6ctzBh2GXy1VP5v" alt=""><figcaption></figcaption></figure>

* To begin, connect both your **Source** and **Destination** Web3 wallets using the **“Connect”** button located at the top-right corner of the interface, or directly through the **“Connect Wallet”** option within the Cross-Chain Swap widget.
* Ensure that both wallets are connected to their respective blockchain networks. If either wallet is connected to an incorrect network, Panora will automatically prompt you to switch to the appropriate one before proceeding with the cross-chain swap.

</details>

<details>

<summary>Configure your transaction details</summary>

<figure><img src="/files/CuxOcJRiIr4xO8VW9RLQ" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/ZgXzOeDgTDVgfwjac9s2" alt=""><figcaption></figcaption></figure>

To initiate a cross-chain swap on Panora, configure the following parameters:

* **Source Network**: Select the blockchain network where your current token is held.
* **Destination Network**: Choose the target blockchain where you want to receive the output token.
* **Token Pair**: Specify the token you want to swap **from** on the source chain, and the token you wish to receive **on** the destination chain.
* **Amount**: Enter the amount of the source token you want to swap.

Panora will automatically aggregate and evaluate all available routing options from supported cross-chain protocols, selecting the most efficient and cost-effective path for your swap.

</details>

<details>

<summary>Review Transaction and Confirm Swap</summary>

<figure><img src="/files/nP4nOEPczS5wJBh0cg6F" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/oyJTOv3Z4iT8pMg1IYWq" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/ctjnq6Snzx0icFWD6aug" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/T6vxcNqrpEudXyjOk1t6" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/DjFC4hGcRwyxAChiD7cA" alt=""><figcaption></figcaption></figure>

After configuring your swap details, you will be prompted to **confirm the transaction**.

A confirmation dialog will appear, displaying key information such as:

* Token amounts
* Estimated amount to be received
* Estimated processing time and network fees

Carefully review all details before proceeding. Once verified, click **“Confirm Transaction”** and approve the transaction in your connected wallet to initiate the cross-chain swap.

</details>

<details>

<summary>Review Transaction History</summary>

<figure><img src="/files/MkS8OtM5lI3PDajeorZ7" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/AhD5fCLvlqpntF9Lqz8B" alt=""><figcaption></figcaption></figure>

Once a cross-chain swap is initiated, users can monitor the **entire transaction lifecycle** directly within the Panora interface—eliminating the need to check multiple platforms or external dashboards.

Transaction statuses are updated in real time to reflect their current state:

* **Active**: The transaction is underway. This includes the initial swap on the source chain, the bridging process, and settlement on the destination chain.

  > *Note: Some blockchain networks or protocols may require additional time to complete. You can refer to the “Estimated Processing Time” provided in the confirmation dialog before proceeding.*
* **Completed**
  * **Success**: The transaction has been completed successfully, and the output tokens have been delivered to your receiving address on the destination network.
  * **Failed**: The transaction could not be completed. In such cases, it is automatically reverted and your tokens are returned to the wallet.

Panora provides integrated, real-time visibility into every transaction, ensuring users remain informed at every step, from initial approval to final settlement. Whether verifying a high-value trade, troubleshooting a failed swap, or reviewing historical activity, the **Panora transaction history** panel offers a transparent, and user-friendly view of all cross-chain interactions.

</details>

## Fees

* **Non-Aptos Swap:** Panora does not charge any fees. However, third-party swap providers may apply their own. Currently, we use LiFi, which charges a 0.25% fee.
* **Bridge:** Stargate includes a relayer fee. No fees is currently levied by Circle CCTP.
* **Aptos Swap:** Currently, 1% fees are levied for swaps on Aptos. &#x20;
* **Network Fees:** Standard gas fees apply separately.


# Terminal

Aptos' DeFi trading powerhouse

Panora Terminal is the all-in-one command center for analytics and trading on Aptos. It combines advanced on-chain insights, real-time data feeds, and swap execution into a single powerful interface. With integrated portfolio view and best-price execution via Panora Swap, Panora Terminal delivers precision, speed, and clarity to every move you make.\
\
If it’s on Aptos, it’s tracked on Panora Terminal.

**Features:**

* **Overview & Data Dashboard:** This is the live pulse of Aptos tokens. Prices, percentage changes, liquidity, market cap, every essential metric you need at a glance. Whether you’re looking for the next hot token or analyzing price movements, this is where the action unfolds.
* **Category Filters:** Filter tokens by Meme Coins, Native Assets, Trending, Gainers, Losers, and even Emoji Tokens. Additionally, the Terminal gives you powerful tools to personalize your experience by setting Favorite Tokens, having a portfolio overview and also filter tokens based on graduation status
* **One-Click Buy Feature:** Execute a swap instantly with the BUY button, no unnecessary steps, just pure speed.
* **Trending Bar:** This bar showcases the hottest tokens, market movers, and trending assets in real time.
* **Portfolio Overview:** Provides users a real-time snapshot of the complete portfolio, displaying token balances, market values, and performance metrics at a glance.

<figure><img src="/files/0cZg9OvogEjrhTcWsMm4" alt=""><figcaption></figcaption></figure>

**Fees:** Panora levies 1% fees on transactions executed via Terminal tab


# Trade

The Ultimate CEX replacement

**Panora Trade** is a fully decentralized on-chain order book powered by **Econia’s settlement engine**, offering a CEX-like trading experience with the transparency and security of DeFi. Built on the Aptos blockchain, it delivers unparalleled speed and efficiency for all users.

#### **Key Features:**

* **CEX-Like Experience**: Intuitive interface similar to traditional exchanges, making it accessible for all traders.
* **High Performance**: Low latency and high throughput for quick and precise order execution.
* **Transparent and Secure**: Every trade is recorded on-chain, ensuring immutability and verifiability.

<figure><img src="/files/v387wOP1Z2z0HNBqK70X" alt=""><figcaption><p>Experience CLOB like UI/UX on-chain with Panora</p></figcaption></figure>


# Exchanges

<table data-view="cards"><thead><tr><th></th><th align="center"></th></tr></thead><tbody><tr><td><img src="/files/GAiyxRa6h5dCgxRQSQUW" alt="" data-size="original"></td><td align="center"><strong>Thala</strong></td></tr><tr><td><img src="/files/a9bJ0XFYwLw0ZlqgJ1vJ" alt="" data-size="original"></td><td align="center"><strong>Liquidswap</strong></td></tr><tr><td><img src="/files/O2fSdzeWqPuYXsqQhRQo" alt="" data-size="original"></td><td align="center"><strong>Cellana</strong></td></tr><tr><td><img src="/files/49l7TTGwFSbNjZr6Qpfs" alt="" data-size="original"></td><td align="center"><strong>Pancakeswap</strong></td></tr><tr><td><img src="/files/B7mgGGdXrOGXp6MMxCAc" alt="" data-size="original"></td><td align="center"><strong>Sushiswap</strong></td></tr><tr><td><img src="/files/KYvemBFrRPzhZQQkBWcQ" alt="" data-size="original"></td><td align="center"><strong>Baptswap</strong></td></tr><tr><td><img src="/files/GX5klpAi7Q9CVeO5OMv5" alt="" data-size="original"></td><td align="center"><strong>Animeswap</strong></td></tr><tr><td><img src="/files/3dEG95nI2a6uBei97k1h" alt="" data-size="original"></td><td align="center"><strong>Cetus</strong></td></tr><tr><td><img src="/files/w1U6Q3y2ziPBsW2jkh5z" alt="" data-size="original"></td><td align="center"><strong>Aux</strong></td></tr></tbody></table>


# Aggregators

<table data-view="cards"><thead><tr><th></th><th align="center"></th></tr></thead><tbody><tr><td><img src="/files/eLmaPu4G0s2cWVS1a1gj" alt="" data-size="original"></td><td align="center"><strong>OpenOcean</strong></td></tr><tr><td><img src="/files/OBfjCTIYaNoAedhGbxl1" alt="" data-size="original"></td><td align="center"><strong>Kana Labs</strong></td></tr></tbody></table>


# On-chain Orderbook

<table data-view="cards"><thead><tr><th></th><th align="center"></th></tr></thead><tbody><tr><td><img src="/files/RUR6w5pmu8EQF9RhJqiT" alt="" data-size="original"></td><td align="center"><strong>Econia</strong></td></tr></tbody></table>


# Wallets

<table data-view="cards"><thead><tr><th></th><th align="center"></th></tr></thead><tbody><tr><td><img src="/files/xiCIf5vYIF5A1U5sMfGs" alt="" data-size="original"></td><td align="center"><strong>Petra</strong></td></tr><tr><td><img src="/files/wWkDLTtGe17hJ3uHMVtD" alt="" data-size="original"></td><td align="center"><strong>Pontem</strong></td></tr><tr><td><img src="/files/7iJzbZxGA1HYpvUrszi8" alt="" data-size="original"></td><td align="center"><strong>Martian</strong></td></tr><tr><td><img src="/files/qOAlyLdccdD0Dku5Eucf" alt="" data-size="original"></td><td align="center"><strong>Nightly</strong></td></tr><tr><td><img src="/files/lxYWn3fNWSkO2ig8gmbm" alt="" data-size="original"></td><td align="center"><strong>OKX</strong></td></tr><tr><td><img src="/files/O693gKf8KPUDJqiVB21i" alt="" data-size="original"></td><td align="center"><strong>MSafe</strong></td></tr><tr><td><img src="/files/X9Bo4QNmydmVidWNoV4h" alt="" data-size="original"></td><td align="center"><strong>Fewcha</strong></td></tr><tr><td><img src="/files/EIUYFTKiNQ8uPUHQphh1" alt="" data-size="original"></td><td align="center"><strong>Rise</strong></td></tr></tbody></table>


# Bridges

<table data-view="cards"><thead><tr><th></th><th align="center"></th></tr></thead><tbody><tr><td><img src="/files/JpQ6u9DcPO6ZD8RX0LMe" alt="" data-size="original"></td><td align="center"><strong>LayerZero</strong></td></tr><tr><td><img src="/files/zeJ4G97sehHdfNDaSinS" alt="" data-size="original"></td><td align="center"><strong>Wormhole</strong></td></tr><tr><td><img src="/files/dAUJqZOZacJI0YrHp3zo" alt="" data-size="original"></td><td align="center"><strong>Celer</strong></td></tr></tbody></table>


# Swap

Explore these docs and let our API empower your swap, algorithmic and/or arbitrage trading!

Easily integrate Panora’s swap aggregator into your app for efficient, real-time trading.

### **Key Features**

* **Optimized Transactions:** Access best rates and routes for swaps.
* **Flexible Integration:** Build custom trading strategies with ease.
* **Secure & Reliable:** Robust design for safe and stable transactions.

### **Getting Started**

* **Public API Key**:

  ```
  a4^KV_EaTf4MW#ZdvgGKX#HUD^3IFEAOV_kzpIE^3BQGA8pDnrkT7JcIy#HNlLGi
  ```

  ***Note:** This API key's limits should be sufficient for most use cases. Protocols within the Aptos ecosystem with specific requirements or customization may submit a ticket on Discord.*&#x20;
* **Sample Scripts:** [View on GitHub](https://github.com/PanoraExchange/Swap-SDK-Examples).
* **Try it:** [Swagger](https://api.panora.exchange/swagger).

### **Attribution**

Kindly include proper attribution when using the API in projects or presentations. Mention *“Powered by Panora”* wherever applicable.


# Sources

Panora currently supports the below mentioned liquidity sources on Aptos mainnet.

| Caliber        | ThalaSwapV3  | Hyperion  |
| -------------- | ------------ | --------- |
| ThalaSwapV2    | TappExchange | Cellana   |
| LiquidswapV0.5 | ThalaSwapV1  | Booster   |
| LiquidswapV0   | PancakeSwap  | Sushiswap |
| AmnisLSD       | ThalaLSD     | Emojicoin |
| AnimeSwap      | Cetus        | Aptoswap  |
| Aux            | Earnium      |           |


# API

Explore authentication, endpoints, and trading operations to start trading efficiently. Whether you're a developer or a trader, this guide has everything you need to get started with Panora's APIs.

### Usage

Use the below endpoint to get quotes for the swap (also contains transaction data that can be sent to wallet adapter directly or used to build, sign and submit)

<mark style="color:green;">`POST`</mark> `https://api.panora.exchange/swap`

#### Headers

* **Public API Key**:

  ```
  a4^KV_EaTf4MW#ZdvgGKX#HUD^3IFEAOV_kzpIE^3BQGA8pDnrkT7JcIy#HNlLGi
  ```

  ***Note:** This API key's limits should be sufficient for most use cases. Protocols within the Aptos ecosystem with specific requirements or customization may submit a ticket on Discord.*&#x20;

<table><thead><tr><th width="123">Name</th><th width="135">Value</th><th>Description</th></tr></thead><tbody><tr><td>x-api-key</td><td>Your API Key</td><td>Use the public API key or enter the API key provided by Panora</td></tr></tbody></table>

### Query Parameters

{% hint style="info" %}
**Note**: Panora's APIs supports the following.

1. **ExactIn Swap:** When fromTokenAmount is entered, the endpoint returns the maximum  toTokenAmount that will be received. Example: If the fromToken is APT, fromTokenAmount is 10.5 and toToken is USDC, then the toTokenAmount response is the maximum USDC a user would receive for swapping from 10.5 APT.
2. **ExactOut Swap:** When toTokenAmount is entered, the endpoint returns the minimum fromTokenAmount that has to be paid. Example: If the toToken is USDC, toTokenAmount is 100 and fromToken is APT, then the fromTokenAmount response is the minimum APT a user would pay for swapping to 100 USDC.
   {% endhint %}

<table><thead><tr><th width="194">Parameter</th><th width="120.00006103515625">Required</th><th width="90">Type</th><th>Description</th></tr></thead><tbody><tr><td>chainId</td><td>no</td><td>number</td><td><p>ID for the chain for which the endpoint is being invoked. <br></p><p>Note: Default chainID is 1 for Aptos Mainnet</p></td></tr><tr><td>fromTokenAddress</td><td>yes</td><td>string</td><td>Address of the token being swapped from<br><br>Example: If you want to swap 10.5 APT to USDC, then fromTokenAddress is <code>0xa</code></td></tr><tr><td>toTokenAddress</td><td>yes</td><td>string</td><td>Address of the token being swapped to<br><br>Example: If you want to swap 10.5 APT to USDC, then toTokenAddress is <code>0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b</code></td></tr><tr><td>fromTokenAmount</td><td><a data-footnote-ref href="#user-content-fn-1">yes</a><mark style="color:red;">*</mark></td><td>number</td><td>Amount of the token being swapped from. Please set the amount without Token decimals<br><br>Example: If you want to swap 10.5 APT to USDC, then fromTokenAmount is 10.5</td></tr><tr><td>toTokenAmount</td><td>yes<mark style="color:red;">*</mark></td><td>number</td><td><p>Amount of the token being swapped to. Please set the amount without Token decimals </p><p></p><p>Example: If you want to swap from APT to 100 USDC, then toTokenAmount is 100</p></td></tr><tr><td>toWalletAddress</td><td>yes</td><td>string</td><td>Address of the wallet to which the swapped tokens will be sent</td></tr><tr><td>slippagePercentage</td><td>no</td><td>number</td><td><p>Slippage tolerance as 'auto' (which lets Panora choose the optimal slippage for the transaction, up to a maximum of 5%) or a percentage value.<br><br>Example: For 3% slippage tolerance, set the value as 3. This can be set as 0.1, 0.5, 1.0 or any custom slippage percentage between 0 and 100.</p><p><br>Note: If nothing is entered, slippage tolerance will be set to auto by default. If a numeric value is entered, anything after two decimal places will be truncated.</p></td></tr><tr><td>integratorFeePercentage</td><td>no</td><td>number</td><td><p>Integrator fee as a percentage value<br><br>Example: For 2% integrator fee, set the value as 2. This can be set as 0.1, 0.5, 1.0 or any custom integrator fee between 0 and 2.</p><p><br>Note: Fee sharing applicable. Fee amount is auto-swapped to APT, whenever possible. If nothing is entered, integrator fee will be set to 0 by default. If a numeric value is entered, anything after two decimal places will be truncated.</p></td></tr><tr><td>integratorFeeAddress</td><td>no</td><td>string</td><td><p>Wallet Address where integrators want to receive their fee share. The fee share is settled immediately with the swap transaction to the provided wallet address.</p><p></p><p>Note: Ensure it starts with 0x followed by 64 characters</p></td></tr><tr><td>includeSources</td><td>no</td><td>string</td><td><p>List of liquidity sources to be included for route calculation. </p><p></p><p>Example: Hyperion, ThalaSwapV2</p><p></p><p>Note: If nothing is entered, all available sources are included by default. Check entire list <a href="https://docs.panora.exchange/developer/swap/sources">here</a>.</p></td></tr><tr><td>excludeSources</td><td>no</td><td>string</td><td><p>List of liquidity sources to be excluded from the route. </p><p></p><p>Example: SushiSwap</p><p></p><p>Note: If nothing is entered, none of the sources will be excluded by default. Check entire list <a href="https://docs.panora.exchange/developer/swap/sources">here</a>.</p></td></tr><tr><td>includePools</td><td>no</td><td>string</td><td><p>List of pool addresses to be included for route calculation. </p><p></p><p>Example: 0xd3894aca06d5f42b27c89e6f448114b3ed6a1ba07f992a58b2126c71dd83c127, 0xc3c4cbb3efcd3ec1b6679dc0ed45851486920dba0e86e612e80a79041a6cf1a3</p><p></p><p>Note: If nothing is entered, all available pools are included by default. Max 10 pool addresses are supported. Coin standard DEX pools with comma ( , ) within the pool address would get skipped</p></td></tr><tr><td>maxHops</td><td>no</td><td>string</td><td>Set a value between 1 and 5, or max, to limit the maximum number of hops allowed in each split section of the route (default: max)</td></tr><tr><td>disableSplits</td><td>no</td><td>boolean</td><td>Set to true to disable splitting pools across the entire route (default: false)</td></tr><tr><td>onlyDirectRoutes</td><td>no</td><td>boolean</td><td>Set to true to restrict to direct routes without intermediate hops or splits.<br>Default is false.</td></tr></tbody></table>

{% hint style="warning" %} <mark style="color:red;">\*</mark>Please send either fromTokenAmount or toTokenAmount at a time.
{% endhint %}

### Request Example

{% tabs %}
{% tab title="Javascript" %}

```javascript
//CALL THE BELOW FUNCTION WITH THE ASYNC
const end_point = 'https://api.panora.exchange/swap'
const query = {
    fromTokenAddress:"0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b"
    toTokenAddress:"0xa"
    fromTokenAmount:100
    toWalletAddress:"0x1c3206329806286fd2223647c9f9b130e66baeb6d7224a18c1f642ffe48f3b4c"
};

const headers = {
    "x-api-key": "Your API key"
};

const queryString = new URLSearchParams(query).toString();
const url = `${end_point}?${queryString}`;

const response = await (
    await fetch(url, {
        method: 'POST',
        headers: headers
    })
).json();
```

{% endtab %}

{% tab title="Python" %}

```python
import requests

end_point = 'https://api.panora.exchange/swap'
query = {
    'fromTokenAddress': '0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b',
    'toTokenAddress':'0xa',
    'fromTokenAmount': '100',
    'toWalletAddress':'0x1c3206329806286fd2223647c9f9b130e66baeb6d7224a18c1f642ffe48f3b4c'
}

headers = {
    'x-api-key': 'Your API key',
}

url = f"{end_point}?{'&'.join([f'{key}={value}' for key, value in query.items()])}"

response = requests.post(url, headers=headers)

print(response.json())

```

{% endtab %}

{% tab title="Go" %}

```go

import (
    "fmt"
    "net/http"
    "io/ioutil"
    "net/url"
)

func main() {
    endPoint := "https://api.panora.exchange/swap"
    query := url.Values{
        "fromTokenAddress": {"0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b"},
        "toTokenAddress":{"0xa"},
        "fromTokenAmount": {"100"},
        "toWalletAddress":{"0x1c3206329806286fd2223647c9f9b130e66baeb6d7224a18c1f642ffe48f3b4c"}
    }

    headers := map[string]string{
        "x-api-key": "Your API key",
    }

    url := endPoint + "?" + query.Encode()

    req, err := http.NewRequest("POST", url, nil)
    if err != nil {
        fmt.Println("Error creating request:", err)
        return
    }

    for key, value := range headers {
        req.Header.Set(key, value)
    }

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        fmt.Println("Error sending request:", err)
        return
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("Error reading response:", err)
        return
    }

    fmt.Println(string(body))
}

```

{% endtab %}

{% tab title="Curl" %}

```
// Copy and paste the below command in your terminal

curl -X POST \
  'https://api.panora.exchange/swap?fromTokenAddress=0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b&toTokenAddress=0xa&fromTokenAmount=100&toWalletAddress=0x1c3206329806286fd2223647c9f9b130e66baeb6d7224a18c1f642ffe48f3b4c' \
  -H 'x-api-key: Your API key'
```

{% endtab %}
{% endtabs %}

### Response

#### Scenario 1: For ExactIn Swap where fromTokenAmount is entered (instead of toTokenAmount), the endpoint returns the maximum toTokenAmount

<table><thead><tr><th width="223">Name</th><th width="139">Type</th><th>Description</th></tr></thead><tbody><tr><td>fromToken</td><td>object</td><td>An object containing the details of the fromToken, which includes <code>address</code> , <code>decimals</code> and <code>current_price</code></td></tr><tr><td>toToken</td><td>object</td><td>An object containing the details of the toToken, which includes <code>address</code> , <code>decimals</code> and <code>current_price</code> </td></tr><tr><td>feeToken</td><td>object</td><td>An object containing the details of the feeToken, which includes <code>address</code>, <code>name</code>, <code>symbol</code>, <code>decimals and current_price</code> </td></tr><tr><td>fromTokenAmount</td><td>string</td><td>Amount of token being swapped from<br><br><strong>Note</strong>: Amount is without Token decimals</td></tr><tr><td>fromTokenAmountUSD</td><td>string</td><td>USD equivalent of fromTokenAmount<br><br><strong>Note</strong>: Will be null for those tokens whose usd price is not available from external price feeds </td></tr><tr><td>quotes</td><td>array</td><td><p>An object (within an array) containing the swap details.The object consists of:</p><p><br><code>toTokenAmount</code>:  Amount of the token (without Token decimals) being swapped to. </p><p><br><code>priceImpact</code>: percentage difference between USD price of fromTokenAmount and toTokenAmount. Will be null if either fromTokenAmountUSD or toTokenAmountUSD is null</p><p></p><p><code>slippagePercentage</code>: Percentage of slippage tolerance</p><p><br><code>feeTokenAmount</code>: Platform fee for the transaction</p><p></p><p><code>minToTokenAmount</code>:  Minimum amount of token (without Token decimals) user would receive after reducing slippage. </p><p><br><code>txData</code>: Details of the transaction for the swap</p><p></p><p><code>toTokenAmountUSD:</code> USD equivalent of toTokenAmount. Will be null for those tokens whose USD price is not available from external price feeds<br><br>Note: Values are of type string</p></td></tr><tr><td>status Code</td><td></td><td><p><code>200</code>:  Successful response<br><code>400</code>: Bad Request</p><p><code>401</code>: Unauthorized (in case no/wrong API key is passed)</p><p><code>404</code>: Not Found</p><p><code>429</code>: Too  many requests (in case of rate limit breach)<br><code>500</code>: Internal Server Error </p></td></tr></tbody></table>

#### Scenario 2: For ExactOut Swap where toTokenAmount is entered (instead of fromTokenAmount), the endpoint returns the minimum toTokenAmount

<table><thead><tr><th width="210">Name</th><th width="126">Type</th><th>Description</th></tr></thead><tbody><tr><td>fromToken</td><td>object</td><td>An object containing the details of the fromToken, which includes <code>address</code> , <code>decimals</code> and <code>current_price</code></td></tr><tr><td>toToken</td><td>object</td><td>An object containing the details of the toToken, which includes <code>address</code> , <code>decimals</code> and <code>current_price</code> </td></tr><tr><td>feeToken</td><td>object</td><td>An object containing the details of the feeToken, which includes <code>address</code>, <code>name</code>, <code>symbol</code>, <code>decimals and current_price</code></td></tr><tr><td>toTokenAmount</td><td>string</td><td>Amount of token user desires to get after the swap<br><br><strong>Note</strong>: Amount is without Token decimals</td></tr><tr><td>toTokenAmountUSD</td><td>string</td><td>USD equivalent of toTokenAmount. <br><br><strong>Note</strong>: Will be null for those tokens whose usd price is not available from external price feeds </td></tr><tr><td>quotes</td><td>array</td><td><p>An object (within an array) containing the swap details.The object consists of:</p><p><br><code>fromTokenAmount</code>:  Amount of tokens (without Token decimals) user needs to pay for the swap<br><br><code>maxFromTokenAmount:</code> Maximum amount of tokens (without Token decimals) user would need to pay after adding slippage.</p><p></p><p><code>slippagePercentage</code>:  Percentage of slippage tolerance</p><p><br><code>feeTokenAmount</code>:  Platform fee for the transaction<br><br><code>priceImpact</code>:  percentage difference between USD price of fromTokenAmount and toTokenAmount. Will be null if either fromTokenAmountUSD or toTokenAmountUSD is null </p><p><br><code>txData</code>: Details of the transaction for the swap<br><br><code>fromTokenAmountUSD:</code> USD equivalent of fromTokenAmount. Will be null for those tokens whose usd price is not available from external price feeds</p><p></p><p>Note: Values are of type string </p></td></tr><tr><td>status code</td><td></td><td><p><code>200</code>:  Successful response<br><code>400</code>: Bad Request</p><p><code>401</code>: Unauthorized (in case no/wrong API key is passed)</p><p><code>404</code>: Not Found</p><p><code>429</code>: Too  many requests (in case of rate limit breach)<br><code>500</code>: Internal Server Error </p></td></tr></tbody></table>

[^1]:


# SDK

SDK for swaps, balances, token lists, and prices

## Installation

Using npm

```
npm install @panoraexchange/swap-sdk
```

Using yarn

```
yarn add @panoraexchange/swap-sdk
```

Using pnpm

```
pnpm add @panoraexchange/swap-sdk
```

## Usage

### 1. Initialize

```javascript
import Panora, { PanoraConfig } from "@panoraexchange/swap-sdk"

const config: PanoraConfig = {
  panoraApiKey: "PANORA_API_KEY", // Optional. Default is Panora's public api key
  geomiApiKey: "GEOMI_API_KEY", // Optional. Default is no api key. Takes higher priority over rpcUrl
  rpcUrl: "CUSTOM_RPC_URL", // Optional
}

const panora = new Panora(config)
```

* **Public API Key**:

  ```
  a4^KV_EaTf4MW#ZdvgGKX#HUD^3IFEAOV_kzpIE^3BQGA8pDnrkT7JcIy#HNlLGi
  ```

  ***Note:** This API key's limits should be sufficient for most use cases. Protocols within the Aptos ecosystem with specific requirements or customization may submit a ticket on Discord.*&#x20;

### 2. Swap

Fetches a swap quote and executes the transaction on-chain in a single step. Use this when you want to trigger end-to-end transaction without fetching or managing quotes separately. Refer [API page](https://docs.panora.exchange/developer/swap/api) for all available query parameters&#x20;

#### i.  ExactInSwap:

```javascript
const exactInSwap = async () => {
  const response = await panora.swap({
    params: {
      chainId: "1",
      fromTokenAddress:
        "0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b",
      toTokenAddress: "0xa",
      fromTokenAmount: "100",
      toWalletAddress: "YOUR WALLET ADDRESS",
      slippagePercentage: "1",
      integratorFeeAddress: "INTEGRATOR FEE WALLET ADDRESS",
      integratorFeePercentage: "1",
    },
    private_key: "YOUR PRIVATE KEY",
  })
}
```

#### ii. ExactOutSwap:

```javascript
const exactOutSwap = async () => {
  const response = await panora.swap({
    params: {
      chainId: "1",
      fromTokenAddress:
        "0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b",
      toTokenAddress: "0xa",
      toTokenAmount: "10.5",
      toWalletAddress: "YOUR WALLET ADDRESS",
      slippagePercentage: "1",
      integratorFeeAddress: "INTEGRATOR FEE WALLET ADDRESS",
      integratorFeePercentage: "1",
    },
    private_key: "YOUR_PRIVATE_KEY",
  })
}
```

### 3. Quote & Execute

#### a. Quote: Returns quote for a swap transaction. Contains transaction data that can be used to build, sign and submit directly

#### i. ExactInSwapQuote

```javascript
const exactInSwapQuote = async () => {
  const response = await panora.getQuote({
    params: {
      chainId: "1",
      fromTokenAddress:
        "0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b",
      toTokenAddress: "0xa",
      fromTokenAmount: "100",
      toWalletAddress: "YOUR WALLET ADDRESS",
      slippagePercentage: "1",
      integratorFeeAddress: "INTEGRATOR FEE WALLET ADDRESS",
      integratorFeePercentage: "1",
    },
  });
};

```

#### ii. ExactOutSwapQuote

```javascript
const exactOutSwapQuote = async () => {
  const response = await panora.getQuote({
    params: {
      chainId: "1",
      fromTokenAddress:
        "0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b",
      toTokenAddress: "0xa",
      toTokenAmount: "10.5",
      toWalletAddress: "YOUR WALLET ADDRESS",
      slippagePercentage: "1",
      integratorFeeAddress: "INTEGRATOR FEE WALLET ADDRESS",
      integratorFeePercentage: "1",
    },
  });
};

```

#### b. Execute Quote: Executes a transaction using a pre-fetched swap quote. Unlike swap function, this function does not fetch the quote itself. Use getQuote function to fetch a swap quote.

```typescript
const quoteResponse = await panora.getQuote({
  params: {
    chainId: "1",
    fromTokenAddress:
      "0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b",
    toTokenAddress: "0xa",
    toTokenAmount: "10.5",
    toWalletAddress: "YOUR WALLET ADDRESS",
    slippagePercentage: "1",
    integratorFeeAddress: "INTEGRATOR FEE WALLET ADDRESS",
    integratorFeePercentage: "1",
  },
});

const txResponse = await panora.executeQuote({
  quote: quoteResponse,
  privateKey: "YOUR_PRIVATE_KEY"
});

```

### 4. Get Balances

Fetch wallet balances

```typescript
const response = await panora.getBalances({
  walletAddress: "YOUR WALLET ADDRESS",
});
```

### 5. Get Tokenlist

Fetch Panora's Aptos Token List

```tsx
const response = await panora.getTokenList()
```

### 6. Get Prices

Fetch Token Prices

```typescript
const response = await panora.getPrices({
  tokenAddress: ["0xa"],
});

```

## Attribution

Kindly include proper attribution when using the SDK in projects or presentations. Mention “Powered by Panora” wherever applicable.


# Contract

Learn how to integrate Panora swap contract within your contract in just a few minutes.

To integrate the Panora contract, the first step is familiarity with our [Swap API](https://docs.panora.exchange/developer/swap-api-and-sdk) as the type arguments and arguments required by our contract are provided by the Panora Swap API endpoint. The Swap endpoint returns the parameters necessary for the router entry function and covers both ExactInSwap and ExactOutSwap.&#x20;

**API Response Structure**

The response will include a consistent structure across all scenarios, containing a key named txData

* txData: This txData contains the details required for executing the swap.
* Usage: Send the txData directly to your contract. No modifications are needed to accommodate different token types (fungible assets or coins).&#x20;

Contract Integration Sample: <https://github.com/PanoraExchange/Panora-Contract-Integration-Example>


# Widget

Easily integrate Panora's swap functionality into your application with our lightweight, plug-and-play SDK — enabling seamless token swaps and real-time data directly within your platform.

### Key Features

* **Quick Setup** — Add swaps to your app in under 5 minutes
* **Three Display Modes** — Integrated (inline), Widget (floating button), or Modal (popup)
* **Fully Customizable** — Theme colors, default tokens, locale, slippage, and more
* **Multi-Language** — Supports 11 locales out of the box
* **Wallet Support** — Built-in wallet connection UI, or bring your own

### Display Modes

| Mode         | Description                                                                |
| ------------ | -------------------------------------------------------------------------- |
| `INTEGRATED` | Renders inline inside a target `<div>` you provide                         |
| `WIDGET`     | Renders a floating button (configurable corner). Click to open the swap UI |
| `MODAL`      | Opens a centered popup dialog with a backdrop overlay                      |

### Supported Frameworks

* Plain HTML / Vanilla JS
* React (Vite, CRA)
* Next.js (App Router & Pages Router)
* Any framework that can run JavaScript

### Getting an API Key

A default public API key is available for development and typical usage:

```
a4^KV_EaTf4MW#ZdvgGKX#HUD^3IFEAOV_kzpIE^3BQGA8pDnrkT7JcIy#HNlLGi
```

For production or high-traffic use cases, open a ticket on [Discord](https://discord.gg/panora) to request a dedicated key.

### Installation

**npm**

```bash
npm install @panoraexch/widget-sdk
```

**yarn**

```bash
yarn add @panoraexch/widget-sdk
```

**pnpm**

```bash
pnpm add @panoraexch/widget-sdk
```

**CDN (no bundler needed)**

```bash
<script src="https://assets.panora.exchange/widget-v1.js" defer></script>
```

<figure><img src="/files/HhKHmPztjWsibYEEzMxU" alt=""><figcaption></figcaption></figure>

### Quick Start

#### Option A: NPM (React / Next.js)

```typescript
import { init, close } from "@panoraexch/widget-sdk";

// Open the widget
await init({
  displayMode: "INTEGRATED",
  integratedTargetId: "my-swap-container",
  panoraApiKey: "YOUR_API_KEY",
});

// Later, tear it down
close();

```

#### Option B: CDN (plain HTML)

```html
<script src="https://assets.panora.exchange/widget-v1.js" defer></script>
<div id="my-swap-container"></div>

<script>
  window.addEventListener("load", function () {
    PanoraWidget.render("#my-swap-container", {
      displayMode: "INTEGRATED",
      panoraApiKey: "YOUR_API_KEY",
    });
  });
</script>

```

## React App Example

A complete guide to integrating Panora Widget SDK into a React + Vite application.

### 1. Create a New Project

```bash
npm create vite@latest my-app -- --template react-ts
cd my-app
```

### 2. Install the SDK

```bash
npm install @panoraexch/widget-sdk
```

### 3. Add the Widget

Replace `src/App.tsx` with:

```tsx
import { useEffect, useState } from "react";
import { init, close } from "@panoraexch/widget-sdk";

const API_KEY = import.meta.env.VITE_PANORA_API_KEY || "";
const DEFAULT_FROM = "0xa" as const;
const DEFAULT_TO =
  "0x..." as const;

type Tab = "INTEGRATED" | "WIDGET" | "MODAL";

export default function App() {
  const [activeTab, setActiveTab] = useState<Tab>("INTEGRATED");

  useEffect(() => {
    // Clean up any previous instance
    close();

    // MODAL is opened on-demand, not on mount
    if (activeTab === "MODAL") return;

    const timeout = setTimeout(() => {
      if (activeTab === "INTEGRATED") {
        init({
          panoraApiKey: API_KEY,
          displayMode: "INTEGRATED",
          integratedTargetId: "panora-widget-container",
          defaultFromTokenAddress: DEFAULT_FROM,
          defaultToTokenAddress: DEFAULT_TO,
          locale: "en",
          showNotifications: true,
        });
      } else if (activeTab === "WIDGET") {
        init({
          panoraApiKey: API_KEY,
          displayMode: "WIDGET",
          defaultFromTokenAddress: DEFAULT_FROM,
          defaultToTokenAddress: DEFAULT_TO,
          locale: "en",
          widgetBtnDirection: "right-bottom",
        });
      }
    }, 100);

    return () => {
      clearTimeout(timeout);
      close();
    };
  }, [activeTab]);

  return (
    <div>
      <h1>My App</h1>

      {/* ── Integrated Mode ── */}
      {activeTab === "INTEGRATED" && (
        <div id="panora-widget-container" />
      )}

      {/* ── Modal Mode — open / close on demand ── */}
      {activeTab === "MODAL" && (
        <div>
          <button
            onClick={() =>
              init({
                panoraApiKey: API_KEY,
                displayMode: "MODAL",
                defaultFromTokenAddress: DEFAULT_FROM,
                defaultToTokenAddress: DEFAULT_TO,
                locale: "en",
              })
            }
          >
            Open Swap Modal
          </button>
          <button onClick={() => close()}>Close</button>
        </div>
      )}
    </div>
  );
}
```

### 4. Run

```bash
npm run dev
```

### Using the React Component

If you prefer a declarative approach instead of the imperative `init()` / `close()` API, the SDK also exports a `<PanoraWidget />` React component:

```tsx
import { PanoraWidget } from "@panoraexch/widget-sdk";

export default function App() {
  return (
    <PanoraWidget
      widgetConfig={{
        panoraApiKey: "YOUR_API_KEY",
        defaultFromTokenAddress: "0xa",
        defaultToTokenAddress:
          "0x...",
        locale: "en",
        showNotifications: true,
      }}
    />
  );
}
```

> **Note:** `<PanoraWidget />` always renders in `INTEGRATED` mode. For `WIDGET` or `MODAL` modes, use the imperative `init()` / `close()` API.

### Key Points

* Always call `close()` before re-initializing to avoid duplicate instances
* The `100ms` timeout gives the DOM time to settle before the widget mounts
* Store your API key in `.env` as `VITE_PANORA_API_KEY`

***

## Next.js Example (App Router)

A complete guide to integrating Panora Widget SDK into a Next.js App Router application.

### 1. Create a New Project

```bash
npx create-next-app@latest my-app --typescript
cd my-app
```

### 2. Install the SDK

```bash
npm install @panoraexch/widget-sdk
```

### 3. Add the Widget

Create or replace `src/app/page.tsx`:

```tsx
"use client";

import { useEffect, useState } from "react";
import { init, close } from "@panoraexch/widget-sdk";

const API_KEY = process.env.NEXT_PUBLIC_PANORA_API_KEY || "";
const DEFAULT_FROM = "0xa" as const;
const DEFAULT_TO =
  "0x..." as const;

export default function Home() {
  const [ready, setReady] = useState(false);

  useEffect(() => {
    setReady(true);
  }, []);

  useEffect(() => {
    if (!ready) return;

    init({
      panoraApiKey: API_KEY,
      displayMode: "INTEGRATED",
      integratedTargetId: "panora-widget-container",
      defaultFromTokenAddress: DEFAULT_FROM,
      defaultToTokenAddress: DEFAULT_TO,
      locale: "en",
      showNotifications: true,
    });

    return () => {
      close();
    };
  }, [ready]);

  return (
    <main>
      <h1>My App</h1>
      <div id="panora-widget-container" />
    </main>
  );
}
```

> **Important:** The `"use client"` directive is required. The widget uses browser APIs (`document`, `window`) and cannot run during server-side rendering.

### Widget Mode Example

```tsx
"use client";

import { useEffect } from "react";
import { init, close } from "@panoraexch/widget-sdk";

export default function WidgetPage() {
  useEffect(() => {
    init({
      panoraApiKey: process.env.NEXT_PUBLIC_PANORA_API_KEY || "",
      displayMode: "WIDGET",
      widgetBtnDirection: "right-bottom",
      locale: "en",
    });

    return () => close();
  }, []);

  return (
    <main>
      <h1>Widget floating in the corner</h1>
    </main>
  );
}
```

### Modal Mode Example

```tsx
"use client";

import { init, close } from "@panoraexch/widget-sdk";

export default function ModalPage() {
  return (
    <main>
      <button
        onClick={() =>
          init({
            panoraApiKey: process.env.NEXT_PUBLIC_PANORA_API_KEY || "",
            displayMode: "MODAL",
            locale: "en",
          })
        }
      >
        Open Swap Modal
      </button>
      <button onClick={() => close()}>Close</button>
    </main>
  );
}
```

### Next.js Pages Router

If you use the Pages Router instead of App Router, the code is nearly identical — just drop the `"use client"` directive and place your file in `src/pages/index.tsx`. No other changes needed.

### Key Points

* Store your API key in `.env.local` as `NEXT_PUBLIC_PANORA_API_KEY`
* Always call `close()` in the `useEffect` cleanup to prevent memory leaks
* The widget loads its UI from the CDN at runtime, so your Next.js bundle size is unaffected

***

## HTML App Example

The simplest integration — no bundler, no framework, just a single `<script>` tag.

### 1. Create an HTML File

```html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Panora Swap</title>
    <script src="https://assets.panora.exchange/widget-v1.js" defer></script>
  </head>
  <body>
    <h1>My App</h1>
    <div id="panora-widget-container"></div>

    <script>
      window.addEventListener("load", function () {
        PanoraWidget.render("#panora-widget-container", {
          panoraApiKey: "YOUR_API_KEY",
          displayMode: "INTEGRATED",
          defaultFromTokenAddress: "0xa",
          defaultToTokenAddress:
            "0x...",
          locale: "en",
          showNotifications: true,
        });
      });
    </script>
  </body>
</html>
```

### 2. Serve It

Use any static file server:

```bash
npx http-server .
```

### Widget Mode (Floating Button)

```html
<script>
  window.addEventListener("load", function () {
    PanoraWidget.render(document.body, {
      panoraApiKey: "YOUR_API_KEY",
      displayMode: "WIDGET",
      widgetBtnDirection: "right-bottom",
      locale: "en",
    });
  });
</script>
```

### Modal Mode (Popup)

```html
<button id="open-btn">Open Swap</button>

<script>
  var instance = null;

  document.getElementById("open-btn").addEventListener("click", function () {
    var root = document.getElementById("panora-widget-root");
    if (!root) {
      root = document.createElement("div");
      root.id = "panora-widget-root";
      document.body.appendChild(root);
    }

    instance = PanoraWidget.render(root, {
      panoraApiKey: "YOUR_API_KEY",
      displayMode: "MODAL",
      locale: "en",
    });
  });
</script>
```

### API Reference (CDN)

When using the CDN script, the global `PanoraWidget` object is available on `window`:

| Method                                    | Description                                                                 |
| ----------------------------------------- | --------------------------------------------------------------------------- |
| `PanoraWidget.render(container, config?)` | Render the widget into a DOM element or CSS selector. Returns `{ unmount }` |

```javascript
// container can be a DOM element or a CSS selector string
var instance = PanoraWidget.render("#my-div", { displayMode: "INTEGRATED" });

// To remove the widget:
instance.unmount();
```

### Key Points

* The `defer` attribute ensures the script loads after HTML parsing
* `PanoraWidget.render()` accepts either a DOM element or a CSS selector (`#id`, `.class`)
* The CDN bundle is fully self-contained (includes React) — no other dependencies needed

***

## Configuration

Complete reference for all `WidgetConfig` options.

### API & RPC

| Property       | Type     | Default        | Description                                                  |
| -------------- | -------- | -------------- | ------------------------------------------------------------ |
| `panoraApiKey` | `string` | Public key     | Your Panora API key                                          |
| `rpcUrl`       | `string` | Panora default | Custom Aptos RPC URL. Must use `https://` (except localhost) |

### Display

| Property             | Type                                  | Default           | Description                                                    |
| -------------------- | ------------------------------------- | ----------------- | -------------------------------------------------------------- |
| `displayMode`        | `"INTEGRATED" \| "WIDGET" \| "MODAL"` | `"WIDGET"`        | How the widget is presented                                    |
| `integratedTargetId` | `string`                              | `"panora-widget"` | DOM element ID for `INTEGRATED` mode (used with `init()` only) |
| `width`              | CSS value                             | `450px` (max)     | Widget width in `INTEGRATED` mode                              |
| `height`             | CSS value                             | `630px`           | Widget height in `INTEGRATED` mode                             |

### Widget Button (WIDGET mode only)

| Property             | Type                                                           | Default          | Description                  |
| -------------------- | -------------------------------------------------------------- | ---------------- | ---------------------------- |
| `widgetBtnSize`      | `"SMALL" \| "DEFAULT"`                                         | `"DEFAULT"`      | Floating button size         |
| `widgetBtnDirection` | `"left-top" \| "left-bottom" \| "right-top" \| "right-bottom"` | `"right-bottom"` | Corner position              |
| `widgetBtnOffset`    | `{ x: number; y: number }`                                     | —                | Pixel offset from the corner |

### Tokens

| Property                  | Type                  | Default | Description                                     |
| ------------------------- | --------------------- | ------- | ----------------------------------------------- |
| `defaultFromTokenAddress` | `` `0x${string}` ``   | —       | Pre-selected "from" token                       |
| `defaultToTokenAddress`   | `` `0x${string}` ``   | —       | Pre-selected "to" token                         |
| `defaultFavoriteTokens`   | `` `0x${string}`[] `` | —       | Tokens pinned as favorites in the token picker  |
| `customTokens`            | `` `0x${string}`[] `` | —       | Additional token addresses shown in the picker  |
| `allowedTokens`           | `` `0x${string}`[] `` | —       | Restrict the token list to only these addresses |
| `showTokenCategorization` | `boolean`             | —       | Show/hide token category tabs in the picker     |

### Swap Settings

| Property                    | Type      | Default | Description                                                 |
| --------------------------- | --------- | ------- | ----------------------------------------------------------- |
| `defaultSlippagePercentage` | `string`  | —       | Default slippage tolerance (0–50). Must be a numeric string |
| `showPercentageSlider`      | `boolean` | —       | Show the percentage slider on the input field               |

### Wallet

| Property                    | Type       | Default     | Description                                                                                                                                                                                                                                                                                                         |
| --------------------------- | ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| account                     | Account    | undefined   | Pre-configured Aptos account for direct transaction signing without wallet popup. Accepts any `Account` subclass from `@aptos-labs/ts-sdk` (`Ed25519Account`, `SingleKeyAccount`, `KeylessAccount`, etc.). When set, the widget signs transactions directly — no wallet connection needed.                          |
| independentWalletConnection | boolean    | true        | When `false`, hides the widget's built-in wallet connect button. Use when the host app manages wallet connection externally.                                                                                                                                                                                        |
| useExternalWallet           | boolean    | false       | When `true`, the widget skips creating its own `AptosWalletAdapterProvider` and uses `useWallet()` from the nearest parent provider. The integrator must wrap the widget in their own `<AptosWalletAdapterProvider>`. Ideal for wallet extensions/apps embedding the widget. Only works with npm package (not CDN). |
| `disableWalletButton`       | `boolean`  | `false`     | Hide the "Connect Wallet" button                                                                                                                                                                                                                                                                                    |
| `enabledWallets`            | `string[]` | All wallets | Restrict which wallets appear in the connection dialog                                                                                                                                                                                                                                                              |

### Integrator Fees

| Property                  | Type                | Default | Description                                  |
| ------------------------- | ------------------- | ------- | -------------------------------------------- |
| `integratorWalletAddress` | `` `0x${string}` `` | —       | Wallet address that receives integrator fees |
| `integratorFeePercentage` | `number`            | —       | Fee percentage per transaction (0–5)         |

### Transaction Options

| Property                          | Type     | Default | Description                                            |
| --------------------------------- | -------- | ------- | ------------------------------------------------------ |
| `transactionOptions.maxGasAmount` | `number` | —       | Maximum gas units. Must be a positive integer          |
| `transactionOptions.gasUnitPrice` | `number` | —       | Price per gas unit (octas). Must be a positive integer |

### Localization

| Property | Type     | Default | Description |
| -------- | -------- | ------- | ----------- |
| `locale` | `string` | `"en"`  | UI language |

**Supported locales:**

| Code    | Language              |
| ------- | --------------------- |
| `en`    | English               |
| `es`    | Spanish               |
| `hi`    | Hindi                 |
| `id`    | Indonesian            |
| `ja`    | Japanese              |
| `ko`    | Korean                |
| `ru`    | Russian               |
| `tr`    | Turkish               |
| `vi`    | Vietnamese            |
| `zh`    | Chinese (Simplified)  |
| `zh-HK` | Chinese (Traditional) |

### Notifications

| Property            | Type      | Default | Description                                       |
| ------------------- | --------- | ------- | ------------------------------------------------- |
| `showNotifications` | `boolean` | `false` | Show toast notifications for swap success/failure |

### Validation Rules

The widget validates your config at runtime. Invalid values are silently ignored with a console warning:

| Property                          | Rule                                                          |
| --------------------------------- | ------------------------------------------------------------- |
| `defaultSlippagePercentage`       | Must be a numeric string between 0 and 50                     |
| `integratorFeePercentage`         | Must be a number between 0 and 5                              |
| `rpcUrl`                          | Must start with `https://` (except `localhost` / `127.0.0.1`) |
| `transactionOptions.maxGasAmount` | Must be a positive integer                                    |
| `transactionOptions.gasUnitPrice` | Must be a positive integer                                    |

***

## Theming

Customize the widget's appearance to match your app's design system.

Pass a partial `theme` object in your config — any property you omit will use the default Panora theme.

### Usage

```typescript
init({
  panoraApiKey: "YOUR_API_KEY",
  displayMode: "INTEGRATED",
  integratedTargetId: "panora-widget",
  theme: {
    primaryColor: "#6366f1",
    primaryButtonTextColor: "#ffffff",
    basicBgColor: "#1e1e2e",
    secondaryBgColor: "#181825",
    tertiaryBgColor: "#11111b",
    primaryTextColor: "#cdd6f4",
    secondaryTextColor: "#6c7086",
    borderColor: "#313244",
  },
});
```

### Theme Properties

| Property                 | Default                    | Description                             |
| ------------------------ | -------------------------- | --------------------------------------- |
| `basicBgColor`           | `rgba(255, 255, 255, .05)` | Primary background                      |
| `secondaryBgColor`       | `#010D09`                  | Secondary background (outer areas)      |
| `tertiaryBgColor`        | `#000704`                  | Tertiary background (cards, dropdowns)  |
| `primaryColor`           | `#5fdfac`                  | Main accent color (buttons, highlights) |
| `subtleColor`            | `rgba(255, 255, 255, .05)` | Subtle UI elements                      |
| `primaryButtonTextColor` | `#000000`                  | Text color on primary buttons           |
| `borderColor`            | `rgba(255, 255, 255, .05)` | Border color                            |
| `inputColor`             | `#0d110d`                  | Input field background                  |
| `inputBorderColor`       | `#2a3a2a`                  | Input field border                      |
| `primaryTextColor`       | `#FFFFFF`                  | Main text color                         |
| `secondaryTextColor`     | `#6B7280`                  | Muted/secondary text                    |
| `placeholderTextColor`   | `#3a4a3a`                  | Input placeholder text                  |
| `textUpColor`            | `#5fdfac`                  | Positive values (gains)                 |
| `textDownColor`          | `#F6465D`                  | Negative values (losses)                |
| `successColor`           | `#5fdfac`                  | Success states                          |
| `errorColor`             | `#F6465D`                  | Error states                            |
| `warningColor`           | `#EF8E19`                  | Warning states                          |

### Default Theme

```json
{
  "id": "panora",
  "name": "Panora",
  "basicBgColor": "rgba(255, 255, 255, .05)",
  "secondaryBgColor": "#010D09",
  "tertiaryBgColor": "#000704",
  "primaryColor": "#5fdfac",
  "subtleColor": "rgba(255, 255, 255, .05)",
  "primaryButtonTextColor": "#000000",
  "borderColor": "rgba(255, 255, 255, .05)",
  "inputColor": "#0d110d",
  "inputBorderColor": "#2a3a2a",
  "primaryTextColor": "#FFFFFF",
  "secondaryTextColor": "#6B7280",
  "placeholderTextColor": "#3a4a3a",
  "textUpColor": "#5fdfac",
  "textDownColor": "#F6465D",
  "successColor": "#5fdfac",
  "errorColor": "#F6465D",
  "warningColor": "#EF8E19"
}
```

> **Tip:** You can import the default theme object in code:
>
> ```typescript
> import { DEFAULT_WIDGET_THEME } from "@panoraexch/widget-sdk";
> ```

***

## API Reference

### NPM Package Exports

```typescript
// Functions
import { init, render, close, resume } from "@panoraexch/widget-sdk";

// React component
import { PanoraWidget } from "@panoraexch/widget-sdk";

// Constants
import { DEFAULT_WIDGET_THEME } from "@panoraexch/widget-sdk";

// Types
import type {
  WidgetConfig,
  PanoraWidgetConfig, // backward-compatible alias for WidgetConfig
  AppTheme,
  WidgetFeature,
  WidgetTheme,
  PanoraWidgetProps,
} from "@panoraexch/widget-sdk";
```

### `init(config?)`

Initialize and render the widget.

```typescript
function init(
  config?: WidgetConfig & { integratedTargetId?: string }
): Promise<{ unmount: () => void }>
```

| Parameter                   | Type           | Description                                                         |
| --------------------------- | -------------- | ------------------------------------------------------------------- |
| `config`                    | `WidgetConfig` | Widget configuration (see Configuration)                            |
| `config.integratedTargetId` | `string`       | DOM element ID for `INTEGRATED` mode. Defaults to `"panora-widget"` |

**Returns:** `Promise<{ unmount: () => void }>` — call `unmount()` to remove the widget.

**Behavior by display mode:**

| Mode         | What happens                                                                                              |
| ------------ | --------------------------------------------------------------------------------------------------------- |
| `INTEGRATED` | Renders into the element matching `integratedTargetId`. Throws if element not found.                      |
| `WIDGET`     | Creates a floating button. A `panora-widget-root` container is auto-created in `document.body` if needed. |
| `MODAL`      | Opens a centered dialog with backdrop. Container auto-created like `WIDGET`.                              |

### `render(container, config?)`

Lower-level alternative to `init()` for full control over where the widget mounts.

```typescript
function render(
  container: HTMLElement | string,
  config?: WidgetConfig
): Promise<{ unmount: () => void }>
```

| Parameter   | Type                    | Description                                                |
| ----------- | ----------------------- | ---------------------------------------------------------- |
| `container` | `HTMLElement \| string` | A DOM element or CSS selector (`"#my-div"`, `".my-class"`) |
| `config`    | `WidgetConfig`          | Widget configuration                                       |

> **Note:** `render()` is primarily used with the CDN bundle (`PanoraWidget.render()`). When using the npm package, prefer `init()`.

### `close()`

Unmount and clean up the widget.

```typescript
function close(): void
```

Always call `close()` before re-initializing, or in your component's cleanup function to prevent duplicate instances.

### `resume()`

Re-show the widget with the last configuration passed to `init()`.

```typescript
function resume(): Promise<void>
```

If a widget instance is already mounted, this is a no-op.

### `<PanoraWidget />`

React component for declarative rendering. Always uses `INTEGRATED` mode.

```typescript
interface PanoraWidgetProps {
  widgetConfig?: WidgetConfig;
}
```

```tsx
<PanoraWidget
  widgetConfig={{
    panoraApiKey: "YOUR_API_KEY",
    locale: "en",
  }}
/>
```

* Automatically creates a container `<div>` and calls `init()` on mount
* Automatically calls `close()` on unmount
* Re-initializes when `widgetConfig` changes

### CDN Global: `PanoraWidget`

When using the CDN `<script>` tag, a global `PanoraWidget` object is available on `window`.

```typescript
window.PanoraWidget.render(
  container: HTMLElement | string,
  config?: WidgetConfig
): { unmount: () => void }
```

| Parameter   | Type                    | Description                 |
| ----------- | ----------------------- | --------------------------- |
| `container` | `HTMLElement \| string` | DOM element or CSS selector |
| `config`    | `WidgetConfig`          | Widget configuration        |

The CDN bundle is fully self-contained — it includes its own copy of React and all dependencies.

***

### Attribution

Include **"Powered by Panora"** when using this SDK in your application. The widget displays this by default.


# iframe

Learn how to embed the Panora iframe on your website step-by-step in just a few minutes.

Panora can be seamlessly embedded within other websites as an iframe, offering the full Panora frontend experience along with custom prefilled settings.

An iframe integration ensures your site automatically reflects updates or enhancements made to Panora. After the initial setup, no extra work is needed to keep up with ongoing changes.

<figure><img src="/files/FWgDfJg2x2889VriFyxl" alt="" width="375"><figcaption></figcaption></figure>

### **URL format:**

<pre class="language-html"><code class="lang-html"><strong>https://app.panora.exchange/swap/aptos?pair=APT-USDt&#x26;fromTokenAmount=1&#x26;integratorFeePercentage=1&#x26;integratorFeeAddress=value
</strong></code></pre>

<pre class="language-html"><code class="lang-html"><strong>https://app.panora.exchange/swap/aptos?pair=0xa-0x357b0b74bc833e95a115ad22604854d6b0fca151cecd94111770e5d6ffc9dc2b&#x26;fromTokenAmount=1&#x26;integratorFeePercentage=1&#x26;integratorFeeAddress=value
</strong></code></pre>

## Parameters

<table><thead><tr><th>Params</th><th width="102">Required</th><th width="303">Description</th><th>Default</th></tr></thead><tbody><tr><td>pair</td><td>no</td><td>From and To token symbol (or token address), separated by '-'</td><td>APT-USDt</td></tr><tr><td>fromTokenAmount</td><td>no</td><td>Default from token amount for the swap</td><td>none</td></tr><tr><td>toTokenAmount</td><td>no</td><td>Default to token amount for the swap</td><td>none</td></tr><tr><td>integratorFeePercentage</td><td>no</td><td>Fee amount percentage to be collected (0.1% - 5%)</td><td>none</td></tr><tr><td>integratorFeeAddress</td><td>no</td><td>Fee receiver wallet address</td><td>none</td></tr></tbody></table>

## Adding the iframe to your site&#x20;

Sample code:

```html
<iframe
  style={{ margin: 'auto' }}
  width="450px"
  height="700px"
  src="https://app.panora.exchange/swap/aptos?pair=APT-USDt&fromTokenAmount=1&integratorFeePercentage=1&integratorFeeAddress=value"
  />
```

### **Attribution**

Kindly include proper attribution when using Panora in projects or presentations. Mention *“Powered by Panora”* wherever applicable.


# Limit

Explore authentication, endpoints, and trading operations to start trading efficiently. Whether you're a developer or a trader, this guide has everything you need to get started with Panora's APIs.

## 1. Create a Limit Order

<mark style="color:green;">`POST`</mark> `https://api.panora.exchange/limit/v1/createOrder`

### Headers

* **Public API Key**:

  ```
  a4^KV_EaTf4MW#ZdvgGKX#HUD^3IFEAOV_kzpIE^3BQGA8pDnrkT7JcIy#HNlLGi
  ```

  ***Note:** This API key's limits should be sufficient for most use cases. Protocols within the Aptos ecosystem with specific requirements or customization may submit a ticket on Discord.*&#x20;

<table><thead><tr><th width="127.81817626953125">Name</th><th width="167.27264404296875">Value</th><th>Description</th></tr></thead><tbody><tr><td>x-api-key</td><td>Your API Key</td><td>Use the public API key or enter the API key provided by Panora</td></tr></tbody></table>

### Request Body

<table><thead><tr><th width="147.3636474609375">Parameter</th><th width="106.90911865234375">Required</th><th width="113.363525390625">Type</th><th>Descriptio</th></tr></thead><tbody><tr><td>chainId</td><td>no </td><td>string</td><td>ID for the chain for which the endpoint is being invoked.</td></tr><tr><td>toTokenAddress</td><td>yes</td><td>string</td><td>Address of the token you're buying</td></tr><tr><td>fromWalletAddress</td><td>yes</td><td>string</td><td>Address of the token you're selling</td></tr><tr><td>toWalletAddress</td><td>yes </td><td>string</td><td><p>Address of the wallet to which the received</p><p> tokens will be sent</p></td></tr><tr><td>fromTokenAmount</td><td>yes</td><td>string</td><td>Amount of the token you want to sell</td></tr><tr><td>rateToTokenPerFromToken</td><td>yes</td><td>string</td><td>Conversion rate from the token you're selling to the token you're buying</td></tr><tr><td>slippagePercentage</td><td>no</td><td>string</td><td>Slippage tolerance as 'auto' (which lets Panora choose the optimal slippage for the transaction, up to a maximum of 5%) or a percentage value.</td></tr><tr><td>expiry.value</td><td>no</td><td>string</td><td>Numerical value representing the time until the order expires.</td></tr><tr><td>expiry.timePeriod</td><td>no</td><td>string</td><td>Unit of time for the expiry (e.g., "minute", "hour", "day", "week", "month").</td></tr></tbody></table>

### Request Example

{% tabs %}
{% tab title="Javascript" %}

```javascript
// CALL THE BELOW FUNCTION WITH ASYNC
const end_point = 'https://api.panora.exchange/limit/v1/createOrder';

const requestBody = {
    "chainId": "1",
    "fromTokenAddress": "0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b",
    "fromTokenAmount": "0.25",
    "toWalletAddress": "0xe98d018a6958a6d1cde384aa69a746259df98488970c49fc5f46d10c5229ee56",
    "toTokenAddress": "0xa",
    "slippagePercentage": "1",
    "platformId": "500",
    "rateToTokenPerFromToken": "0.214468496",
    "expiry": {
        "timePeriod": "week",
        "value": "1"
    },
    "integratorFeePercentage": "0"
};

const headers = {
    "x-api-key": "Your API key",
    "Content-Type": "application/json"
};

const url = `${end_point}`;

const response = await (
    await fetch(url, {
        method: 'POST',
        headers: headers,
        body: JSON.stringify(requestBody)
    })
).json();

console.log(response);

```

{% endtab %}

{% tab title="Python" %}

```python
# CALL THE BELOW FUNCTION WITH ASYNC
import requests
import json

end_point = 'https://api.panora.exchange/limit/v1/createOrder'

request_body = {
    "chainId": "1",
    "fromTokenAddress": "0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b",
    "fromTokenAmount": "0.25",
    "toWalletAddress": "0xe98d018a6958a6d1cde384aa69a746259df98488970c49fc5f46d10c5229ee56",
    "toTokenAddress": "0xa",
    "slippagePercentage": "1",
    "platformId": "500",
    "rateToTokenPerFromToken": "0.214468496",
    "expiry": {
        "timePeriod": "week",
        "value": "1"
    },
    "integratorFeePercentage": "0"
}

headers = {
    "x-api-key": "Your API key",
    "Content-Type": "application/json"
}

response = requests.post(end_point, headers=headers, data=json.dumps(request_body))
print(response.json())

```

{% endtab %}

{% tab title="Go" %}

```go
// CALL THE BELOW FUNCTION WITH ASYNC
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	endpoint := "https://api.panora.exchange/limit/v1/createOrder"

	requestBody := map[string]interface{}{
		"chainId":              "1",
		"fromTokenAddress":     "0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b",
		"fromTokenAmount":      "0.25",
		"toWalletAddress":      "0xe98d018a6958a6d1cde384aa69a746259df98488970c49fc5f46d10c5229ee56",
		"toTokenAddress":       "0xa",
		"slippagePercentage":   "1",
		"platformId":           "500",
		"rateToTokenPerFromToken": "0.214468496",
		"expiry": map[string]string{
			"timePeriod": "week",
			"value":      "1",
		},
		"integratorFeePercentage": "0",
	}

	payload, err := json.Marshal(requestBody)
	if err != nil {
		panic(err)
	}

	req, err := http.NewRequest("POST", endpoint, bytes.NewBuffer(payload))
	if err != nil {
		panic(err)
	}

	req.Header.Set("x-api-key", "Your API key")
	req.Header.Set("Content-Type", "application/json")

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	body, _ := ioutil.ReadAll(resp.Body)
	fmt.Println(string(body))
}

```

{% endtab %}

{% tab title="Curl" %}

```javascript
# CALL THE BELOW FUNCTION WITH ASYNC
curl -X POST https://api.panora.exchange/limit/v1/createOrder \
  -H "x-api-key: Your API key" \
  -H "Content-Type: application/json" \
  -d '{
    "chainId": "1",
    "fromTokenAddress": "0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b",
    "fromTokenAmount": "0.25",
    "toWalletAddress": "0xe98d018a6958a6d1cde384aa69a746259df98488970c49fc5f46d10c5229ee56",
    "toTokenAddress": "0xa",
    "slippagePercentage": "1",
    "platformId": "500",
    "rateToTokenPerFromToken": "0.214468496",
    "expiry": {
      "timePeriod": "week",
      "value": "1"
    },
    "integratorFeePercentage": "0"
}'

```

{% endtab %}
{% endtabs %}

## 2. Cancel a Limit Order

<mark style="color:green;">`POST`</mark> `https://api.panora.exchange/limit/v1/cancelOrder`

### Request Body

| Parameter       | Required | Type   | Description                                                            |
| --------------- | -------- | ------ | ---------------------------------------------------------------------- |
| chainId         | no       | string | ID for the chain for which the endpoint is being invoked.              |
| toWalletAddress | no       | string | Address of the wallet associated with the transaction to be cancelled. |
| panoraTxId      | yes      | string | The Panora transaction ID of the order that needs to be cancelled.     |

### Request Example

{% tabs %}
{% tab title="Javascript" %}

```javascript
// CALL THE BELOW FUNCTION WITH ASYNC
const end_point = 'https://api.panora.exchange/limit/v1/cancelOrder';

const requestBody = {
    "chainId": "1",
    "toWalletAddress": "0xe98d018a6958a6d1cde384aa69a746259df98488970c49fc5f46d10c5229ee56",
    "panoraTxId": "0xd88d69a35bac183dd91e5a836e0fd0182127c557045db052fb6565dc5d98b962",
};

const headers = {
    "x-api-key": "Your API key",
    "Content-Type": "application/json"
};

const url = `${end_point}`;

const response = await (
    await fetch(url, {
        method: 'POST',
        headers: headers,
        body: JSON.stringify(requestBody)
    })
).json();

console.log(response);

```

{% endtab %}

{% tab title="Python" %}

```python
# CALL THE BELOW FUNCTION WITH ASYNC
import requests
import json

end_point = 'https://api.panora.exchange/limit/v1/cancelOrder'

request_body = {
    "chainId": "1",
    "toWalletAddress": "0xe98d018a6958a6d1cde384aa69a746259df98488970c49fc5f46d10c5229ee56",
    "panoraTxId": "0xd88d69a35bac183dd91e5a836e0fd0182127c557045db052fb6565dc5d98b962"
}

headers = {
    "x-api-key": "Your API key",
    "Content-Type": "application/json"
}

response = requests.post(end_point, headers=headers, data=json.dumps(request_body))
print(response.json())

```

{% endtab %}

{% tab title="Go" %}

```go
// CALL THE BELOW FUNCTION WITH ASYNC
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	endpoint := "https://api.panora.exchange/limit/v1/cancelOrder"

	requestBody := map[string]interface{}{
		"chainId":         "1",
		"toWalletAddress": "0xe98d018a6958a6d1cde384aa69a746259df98488970c49fc5f46d10c5229ee56",
		"panoraTxId":      "0xd88d69a35bac183dd91e5a836e0fd0182127c557045db052fb6565dc5d98b962",
	}

	payload, err := json.Marshal(requestBody)
	if err != nil {
		panic(err)
	}

	req, err := http.NewRequest("POST", endpoint, bytes.NewBuffer(payload))
	if err != nil {
		panic(err)
	}

	req.Header.Set("x-api-key", "Your API key")
	req.Header.Set("Content-Type", "application/json")

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	body, _ := ioutil.ReadAll(resp.Body)
	fmt.Println(string(body))
}

```

{% endtab %}

{% tab title="Curl" %}

```
# CALL THE BELOW FUNCTION WITH ASYNC
curl -X POST https://api.panora.exchange/limit/v1/cancelOrder \
  -H "x-api-key: Your API key" \
  -H "Content-Type: application/json" \
  -d '{
    "chainId": "1",
    "toWalletAddress": "0xe98d018a6958a6d1cde384aa69a746259df98488970c49fc5f46d10c5229ee56",
    "panoraTxId": "0xd88d69a35bac183dd91e5a836e0fd0182127c557045db052fb6565dc5d98b962"
}'

```

{% endtab %}
{% endtabs %}

## 3. Get Limit Orders

<mark style="color:green;">`POST`</mark> `https://api.panora.exchange/limit/v1/getOrders`

| Parameter       | Type | Required                | Description                                                   |
| --------------- | ---- | ----------------------- | ------------------------------------------------------------- |
| chainId         | no   | number                  | ID for the chain for which the endpoint is being invoked.     |
| toWalletAddress | no   | string                  | Address of the wallet associated with the transaction(s).     |
| panoraTxId      | no   | string                  | The Panora transaction ID of the order to retrieve.           |
| status          | no   | "active" \| "completed" | Filter orders by status (`"active"` or `"completed"`).        |
| txDetails       | no   | boolean                 | Whether to include detailed transaction data (true or false). |
| limit           | no   | number                  | Maximum number of results to return in a single page.         |
| pageNumber      | no   | number                  | Current page number                                           |

### Request Example

{% tabs %}
{% tab title="Javascript" %}

```javascript
// CALL THE BELOW FUNCTION WITH ASYNC
const end_point = 'https://api.panora.exchange/limit/v1/getOrders';

const queryParams = {
    chainId: 1,
    limit: 5,
    pageNumber: 1,
    status: "active",
    toWalletAddress: "0xe98d018a6958a6d1cde384aa69a746259df98488970c49fc5f46d10c5229ee56",
    txDetails: true
};

const queryString = new URLSearchParams(queryParams).toString();
const url = `${end_point}?${queryString}`;

const headers = {
    "x-api-key": "Your API key"
};

const response = await (
    await fetch(url, {
        method: 'GET',
        headers: headers
    })
).json();

console.log(response);

```

{% endtab %}

{% tab title="Python" %}

```python
# CALL THE BELOW FUNCTION WITH ASYNC
import requests

end_point = 'https://api.panora.exchange/limit/v1/getOrders'

params = {
    "chainId": 1,
    "limit": 5,
    "page_number": 1,
    "status": "active",
    "toWalletAddress": "0xe98d018a6958a6d1cde384aa69a746259df98488970c49fc5f46d10c5229ee56",
    "txDetails": True
}

headers = {
    "x-api-key": "Your API key"
}

response = requests.get(end_point, headers=headers, params=params)
print(response.json())

```

{% endtab %}

{% tab title="Go" %}

```go
// CALL THE BELOW FUNCTION WITH ASYNC
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"net/url"
)

func main() {
	baseURL := "https://api.panora.exchange/limit/v1/getOrders"

	params := url.Values{}
	params.Add("chainId", "1")
	params.Add("limit", "5")
	params.Add("page_number", "1")
	params.Add("status", "active")
	params.Add("toWalletAddress", "0xe98d018a6958a6d1cde384aa69a746259df98488970c49fc5f46d10c5229ee56")
	params.Add("txDetails", "true")

	reqURL := fmt.Sprintf("%s?%s", baseURL, params.Encode())

	req, err := http.NewRequest("GET", reqURL, nil)
	if err != nil {
		panic(err)
	}

	req.Header.Set("x-api-key", "Your API key")

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	body, _ := ioutil.ReadAll(resp.Body)
	fmt.Println(string(body))
}

```

{% endtab %}

{% tab title="Curl" %}

```
# CALL THE BELOW FUNCTION WITH ASYNC
curl -X GET "https://api.panora.exchange/limit/v1/getOrders?chainId=1&limit=5&page_number=1&status=active&toWalletAddress=0xe98d018a6958a6d1cde384aa69a746259df98488970c49fc5f46d10c5229ee56&txDetails=true" \
  -H "x-api-key: Your API key"

```

{% endtab %}
{% endtabs %}

### 📦 `LimitOrdersResponse` (Object)

| Field             | Type   | Description                                               |
| ----------------- | ------ | --------------------------------------------------------- |
| `chainId`         | number | ID for the chain for which the endpoint is being invoked. |
| `toWalletAddress` | string | Wallet address for which the limit orders were queried    |
| `pageNumber`      | number | Current page number                                       |
| `totalPages`      | number | Total number of pages available                           |
| `orders`          | array  | List of limit order objects (see below for structure)     |

`orders[]` (Order Object)

| Field                         | Type   | Description                                                                                                 |
| ----------------------------- | ------ | ----------------------------------------------------------------------------------------------------------- |
| `panoraTxId`                  | string | Unique Panora transaction ID of the limit order                                                             |
| `fromToken`                   | Token  | Token being sold                                                                                            |
| `toToken`                     | Token  | Token being bought                                                                                          |
| `feeToken`                    | Token  | Token used for fees                                                                                         |
| `createdAtTime`               | string | ISO timestamp when the order was created                                                                    |
| `status`                      | string | Status of the order: `"active"`, `"partially_filled"`, `"filled"`, `"cancelled"`, `"refunded"`, `"expired"` |
| `expireAtTime`                | string | ISO timestamp for when the order expires                                                                    |
| `fromTokenAmount`             | string | Total amount of `fromToken` specified for the order                                                         |
| `rateToTokenPerFromToken`     | string | Exchange rate (toToken per fromToken)                                                                       |
| `fromTokenAmountSpent`        | string | Amount of `fromToken` already spent                                                                         |
| `fromTokenAmountBalance`      | string | Remaining `fromToken` amount left in the order                                                              |
| `fromTokenAmountWithdrawn`    | string | Amount withdrawn from the order manually                                                                    |
| `toTokenAmountWithdrawn`      | string | Amount of `toToken` received from completed portions                                                        |
| `numberOfOrdersCompleted`     | number | Total number of fills completed on this order                                                               |
| `avgPriceFromTokenPerToToken` | string | Average fill price (fromToken per toToken)                                                                  |
| `avgPriceToTokenPerFromToken` | string | Average fill price (toToken per fromToken)                                                                  |
| `slippagePercentage`          | string | Slippage tolerance percentage applied to the order                                                          |
| `txDetails` (optional)        | array  | List of transaction events (see below)                                                                      |

txDetails\[] (Optional Transaction Data)

| Field                                 | Type   | Description                                                               |
| ------------------------------------- | ------ | ------------------------------------------------------------------------- |
| `txId`                                | string | Transaction ID                                                            |
| `txNumber`                            | number | Order event sequence number                                               |
| `type`                                | string | One of: `"created"`, `"filled"`, `"attempted"`, `"failed"`, `"cancelled"` |
| `attemptNumber`                       | number | Attempt number for execution                                              |
| `fromTokenAmount`                     | string | Amount attempted in this transaction                                      |
| `fromTokenAmountUSD`                  | string | USD equivalent of `fromTokenAmount`                                       |
| `toTokenAmount`                       | string | Amount of token received in this attempt                                  |
| `toTokenAmountUSD`                    | string | USD equivalent of `toTokenAmount`                                         |
| `feeTokenAmount`                      | string | Fee charged in this attempt                                               |
| `feeTokenAmountUSD`                   | string | USD equivalent of the fee                                                 |
| `time`                                | string | ISO timestamp of this event                                               |
| `priceFromTokenPerToToken` (optional) | string | Actual rate in this tx                                                    |
| `priceToTokenPerFromToken` (optional) | string | Actual reverse rate                                                       |
| `keeperWalletAddress` (optional)      | string | Executor wallet that processed the tx                                     |

Token Object

The `Token` object is a standard representation of a token:

| Field      | Type   | Description                          |
| ---------- | ------ | ------------------------------------ |
| `address`  | string | Token contract address               |
| `symbol`   | string | Symbol of the token (e.g. ETH, USDC) |
| `decimals` | number | Number of decimals used by the token |
| `name`     | string | Human-readable name of the token     |


# DCA

Explore authentication, endpoints, and trading operations to start trading efficiently. Whether you're a developer or a trader, this guide has everything you need to get started with Panora's APIs.

## 1. Create a DCA Order

<mark style="color:green;">`POST`</mark> `https://api.panora.exchange/dca/v1/createOrder`

### Headers

* **Public API Key**:

  ```
  a4^KV_EaTf4MW#ZdvgGKX#HUD^3IFEAOV_kzpIE^3BQGA8pDnrkT7JcIy#HNlLGi
  ```

  ***Note:** This API key's limits should be sufficient for most use cases. Protocols within the Aptos ecosystem with specific requirements or customization may submit a ticket on Discord.*&#x20;

| Name      | Value        | Description                                                    |
| --------- | ------------ | -------------------------------------------------------------- |
| x-api-key | Your API Key | Use the public API key or enter the API key provided by Panora |

### Request Body

| Parameter                    | Required | Type                                                       | Description                                                             |
| ---------------------------- | -------- | ---------------------------------------------------------- | ----------------------------------------------------------------------- |
| `chainId`                    | yes      | `string`                                                   | ID for the chain for which the endpoint is being invoked.               |
| `toWalletAddress`            | yes      | `0x${string}`                                              | Address of the wallet to receive the purchased tokens.                  |
| `fromTokenAddress`           | yes      | `0x${string}`                                              | Address of the token you're selling.                                    |
| `toTokenAddress`             | yes      | `0x${string}`                                              | Address of the token you're buying.                                     |
| `fromTokenAmount.value`      | yes      | `string`                                                   | Amount of tokens to sell (either total or per order).                   |
| `fromTokenAmount.type`       | yes      | `"total"` \| `"perorder"`                                  | Whether the amount is total for the entire DCA or per individual order. |
| `interval.value`             | yes      | `string`                                                   | Value of the time interval between each order.                          |
| `interval.timePeriod`        | yes      | `"minute"` \| `"hour"` \| `"day"` \| `"week"` \| `"month"` | Unit of time for the interval.                                          |
| `numberOfOrders`             | yes      | `number`                                                   | Total number of orders to execute over time.                            |
| `minRateToTokenPerFromToken` | no       | `string`                                                   | Minimum acceptable exchange rate (toToken per fromToken).               |
| `maxRateToTokenPerFromToken` | no       | `string`                                                   | Maximum acceptable exchange rate (toToken per fromToken).               |
| `delay.value`                | no       | `string`                                                   | Value for delay before the first order starts.                          |
| `delay.timePeriod`           | no       | `"minute"` \| `"hour"` \| `"day"` \| `"week"` \| `"month"` | Unit of time for the delay.                                             |
| `slippagePercentage`         | no       | `string`                                                   | Slippage tolerance percentage allowed for each order.                   |

### Request Example

{% tabs %}
{% tab title="Javascript" %}

```javascript
// CALL THE BELOW FUNCTION WITH ASYNC
const end_point = 'https://api.panora.exchange/dca/v1/createOrder';

const requestBody = {
    chainId: 1,
    limit: 5,
    pageNumber: 1,
    status: "active",
    toWalletAddress: "0xe98d018a6958a6d1cde384aa69a746259df98488970c49fc5f46d10c5229ee56",
    txDetails: true
};

const headers = {
    "x-api-key": "Your API key",
    "Content-Type": "application/json"
};

const url = `${end_point}`;

const response = await (
    await fetch(url, {
        method: 'POST',
        headers: headers,
        body: JSON.stringify(requestBody)
    })
).json();

console.log(response);

```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = 'https://api.panora.exchange/dca/v1/createOrder'

headers = {
    'x-api-key': 'Your API key',
    'Content-Type': 'application/json'
}

payload = {
    "chainId": 1,
    "limit": 5,
    "page_number": 1,
    "status": "active",
    "toWalletAddress": "0xe98d018a6958a6d1cde384aa69a746259df98488970c49fc5f46d10c5229ee56",
    "txDetails": True
}

response = requests.post(url, json=payload, headers=headers)
print(response.json())

```

{% endtab %}

{% tab title="Go" %}

```go
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"net/http"
)

func main() {
	url := "https://api.panora.exchange/dca/v1/createOrder"

	payload := map[string]interface{}{
		"chainId":         1,
		"limit":           5,
		"page_number":     1,
		"status":          "active",
		"toWalletAddress": "0xe98d018a6958a6d1cde384aa69a746259df98488970c49fc5f46d10c5229ee56",
		"txDetails":       true,
	}

	jsonData, _ := json.Marshal(payload)

	req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
	req.Header.Set("x-api-key", "Your API key")
	req.Header.Set("Content-Type", "application/json")

	client := &http.Client{}
	resp, _ := client.Do(req)
	defer resp.Body.Close()

	var result map[string]interface{}
	json.NewDecoder(resp.Body).Decode(&result)
	fmt.Println(result)
}

```

{% endtab %}

{% tab title="Curl" %}

```
curl -X POST https://api.panora.exchange/dca/v1/createOrder \
  -H "x-api-key: Your API key" \
  -H "Content-Type: application/json" \
  -d '{
    "chainId": 1,
    "limit": 5,
    "page_number": 1,
    "status": "active",
    "toWalletAddress": "0xe98d018a6958a6d1cde384aa69a746259df98488970c49fc5f46d10c5229ee56",
    "txDetails": true
  }'

```

{% endtab %}
{% endtabs %}

## 2. Cancel a DCA Order

<mark style="color:green;">`POST`</mark> `https://api.panora.exchange/dca/v1/cancelOrder`

### Request Body

| Parameter         | Required | Type   | Description                                                            |
| ----------------- | -------- | ------ | ---------------------------------------------------------------------- |
| `chainId`         | no       | string | ID for the chain for which the endpoint is being invoked.              |
| `toWalletAddress` | no       | string | Address of the wallet associated with the transaction to be cancelled. |
| `panoraTxId`      | yes      | string | The Panora transaction ID of the order that needs to be cancelled.     |

### Request Example

{% tabs %}
{% tab title="Javascript" %}

```javascript
// CALL THE BELOW FUNCTION WITH ASYNC
const end_point = 'https://api.panora.exchange/dca/v1/cancelOrder';

const requestBody = {
    "chainId": "1",
    "toWalletAddress": "0xe98d018a6958a6d1cde384aa69a746259df98488970c49fc5f46d10c5229ee56",
    "panoraTxId": "0xc88d69a35bac183dd91e5a836e0fd0182127c557045db052fb6565dc5d98b962",
};

const headers = {
    "x-api-key": "Your API key",
    "Content-Type": "application/json"
};

const url = `${end_point}`;

const response = await (
    await fetch(url, {
        method: 'POST',
        headers: headers,
        body: JSON.stringify(requestBody)
    })
).json();

console.log(response);

```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = 'https://api.panora.exchange/dca/v1/cancelOrder'
headers = {
    'x-api-key': 'Your API key',
    'Content-Type': 'application/json'
}
payload = {
    "chainId": "1",
    "toWalletAddress": "0xe98d018a6958a6d1cde384aa69a746259df98488970c49fc5f46d10c5229ee56",
    "panoraTxId": "0xc88d69a35bac183dd91e5a836e0fd0182127c557045db052fb6565dc5d98b962"
}

response = requests.post(url, headers=headers, json=payload)
print(response.json())

```

{% endtab %}

{% tab title="Go" %}

```go
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"net/http"
)

func main() {
	url := "https://api.panora.exchange/dca/v1/cancelOrder"

	payload := map[string]string{
		"chainId":        "1",
		"toWalletAddress": "0xe98d018a6958a6d1cde384aa69a746259df98488970c49fc5f46d10c5229ee56",
		"panoraTxId":      "0xc88d69a35bac183dd91e5a836e0fd0182127c557045db052fb6565dc5d98b962",
	}

	jsonData, err := json.Marshal(payload)
	if err != nil {
		panic(err)
	}

	req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
	if err != nil {
		panic(err)
	}
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("x-api-key", "Your API key")

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	var result map[string]interface{}
	json.NewDecoder(resp.Body).Decode(&result)
	fmt.Println(result)
}

```

{% endtab %}

{% tab title="Curl" %}

```
curl -X POST https://api.panora.exchange/dca/v1/cancelOrder \
  -H "Content-Type: application/json" \
  -H "x-api-key: Your API key" \
  -d '{
    "chainId": "1",
    "toWalletAddress": "0xe98d018a6958a6d1cde384aa69a746259df98488970c49fc5f46d10c5229ee56",
    "panoraTxId": "0xc88d69a35bac183dd91e5a836e0fd0182127c557045db052fb6565dc5d98b962"
}'

```

{% endtab %}
{% endtabs %}

## 3. Get DCA Orders

<mark style="color:green;">`POST`</mark> `https://api.panora.exchange/dca/v1/getOrders`

| Parameter         | Required | Type                        | Description                                               |
| ----------------- | -------- | --------------------------- | --------------------------------------------------------- |
| `chainId`         | Yes      | number                      | ID for the chain for which the endpoint is being invoked. |
| `toWalletAddress` | Yes      | string                      | Wallet address associated with the order.                 |
| `panoraTxId`      | No       | string                      | Specific transaction ID to filter results.                |
| `status`          | Yes      | `"active"` \| `"completed"` | Filter orders by their status.                            |
| `txDetails`       | No       | boolean                     | Whether to include transaction details in the response.   |
| `limit`           | Yes      | number                      | Maximum number of results per page.                       |
| `pageNumber`      | Yes      | number                      | Page number for pagination.                               |

{% tabs %}
{% tab title="Javascript" %}

```javascript
// CALL THE BELOW FUNCTION WITH ASYNC
const end_point = 'https://api.panora.exchange/dca/v1/getOrders';

const queryParams = {
    chainId: 1,
    limit: 5,
    pageNumber: 1,
    status: "active",
    toWalletAddress: "0xe98d018a6958a6d1cde384aa69a746259df98488970c49fc5f46d10c5229ee56",
    txDetails: true
};

const queryString = new URLSearchParams(queryParams).toString();
const url = `${end_point}?${queryString}`;

const headers = {
    "x-api-key": "Your API key"
};

const response = await (
    await fetch(url, {
        method: 'GET',
        headers: headers
    })
).json();

console.log(response);

```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://api.panora.exchange/dca/v1/getOrders"
params = {
    "chainId": 1,
    "limit": 5,
    "page_number": 1,
    "status": "active",
    "toWalletAddress": "0xe98d018a6958a6d1cde384aa69a746259df98488970c49fc5f46d10c5229ee56",
    "txDetails": True
}

headers = {
    "x-api-key": "Your API key"
}

response = requests.get(url, headers=headers, params=params)
print(response.json())

```

{% endtab %}

{% tab title="Go" %}

```go
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"net/url"
)

func main() {
	baseURL := "https://api.panora.exchange/dca/v1/getOrders"

	params := url.Values{}
	params.Add("chainId", "1")
	params.Add("limit", "5")
	params.Add("page_number", "1")
	params.Add("status", "active")
	params.Add("toWalletAddress", "0xe98d018a6958a6d1cde384aa69a746259df98488970c49fc5f46d10c5229ee56")
	params.Add("txDetails", "true")

	reqURL := fmt.Sprintf("%s?%s", baseURL, params.Encode())

	req, err := http.NewRequest("GET", reqURL, nil)
	if err != nil {
		panic(err)
	}
	req.Header.Add("x-api-key", "Your API key")

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	body, _ := ioutil.ReadAll(resp.Body)
	fmt.Println(string(body))
}

```

{% endtab %}

{% tab title="Curl" %}

```
curl -X GET "https://api.panora.exchange/dca/v1/getOrders?chainId=1&limit=5&page_number=1&status=active&toWalletAddress=0xe98d018a6958a6d1cde384aa69a746259df98488970c49fc5f46d10c5229ee56&txDetails=true" \
  -H "x-api-key: Your API key"

```

{% endtab %}
{% endtabs %}

### 📦 DCA`OrdersResponse` (Object)

| Parameter         | Type   | Description                                         |
| ----------------- | ------ | --------------------------------------------------- |
| `chainId`         | number | Chain ID of the DCA order.                          |
| `toWalletAddress` | string | Wallet address associated with the order.           |
| `pageNumber`      | number | Current page in the paginated response.             |
| `totalPages`      | number | Total number of pages available.                    |
| `orders`          | array  | List of DCA orders. Each item is an `Order` object. |

### 📦 orders\[] (Order Object)

| Parameter                     | Type              | Description                                                           |
| ----------------------------- | ----------------- | --------------------------------------------------------------------- |
| `panoraTxId`                  | string            | Unique ID of the Panora transaction.                                  |
| `fromToken`                   | Token             | Token being sold.                                                     |
| `toToken`                     | Token             | Token being bought.                                                   |
| `feeToken`                    | Token             | Token used to pay fees.                                               |
| `fromTokenAmountTotal`        | string            | Total amount of `fromToken` for the DCA.                              |
| `fromTokenAmountSpent`        | string            | Amount of `fromToken` already used.                                   |
| `fromTokenAmountBalance`      | string            | Remaining amount of `fromToken`.                                      |
| `fromTokenAmountWithdrawn`    | string            | Withdrawn amount of `fromToken`.                                      |
| `toTokenAmountWithdrawn`      | string            | Withdrawn amount of `toToken`.                                        |
| `numberOfOrdersTotal`         | number            | Total number of orders.                                               |
| `fromTokenAmountPerOrder`     | string            | Amount per order.                                                     |
| `numberOfOrdersRemaining`     | number            | Number of pending orders.                                             |
| `numberOfOrdersCompleted`     | number            | Number of completed orders.                                           |
| `interval`                    | object            | Object with `value` and `timePeriod` (`"minute"`, `"hour"`, `"day"`). |
| `createdAtTime`               | string            | ISO timestamp when order was created.                                 |
| `nextOrderTime`               | string            | ISO timestamp of the next scheduled order.                            |
| `estimatedCompletionTime`     | string (optional) | When the DCA is expected to complete.                                 |
| `avgPriceFromTokenPerToToken` | string            | Avg. price fromToken/toToken.                                         |
| `avgPriceToTokenPerFromToken` | string            | Avg. price toToken/fromToken.                                         |
| `minRateToTokenPerFromToken`  | string (optional) | Minimum rate (can be `"Infinity"`).                                   |
| `maxRateToTokenPerFromToken`  | string (optional) | Maximum rate (can be `"Infinity"`).                                   |
| `status`                      | string            | `"active"` \| `"filled"` \| `"cancelled"` \| `"refunded"`             |
| `platformId`                  | string            | Platform identifier.                                                  |
| `slippagePercentage`          | string            | Allowed slippage.                                                     |
| `delay`                       | object (optional) | Delay config: `value` + `timePeriod`.                                 |
| `txDetails`                   | array (optional)  | List of transaction details (see below).                              |

### orders\[] (Order Object)

| Parameter                  | Type              | Description                                                               |
| -------------------------- | ----------------- | ------------------------------------------------------------------------- |
| `txId`                     | string            | Unique transaction ID.                                                    |
| `txNumber`                 | number            | Sequential number of transaction.                                         |
| `type`                     | string            | One of `"created"`, `"filled"`, `"attempted"`, `"failed"`, `"cancelled"`. |
| `attemptNumber`            | number            | Attempt count for this order.                                             |
| `fromTokenAmount`          | string            | Amount used from source token.                                            |
| `fromTokenAmountUSD`       | string            | USD value of `fromTokenAmount`.                                           |
| `toTokenAmount`            | string            | Amount of output token received.                                          |
| `toTokenAmountUSD`         | string            | USD value of `toTokenAmount`.                                             |
| `feeTokenAmount`           | string            | Amount paid as fee.                                                       |
| `feeTokenAmountUSD`        | string            | USD value of fee paid.                                                    |
| `time`                     | string            | Time when tx was processed.                                               |
| `priceFromTokenPerToToken` | string (optional) | Execution price (from → to).                                              |
| `priceToTokenPerFromToken` | string (optional) | Execution price (to → from).                                              |


# Token List

The **Panora Token List** is a comprehensive, community-driven collection of tokens. It is designed to provide accurate information and eliminate confusion between similar-looking tokens, providing users with confidence and clarity while trading.

## **Panora Tags**

To enhance token classification and identification, we’ve introduced a field \`**panoraTags\`** in token list response. This field combines categories and labels into a single parameter, providing clearer insights and context about each token's status and characteristics. Here’s what they represent:

**Categories (Tokens are segregated on Panora UI based on their category):**

1. **Native:** Tokens that are native to the chain and issued directly on it (excludes emojicoin and meme)
2. **Emojicoin:** Tokens launched on emojicoin.fun (includes both graduated and non-graduated emojicoins)
3. **Meme:** Tokens primarily driven by community hype, memes, or trends
4. **Bridged:** Tokens that originate from another chain and are bridged for use

**Labels:**

1. **Verified**\
   Tokens with verified logo-to-address mapping to prevent confusion with similar tokens and meet nominal threshold metrics are eligible for Verified label. Verification focuses solely on ensuring accurate identification and does not imply endorsement, financial advice, or guarantee visibility on the Panora UI. \ <br>

   Verification and Visibility: \
   While we do not currently enforce strict verification metrics criteria, we monitor several key metrics to assess a token's label and/or its visibility on the Panora UI. These metrics are subject to changes and include, but are not limited to, liquidity, market cap, daily trading volume, total holder count, % of supply held by the top 10 holders, and stability of these metrics over a period of time.\
   \
   Verification Process:\
   Projects can apply for the Verified label by submitting a Pull Request (PR) on the [Panora Token List ](https://github.com/PanoraExchange/Aptos-Tokens)GitHub repo and posting an attestation tweet from their official X (Twitter) account. See the following page for a detailed step-by-step guide. \
   \
   \&#xNAN;*Note:*&#x20;

   1. *Not all projects may receive Verified status immediately and may remain as Recognized or Unverified after community review. Additionally, Verified label and/or default visibility of any token on Panora UI may be revoked due to factors such as updated verification criteria, community concerns or lack of transparency from the token project's development team, instability or significant drops in key metrics over a period of time. This is solely to protect the community and you are welcome to re-apply and re-tweet once your project gains more traction and community support. Projects within private Aptos Ecosystem Telegram groups or recognized by other Aptos Ecosystem projects and community members are prioritized for faster verification.*&#x20;
   2. *Emojicoins launched on emojicoin.fun are currently not assigned any labels. All graduated emojicoins are automatically set as panoraUI = true.*<br>

2. **Recognized**\
   Tokens that have logo-to-address mapping, but may not be tradable or recognized by the community yet, or have had their verified label revoked. Recognized tokens might also include niche or new tokens that are still in the early stages of establishing community support or demonstrating stability. \ <br>

3. **Unverified**\
   Tokens that have not yet undergone the verification process but meet the minimum nominal liquidity requirements and have unique metadata. These tokens may or may not be recognized by the community and are hidden by default in the Panora UI. Unverified status is common for new or recently launched tokens and users can choose to trade these tokens at their own discretion. \ <br>

4. **Banned**\
   Tokens that are restricted due to confirmed malicious behavior or security risks. It is recommended to avoid trading these assets.\ <br>

5. **InternalFA**\
   Addresses created by certain DEX's before the pairing between Coin and Fungible Asset (FA) standard tokens were established. These may have unique behaviors or limitations.\ <br>

6. **LP (Liquidity Pool)**\
   Tokens that represent liquidity pool shares after adding liquidity in trading pairs, indicating the proportion of assets held within a liquidity pool.<br>

**Important Reminder:** Tokens don’t need to have a Verified or Recognized label to be tradable. All tokens are automatically and instantly available for trading on Panora and all of its integrator partners and can be accessed by using the complete token address.

## **Tokens Visible on Panora UI**

By default, only tokens marked as **panoraUI = true** are displayed on the Panora UI, along with any other tokens held in the user's wallet, ensuring easy access to owned assets. However, all tokens available on-chain are searchable on Panora UI by name, symbol, emoji, or address.

## Accessing the Panora token list

The Panora Token List can be accessed via the Token List [GitHub Repository](https://github.com/PanoraExchange/Aptos-Tokens) or through the public [API endpoint](https://api.panora.exchange/tokenlist)&#x20;

* **Public API Key**:

  ```
  a4^KV_EaTf4MW#ZdvgGKX#HUD^3IFEAOV_kzpIE^3BQGA8pDnrkT7JcIy#HNlLGi
  ```

  ***Note**: This API key's limits should be sufficient for most use cases. For protocols in the Aptos ecosystem, please submit a ticket on Discord to get a dedicated API key.*

**API Usage Example:**&#x20;

<mark style="color:green;">`GET`</mark> `https://api.panora.exchange/tokenlist`

<pre class="language-javascript"><code class="lang-javascript"><strong>const end_point = "https://api.panora.exchange/tokenlist"
</strong>
const query = {
  isInPanoraTokenList: "true",
}

const headers = {
  "x-api-key":
    "a4^KV_EaTf4MW#ZdvgGKX#HUD^3IFEAOV_kzpIE^3BQGA8pDnrkT7JcIy#HNlLGi",
}

const queryString = new URLSearchParams(query)
const url = `${end_point}?${queryString}`

const response = await(
  await fetch(url, {
    method: "GET",
    headers: headers,
  })
).json()
</code></pre>

Query Parameters

* **chainId** *(string, optional)*: The chain ID associated with the token (Default: 1 for Aptos Mainnet).
* **tokenAddress** *(string, optional)*: Comma-separated list of coin (legacy) and/or FA addresses. The API returns the details for the specified tokens. If not provided, the query will return details of all tokens marked as panoraUI = true.
* **panoraUI** *(boolean, optional)*: If set to true, only tokens that are visible on the Panora UI are returned. Set as true, false to get all tokens in the list. Default is true.
* **panoraTags** *(string, optional)*: Returns tokens based on their associated tags. All available tags are listed under the **'Panora Tags'** section at the start of this page.

#### Aptos Token List Response

The response object contains the following fields:

* **chainId:** The chain ID associated with the token (Default: 1 for Aptos Mainnet)
* **panoraId**: A unique id given to all tokens by Panora
* **tokenAddress:** The complete address of the token as per the Aptos Coin Standard (Legacy)
* **faAddress:** The complete address of the token as per the Aptos Fungible Asset (FA) Standard
* **name:** The on-chain registered name of the token
* **symbol:** The on-chain registered symbol of the token
* **decimals:** The number of decimal places of the token
* **bridge:** The bridge associated with the token, if applicable (optional)
* **panoraSymbol:** Similar to symbol, but with prefixes based on the bridge: `lz` for LayerZero, `wh` for Wormhole, and `ce` for Celer
* **usdPrice**: The latest usd price of the token
* **priceChange24H**: The percentage change in price over 24 hours
* **logoUrl:** The URL for the token’s logo(optional)
* **websiteUrl:** The official website URL of the token (optional)
* **panoraUI:** When set to true, displays the token name and logo on the Panora interface.
* **panoraTags:** Lists the tags associated with the token.
* **panoraIndex:** The default sorting order of tokens within the Panora UI
* **coinGeckoId:** The CoinGecko ID of the token (optional)
* **coinMarketCapId:** The CoinMarketCap ID of the token (optional)

Example Response:

```json
   {
            "chainId": 1,
            "panoraId": "a1-vqom8-USDC",
            "tokenAddress": null,
            "faAddress": "0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b",
            "name": "USDC",
            "symbol": "USDC",
            "decimals": 6,
            "bridge": null,
            "panoraSymbol": "USDC",
            "usdPrice": "0.99995004",
            "priceChange24H": "0.00297234",
            "logoUrl": "https://assets.panora.exchange/tokens/aptos/USDC.svg",
            "websiteUrl": "https://circle.com/usdc",
            "panoraUI": true,
            "panoraTags": [
                "Native",
                "Verified"
            ],
            "panoraIndex": 4,
            "coinGeckoId": "usd-coin",
            "coinMarketCapId": 3408,        
            "isInPanoraTokenList": true, //Do not use. This field will get deprecated.
            "isBanned": false //Do not use. This field will get deprecated.
   }
```

## Attribution

Kindly include proper attribution when using the API in projects or presentations. Mention *“Powered by Panora”* wherever applicable.

## Feedback&#x20;

The Panora Token List is continuously evolving, and we welcome feedback and suggestions from users, community members, and protocols to help refine and enhance it for the entire ecosystem. We may add any requirements and remove some over time, based on the learnings and feedback from the community. If you have any suggestions, then reach out to us!!

<br>


# How to Add Your Token to the Panora Token List

Follow these steps to get your token verified and visible on Panora frontend, Aptos Explorer, Petra Wallet and all of Panora's integrator partners:

1. **Fork the Repository**\
   Start by forking the Panora [Aptos-Tokens GitHub repo](https://github.com/PanoraExchange/Aptos-Tokens).\ <br>
2. **Add Token Icon**\
   In your forked repository, upload the token’s icon file (token\_symbol.svg) to the [logos](https://github.com/PanoraExchange/Aptos-Tokens/tree/main/logos) folder. Ensure it's \~100x100 pixels in .png format and has a unique symbol not used by any existing token.\ <br>
3. **Add Token Information**\
   At the end of the submit-token-request.ts file, add a SubmitTokenRequestInfo object with the following details:<br>

   **SubmitTokenRequestInfo**

   * **chainId:** The chain ID to which the token belongs (default is 1 for Mainnet)
   * **tokenAddress:** The complete address of the token as per the Aptos Coin Standard (Legacy)
   * **faAddress:** The complete address of the token as per the Aptos Fungible Asset (FA) Standard
   * **name:** The on-chain registered name of the token
   * **symbol:** The on-chain registered symbol of the token
   * **decimals:** The number of decimal places of the token
   * **logoUrl:** The URL of the token’s logo (add it to the [logos](https://github.com/PanoraExchange/Aptos-Tokens/tree/main/logos) folder first to get the correct URL)
   * **websiteUrl:** The official website URL of the token (optional but recommended)
   * **coinGeckoId:** The CoinGecko ID of the token (optional)
   * **coinMarketCapId:** The CoinMarketCap ID of the token (optional)

   **Example:**&#x20;

```json
  {
    "chainId": 1,
    "tokenAddress": "0x1::aptos_coin::AptosCoin",
    "faAddress": "0xa",
    "name": "Aptos Coin",
    "symbol": "APT",
    "decimals": 8,
    "logoUrl": "https://raw.githubusercontent.com/PanoraExchange/Aptos-Tokens/main/logos/APT.svg",
    "websiteUrl": "https://aptosfoundation.org",
    "coinGeckoId": "aptos",
    "coinMarketCapId": 21794,
  }
```

4. **Commit Changes**\
   Save and commit your changes with a clear and descriptive message explaining the modifications.\ <br>
5. **Create a Pull Request**\
   Navigate to your forked repository, open a pull request, and submit it for review. Make sure to select the base repository as [Aptos-Tokens](https://github.com/PanoraExchange/Aptos-Tokens/tree/main) and branch as [main](https://github.com/PanoraExchange/Aptos-Tokens/tree/main) for merging your changes.\ <br>
6. **Attestation tweet** \
   Post an attestation tweet from your official X (Twitter) account to complete the verification steps. Be sure to tag **@PanoraExchange** in your tweet to notify both your community and Panora of your request.&#x20;

\
**Important Reminder:** Tokens don’t need to have a Verified or Recognized label to be tradable. All tokens are automatically and instantly available for trading on Panora and all of its integrator partners and can be accessed by using the complete token address.


# Token Prices

The **Panora Price API** provides real-time price data for tokens on the **Aptos** chain, making it easy for developers to integrate accurate pricing information into their dApps.

### Key Features

* **Real-Time Price Feeds:** Get up-to-date token prices for accurate trading and analysis.
* **Wide Token Coverage:** Supports all tokens tradable on the Aptos mainnet network.

### Accessing the Token Prices

The Token Prices can be accessed through the public [API endpoint](https://api.panora.exchange/prices)

* **Public API Key**:

  ```
  a4^KV_EaTf4MW#ZdvgGKX#HUD^3IFEAOV_kzpIE^3BQGA8pDnrkT7JcIy#HNlLGi
  ```

  ***Note:** This API key's limits should be sufficient for most use cases. Protocols within the Aptos ecosystem with specific requirements or customization may submit a ticket on Discord.*&#x20;

**API Usage Example:**

<mark style="color:green;">`GET`</mark> `https://api.panora.exchange/prices`

```javascript
const end_point = "https://api.panora.exchange/prices"

const query = {
  tokenAddress: "0xa",
}

const headers = {
  "x-api-key":
    "a4^KV_EaTf4MW#ZdvgGKX#HUD^3IFEAOV_kzpIE^3BQGA8pDnrkT7JcIy#HNlLGi",
}

const queryString = new URLSearchParams(query)
const url = `${end_point}?${queryString}`

const response = await(
  await fetch(url, {
    method: "GET",
    headers: headers,
  })
).json()
```

#### Query **Parameter**

* **chainId** *(string, optional)*: The chain ID associated with the token (Default: 1 for Aptos Mainnet).
* **tokenAddress** *(string, optional)*: Comma-separated list of coin (legacy) and / or FA addresses. The API returns the price information for the specified tokens. If not provided, the query will return prices of all tokens having liquidity above a nominal threshold.
* **panoraUI** *(boolean, optional)*: If set to true, only tokens that are visible on the Panora UI are returned. Set as true, false to get prices for all available tokens. Default is true.
* **panoraTags** *(string, optional)*: Returns tokens based on their associated tags. All available tags are listed under the **'Panora Tags'** section at the start of Token List page.

**Token Price Response**

The response object contains the following fields:

* **chainId:** The chain ID associated with the token (Default: 1 for Aptos Mainnet)
* **panoraId**: A unique id given to all tokens by Panora
* **tokenAddress:** The complete address of the token as per the Aptos Coin Standard (Legacy)
* **faAddress:** The complete address of the token as per the Aptos Fungible Asset (FA) Standard
* **name:** The on-chain registered name of the token
* **symbol:** The on-chain registered symbol of the token
* **decimals:** The number of decimal places of the token
* **panoraSymbol:** Similar to symbol, but with prefixes based on the bridge: `lz` for LayerZero, `wh` for Wormhole, and `ce` for Celer
* **usdPrice:** The latest usd price of the token
* **nativePrice:** The latest price of the token relative to the native token
* **priceChange24H:** The percentage change in price over 24 hours
* **panoraUI:** When set to true, displays the token name and logo on the Panora interface.
* **panoraTags:** Lists the tags associated with the token.

**Example Response**

```json
{
        "chainId": 1,
        "panoraId": "a1-hexao-APT",
        "tokenAddress": "0x1::aptos_coin::AptosCoin",
        "faAddress": "0xa",
        "name": "Aptos Coin",
        "symbol": "APT",
        "decimals": 8,
        "panoraSymbol": "APT",
        "usdPrice": "1.84326943",
        "nativePrice": "1",
        "priceChange24H": "-9.71414232",
        "panoraUI": true,
        "panoraTags": [
            "Native",
            "Verified"
        ]
    }
```

### **Attribution**

Kindly include proper attribution when using the API in projects or presentations. Mention *“Powered by Panora”* wherever applicable.


# API\_OLD

Explore authentication, endpoints, and trading operations to start trading efficiently. Whether you're a developer or a trader, this guide has everything you need to get started with Panora's APIs.

## 1. Get transaction details for the swap

<mark style="color:green;">`POST`</mark> `https://api.panora.exchange/swap`

***

### Headers

* **Public API Key**:

  ```
  a4^KV_EaTf4MW#ZdvgGKX#HUD^3IFEAOV_kzpIE^3BQGA8pDnrkT7JcIy#HNlLGi
  ```

  ***Note:** This API key's limits should be sufficient for most use cases. Protocols within the Aptos ecosystem with specific requirements or customization may submit a ticket on Discord.*&#x20;

<table><thead><tr><th width="123">Name</th><th width="135">Value</th><th>Description</th></tr></thead><tbody><tr><td>x-api-key</td><td>Your API Key</td><td>Use the public API key or enter the API key provided by Panora</td></tr></tbody></table>

### Query Parameters

{% hint style="info" %}
**Note**: Panora's APIs supports the following.

1. **ExactIn Swap:** When fromTokenAmount is entered, the endpoint returns the maximum  toTokenAmount that will be received. Example: If the fromToken is APT, fromTokenAmount is 10.5 and toToken is USDC, then the toTokenAmount response is the maximum USDC a user would receive for swapping from 10.5 APT.
2. **ExactOut Swap:** When toTokenAmount is entered, the endpoint returns the minimum fromTokenAmount that has to be paid. Example: If the toToken is USDC, toTokenAmount is 100 and fromToken is APT, then the fromTokenAmount response is the minimum APT a user would pay for swapping to 100 USDC.
   {% endhint %}

<table><thead><tr><th width="194">Parameter</th><th width="120.00006103515625">Required</th><th width="90">Type</th><th>Description</th></tr></thead><tbody><tr><td>chainId</td><td>no</td><td>number</td><td><p>ID for the chain for which the endpoint is being invoked. <br></p><p>Note: Default chainID is 1 for Aptos Mainnet</p></td></tr><tr><td>fromTokenAddress</td><td>yes</td><td>string</td><td>Address of the token being swapped from<br><br>Example: If you want to swap 10.5 APT to USDC, then fromTokenAddress is <code>0xa</code></td></tr><tr><td>toTokenAddress</td><td>yes</td><td>string</td><td>Address of the token being swapped to<br><br>Example: If you want to swap 10.5 APT to USDC, then toTokenAddress is <code>0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b</code></td></tr><tr><td>fromTokenAmount</td><td><a data-footnote-ref href="#user-content-fn-1">yes</a><mark style="color:red;">*</mark></td><td>number</td><td>Amount of the token being swapped from. Please set the amount without Token decimals<br><br>Example: If you want to swap 10.5 APT to USDC, then fromTokenAmount is 10.5</td></tr><tr><td>toTokenAmount</td><td>yes<mark style="color:red;">*</mark></td><td>number</td><td><p>Amount of the token being swapped to. Please set the amount without Token decimals </p><p></p><p>Example: If you want to swap from APT to 100 USDC, then toTokenAmount is 100</p></td></tr><tr><td>toWalletAddress</td><td>yes</td><td>string</td><td>Address of the wallet to which the swapped tokens will be sent</td></tr><tr><td>slippagePercentage</td><td>no</td><td>number</td><td><p>Slippage tolerance as 'auto' (which lets Panora choose the optimal slippage for the transaction, up to a maximum of 5%) or a percentage value.<br><br>Example: For 3% slippage tolerance, set the value as 3. This can be set as 0.1, 0.5, 1.0 or any custom slippage percentage between 0 and 100.</p><p><br>Note: If nothing is entered, slippage tolerance will be set to auto by default. If a numeric value is entered, anything after two decimal places will be truncated.</p></td></tr><tr><td>integratorFeePercentage</td><td>no</td><td>number</td><td><p>Integrator fee as a percentage value<br><br>Example: For 2% integrator fee, set the value as 2. This can be set as 0.1, 0.5, 1.0 or any custom integrator fee between 0 and 2.</p><p><br>Note: Fee sharing applicable. If nothing is entered, integrator fee will be set to 0 by default. If a numeric value is entered, anything after two decimal places will be truncated.</p></td></tr><tr><td>integratorFeeAddress</td><td>no</td><td>string</td><td><p>Wallet Address where integrators want to receive their fee share. </p><p></p><p>Note: Ensure it starts with 0x followed by 64 characters</p></td></tr><tr><td>includeSources</td><td>no</td><td>string</td><td><p>List of liquidity sources to be included for route calculation. </p><p></p><p>Example: Hyperion, ThalaSwapV2</p><p></p><p>Note: If nothing is entered, all available sources are included by default. Check entire list <a href="https://docs.panora.exchange/developer/swap/sources">here</a>.</p></td></tr><tr><td>excludeSources</td><td>no</td><td>string</td><td><p>List of liquidity sources to be excluded from the route. </p><p></p><p>Example: SushiSwap</p><p></p><p>Note: If nothing is entered, none of the sources will be excluded by default. Check entire list <a href="https://docs.panora.exchange/developer/swap/sources">here</a>.</p></td></tr><tr><td>includePools</td><td>no</td><td>string</td><td><p>List of pool addresses to be included for route calculation. </p><p></p><p>Example: 0xd3894aca06d5f42b27c89e6f448114b3ed6a1ba07f992a58b2126c71dd83c127, 0xc3c4cbb3efcd3ec1b6679dc0ed45851486920dba0e86e612e80a79041a6cf1a3</p><p></p><p>Note: If nothing is entered, all available pools are included by default. Max 10 pool addresses are supported. Coin standard DEX pools with comma ( , ) within the pool address would get skipped</p></td></tr><tr><td>onlyDirectRoutes</td><td>no</td><td>boolean</td><td>Set to true to restrict to direct routes without intermediate hops or splits.<br>Default is false.</td></tr></tbody></table>

{% hint style="warning" %} <mark style="color:red;">\*</mark>Please send either fromTokenAmount or toTokenAmount at a time.
{% endhint %}

### Request Example

{% tabs %}
{% tab title="Javascript" %}

```javascript
//CALL THE BELOW FUNCTION WITH THE ASYNC
const end_point = 'https://api.panora.exchange/swap'
const query = {
    fromTokenAddress:"0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b"
    toTokenAddress:"0xa"
    fromTokenAmount:100
    toWalletAddress:"0x1c3206329806286fd2223647c9f9b130e66baeb6d7224a18c1f642ffe48f3b4c"
};

const headers = {
    "x-api-key": "Your API key"
};

const queryString = new URLSearchParams(query).toString();
const url = `${end_point}?${queryString}`;

const response = await (
    await fetch(url, {
        method: 'POST',
        headers: headers
    })
).json();
```

{% endtab %}

{% tab title="Python" %}

```python
import requests

end_point = 'https://api.panora.exchange/swap'
query = {
    'fromTokenAddress': '0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b',
    'toTokenAddress':'0xa',
    'fromTokenAmount': '100',
    'toWalletAddress':'0x1c3206329806286fd2223647c9f9b130e66baeb6d7224a18c1f642ffe48f3b4c'
}

headers = {
    'x-api-key': 'Your API key',
}

url = f"{end_point}?{'&'.join([f'{key}={value}' for key, value in query.items()])}"

response = requests.post(url, headers=headers)

print(response.json())

```

{% endtab %}

{% tab title="Go" %}

```go

import (
    "fmt"
    "net/http"
    "io/ioutil"
    "net/url"
)

func main() {
    endPoint := "https://api.panora.exchange/swap"
    query := url.Values{
        "fromTokenAddress": {"0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b"},
        "toTokenAddress":{"0xa"},
        "fromTokenAmount": {"100"},
        "toWalletAddress":{"0x1c3206329806286fd2223647c9f9b130e66baeb6d7224a18c1f642ffe48f3b4c"}
    }

    headers := map[string]string{
        "x-api-key": "Your API key",
    }

    url := endPoint + "?" + query.Encode()

    req, err := http.NewRequest("POST", url, nil)
    if err != nil {
        fmt.Println("Error creating request:", err)
        return
    }

    for key, value := range headers {
        req.Header.Set(key, value)
    }

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        fmt.Println("Error sending request:", err)
        return
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("Error reading response:", err)
        return
    }

    fmt.Println(string(body))
}

```

{% endtab %}

{% tab title="Curl" %}

```
// Copy and paste the below command in your terminal

curl -X POST \
  'https://api.panora.exchange/swap?fromTokenAddress=0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b&toTokenAddress=0xa&fromTokenAmount=100&toWalletAddress=0x1c3206329806286fd2223647c9f9b130e66baeb6d7224a18c1f642ffe48f3b4c' \
  -H 'x-api-key: Your API key'
```

{% endtab %}
{% endtabs %}

### Response Parameters

#### Scenario 1: For ExactIn Swap where fromTokenAmount is entered (instead of toTokenAmount), the endpoint returns the maximum toTokenAmount

<table><thead><tr><th width="223">Name</th><th width="139">Type</th><th>Description</th></tr></thead><tbody><tr><td>fromToken</td><td>object</td><td>An object containing the details of the fromToken, which includes <code>address</code> , <code>decimals</code> and <code>current_price</code></td></tr><tr><td>toToken</td><td>object</td><td>An object containing the details of the toToken, which includes <code>address</code> , <code>decimals</code> and <code>current_price</code> </td></tr><tr><td>fromTokenAmount</td><td>string</td><td>Amount of token being swapped from<br><br><strong>Note</strong>: Amount is without Token decimals</td></tr><tr><td>fromTokenAmountUSD</td><td>string</td><td>USD equivalent of fromTokenAmount<br><br><strong>Note</strong>: Will be null for those tokens whose usd price is not available from external price feeds </td></tr><tr><td>quotes</td><td>array</td><td><p>An object (within an array) containing the swap details.The object consists of:</p><p><br><code>toTokenAmount</code>:  Amount of the token (without Token decimals) being swapped to. </p><p><br><code>priceImpact</code>: percentage difference between USD price of fromTokenAmount and toTokenAmount. Will be null if either fromTokenAmountUSD or toTokenAmountUSD is null</p><p></p><p><code>slippagePercentage</code>: Percentage of slippage tolerance</p><p><br><code>feeAmount</code>: Platform fee for the transaction</p><p></p><p><code>feeToken</code> : An object containing the details of the feeToken, which includes<code>tokenType</code> , <code>name</code> , <code>symbol</code> , <code>decimals</code> </p><p></p><p><code>minToTokenAmount</code>:  Minimum amount of token (without Token decimals) user would receive after reducing slippage. </p><p><br><code>txData</code>: Details of the transaction for the swap</p><p></p><p><code>toTokenAmountUSD:</code> USD equivalent of toTokenAmount. Will be null for those tokens whose USD price is not available from external price feeds<br><br>Note: Values are of type string</p></td></tr><tr><td>status Code</td><td></td><td><p><code>200</code>:  Successful response<br><code>400</code>: Bad Request</p><p><code>401</code>: Unauthorized (in case no/wrong API key is passed)</p><p><code>404</code>: Not Found</p><p><code>429</code>: Too  many requests (in case of rate limit breach)<br><code>500</code>: Internal Server Error </p></td></tr></tbody></table>

#### Scenario 2: For ExactOut Swap where toTokenAmount is entered (instead of fromTokenAmount), the endpoint returns the minimum toTokenAmount

<table><thead><tr><th width="210">Name</th><th width="126">Type</th><th>Description</th></tr></thead><tbody><tr><td>fromToken</td><td>object</td><td>An object containing the details of the fromToken, which includes <code>address</code> , <code>decimals</code> and <code>current_price</code></td></tr><tr><td>toToken</td><td>object</td><td>An object containing the details of the toToken, which includes <code>address</code> , <code>decimals</code> and <code>current_price</code> </td></tr><tr><td>toTokenAmount</td><td>string</td><td>Amount of token user desires to get after the swap<br><br><strong>Note</strong>: Amount is without Token decimals</td></tr><tr><td>toTokenAmountUSD</td><td>string</td><td>USD equivalent of toTokenAmount. <br><br><strong>Note</strong>: Will be null for those tokens whose usd price is not available from external price feeds </td></tr><tr><td>quotes</td><td>array</td><td><p>An object (within an array) containing the swap details.The object consists of:</p><p><br><code>fromTokenAmount</code>:  Amount of tokens (without Token decimals) user needs to pay for the swap<br><br><code>maxFromTokenAmount:</code> Maximum amount of tokens (without Token decimals) user would need to pay after adding slippage.</p><p></p><p><code>slippagePercentage</code>:  Percentage of slippage tolerance</p><p><br><code>feeAmount</code>:  Platform fee for the transaction</p><p><br><code>feeToken</code> : An object containing the details of the feeToken, which includes<code>tokenType</code> , <code>name</code> , <code>symbol</code> , <code>decimals</code> <br><br><code>priceImpact</code>:  percentage difference between USD price of fromTokenAmount and toTokenAmount. Will be null if either fromTokenAmountUSD or toTokenAmountUSD is null </p><p><br><code>txData</code>: Details of the transaction for the swap<br><br><code>fromTokenAmountUSD:</code> USD equivalent of fromTokenAmount. Will be null for those tokens whose usd price is not available from external price feeds</p><p></p><p>Note: Values are of type string </p></td></tr><tr><td>status code</td><td></td><td><p><code>200</code>:  Successful response<br><code>400</code>: Bad Request</p><p><code>401</code>: Unauthorized (in case no/wrong API key is passed)</p><p><code>404</code>: Not Found</p><p><code>429</code>: Too  many requests (in case of rate limit breach)<br><code>500</code>: Internal Server Error </p></td></tr></tbody></table>

## 2. Get quote for the swap

<mark style="color:green;">`GET`</mark> `https://api.panora.exchange/swap/quote`

### Headers

* **Public API Key**:

  ```
  a4^KV_EaTf4MW#ZdvgGKX#HUD^3IFEAOV_kzpIE^3BQGA8pDnrkT7JcIy#HNlLGi
  ```

  ***Note**: For large-scale apps, please raise a ticket on Discord for a dedicated key.*

<table><thead><tr><th width="118">Name</th><th width="143">Value</th><th>Description</th></tr></thead><tbody><tr><td>x-api-key</td><td>Your API Key</td><td>Use the public API key or enter the API key provided by Panora</td></tr></tbody></table>

### Query Parameters

<table><thead><tr><th width="195">Parameter</th><th width="100">Required</th><th width="96">Type</th><th>Description</th></tr></thead><tbody><tr><td>chainId</td><td>no</td><td>number</td><td><p>ID for the chain for which the endpoint is being invoked. <br></p><p>Note: Default chainID is 1 for Aptos Mainnet</p></td></tr><tr><td>fromTokenAddress</td><td>yes</td><td>string</td><td>Address of the token being swapped from<br><br>Example: If you want to swap 10.5 APT to USDC, then fromTokenAddress is <code>0x1::aptos_coin::AptosCoin</code></td></tr><tr><td>toTokenAddress</td><td>yes</td><td>string</td><td>Address of the token being swapped to<br><br>Example: If you want to swap 10.5 APT to USDC, then toTokenAddress is <code>0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b</code></td></tr><tr><td>fromTokenAmount</td><td><a data-footnote-ref href="#user-content-fn-1">yes</a><mark style="color:red;">*</mark></td><td>number</td><td>Amount of the token being swapped from. Please set the amount without Token decimals<br><br>Example: If you want to swap 10.5 APT to USDC, then fromTokenAmount is 10.5</td></tr><tr><td>toTokenAmount</td><td>yes<mark style="color:red;">*</mark></td><td>number</td><td>Amount of the token being swapped to. Please set the amount without Token decimals</td></tr><tr><td>slippagePercentage</td><td>no</td><td>number</td><td><p>Slippage tolerance as 'auto' (which lets Panora choose the optimal slippage for the transaction, up to a maximum of 5%) or a percentage value.<br><br>Example: For 3% slippage tolerance, set the value as 3. This can be set as 0.1, 0.5, 1.0 or any custom slippage percentage between 0 and 100.</p><p><br>Note: If nothing is entered, slippage tolerance will be set to auto by default. If a numeric value is entered, anything after one decimal place will be truncated.</p></td></tr><tr><td>integratorFeePercentage</td><td>no</td><td>number</td><td><p>Integrator fee as a percentage value<br><br>Example: For 2% integrator fee, set the value as 2. This can be set as 0.1, 0.5, 1.0 or any custom integrator fee between 0 and 2.</p><p><br>Note: Fee sharing applicable. If nothing is entered, integrator fee will be set to 0 by default. If a numeric value is entered, anything after one decimal place will be truncated.</p></td></tr><tr><td>integratorFeeAddress</td><td>no</td><td>string</td><td><p>Wallet Address where integrators want to receive their fee share.</p><p></p><p>Note: Ensure it starts with 0x followed by 64 characters</p></td></tr><tr><td>includeSources</td><td>no</td><td>string</td><td><p>List of liquidity sources to be included for route calculation.</p><p></p><p>Example: Hyperion, ThalaSwapV2</p><p></p><p>Note: If nothing is entered, all available sources are included by default. Check entire list <a href="https://docs.panora.exchange/developer/swap/sources">here</a></p></td></tr><tr><td>excludeSources</td><td>no</td><td>string</td><td><p>List of liquidity sources to be excluded from the route.</p><p></p><p>Example: SushiSwap</p><p></p><p>Note: If nothing is entered, none of the sources will be excluded by default. Check entire list <a href="https://docs.panora.exchange/developer/swap/sources">here</a></p></td></tr><tr><td>includePools</td><td>no</td><td>string</td><td><p>List of pool addresses to be included for route calculation. </p><p></p><p>Example: 0xd3894aca06d5f42b27c89e6f448114b3ed6a1ba07f992a58b2126c71dd83c127, 0xc3c4cbb3efcd3ec1b6679dc0ed45851486920dba0e86e612e80a79041a6cf1a3</p><p></p><p>Note: If nothing is entered, all available pools are included by default. Max 10 pool addresses are supported. Coin standard DEX pools with comma ( , ) within the pool address would get skipped</p></td></tr><tr><td>onlyDirectRoutes</td><td>no</td><td>boolean</td><td>Set to true to restrict to direct routes without intermediate hops or splits.<br>Default is false.</td></tr></tbody></table>

{% hint style="warning" %} <mark style="color:red;">\*</mark>Please send either fromTokenAmount or toTokenAmount at a time.
{% endhint %}

### Request Example

{% tabs %}
{% tab title="Javascript" %}

```javascript
//CALL THE BELOW FUNCTION WITH THE ASYNC
const end_point = 'https://api.panora.exchange/swap/quote'
const query = {
    fromTokenAddress:"0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b"
    toTokenAddress:"0xa"
    fromTokenAmount:"100"
};

const headers = {
    "x-api-key": "Your API key"
};

const queryString = new URLSearchParams(query).toString();
const url = `${end_point}?${queryString}`;

const response = await (
    await fetch(url, {
        method: 'GET',
        headers: headers
    })
).json();
```

{% endtab %}

{% tab title="Python" %}

```python
import requests

end_point = 'https://api.panora.exchange/swap/quote'
query = {
    'fromTokenAddress': '0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b',
    'toTokenAddress':'0xa',
    'fromTokenAmount': '100',
}

headers = {
    'x-api-key': 'Your API key',
}

url = f"{end_point}?{'&'.join([f'{key}={value}' for key, value in query.items()])}"

response = requests.get(url, headers=headers)

print(response.json())

```

{% endtab %}

{% tab title="Go" %}

```go

import (
    "fmt"
    "net/http"
    "io/ioutil"
    "net/url"
)

func main() {
    endPoint := "https://api.panora.exchange/swap/quote"
    query := url.Values{
        "fromTokenAddress": {"0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b"},
        "toTokenAddress":{"0xa"},
        "fromTokenAmount": {"100"},
    }

    headers := map[string]string{
        "x-api-key": "Your API key",
    }

    url := endPoint + "?" + query.Encode()

    req, err := http.NewRequest("GET", url, nil)
    if err != nil {
        fmt.Println("Error creating request:", err)
        return
    }

    for key, value := range headers {
        req.Header.Set(key, value)
    }

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        fmt.Println("Error sending request:", err)
        return
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("Error reading response:", err)
        return
    }

    fmt.Println(string(body))
}

```

{% endtab %}

{% tab title="Curl" %}

```
// Copy and paste the below command in your terminal

curl -X GET \
  'https://api.panora.exchange/swap/quote?fromTokenAddress=0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b&toTokenAddress=0xa&fromTokenAmount=100' \
  -H 'x-api-key: Your API key'
```

{% endtab %}
{% endtabs %}

### Response Parameters

#### Scenario 1:  For ExactIn Swap where fromTokenAmount is entered (instead of toTokenAmount), the endpoint returns the maximum toTokenAmount

<table><thead><tr><th width="223">Name</th><th width="139">Type</th><th>Description</th></tr></thead><tbody><tr><td>fromToken</td><td>object</td><td>An object containing the details of the fromToken, which includes <code>address</code> , <code>decimals</code> ,and <code>current_price</code></td></tr><tr><td>toToken</td><td>object</td><td>An object containing the details of the toToken, which includes <code>address</code> , <code>decimals</code> and <code>current_price</code> </td></tr><tr><td>fromTokenAmount</td><td>string</td><td>Amount of token being swapped from<br><br><strong>Note</strong>: Amount is without Token decimals</td></tr><tr><td>fromTokenAmountUSD</td><td>string</td><td>USD equivalent of fromTokenAmount<br><br><strong>Note</strong>: Will be null for those tokens whose usd price is not available from external price feeds </td></tr><tr><td>quotes</td><td>array</td><td><p>An object (within an array) containing the swap details.The object consists of:</p><p><br><code>toTokenAmount</code>:  Amount of the token (without Token decimals) being swapped to. </p><p><br><code>priceImpact</code>: percentage difference between USD price of fromTokenAmount and toTokenAmount. Will be null if either fromTokenAmountUSD or toTokenAmountUSD is null</p><p></p><p><code>slippagePercentage</code>: Percentage of slippage tolerance</p><p><br><code>feeAmount</code>: Platform fee for the transaction</p><p></p><p><code>feeToken</code> : An object containing the details of the feeToken, which includes <code>tokenType</code> , <code>name</code> , <code>symbol</code> , <code>decimals</code> </p><p></p><p><code>minToTokenAmount</code>:  Minimum amount of token (without Token decimals) user would receive after reducing slippage.  </p><p></p><p><code>toTokenAmountUSD:</code> USD equivalent of toTokenAmount. Will be null for those tokens whose USD price is not available from external price feeds<br><br>Note: Values are of type string</p></td></tr><tr><td>status Code</td><td></td><td><p><code>200</code>:  Successful response<br><code>400</code>: Bad Request</p><p><code>401</code>: Unauthorized (in case no/wrong API key is passed)</p><p><code>404</code>: Not Found</p><p><code>429</code>: Too  many requests (in case of rate limit breach)<br><code>500</code>: Internal Server Error </p></td></tr></tbody></table>

#### Scenario 2: For ExactOut Swap where toTokenAmount is entered (instead of fromTokenAmount), the endpoint returns the minimum fromTokenAmount

<table><thead><tr><th width="210">Name</th><th width="126">Type</th><th>Description</th></tr></thead><tbody><tr><td>fromToken</td><td>object</td><td>An object containing the details of the fromToken, which includes <code>address</code> , <code>decimals</code> and <code>current_price</code></td></tr><tr><td>toToken</td><td>object</td><td>An object containing the details of the toToken, which includes <code>address</code> , <code>decimals</code> and <code>current_price</code> </td></tr><tr><td>toTokenAmount</td><td>string</td><td>Amount of token user desires to get after the swap<br><br><strong>Note</strong>: Amount is without Token decimals</td></tr><tr><td>toTokenAmountUSD</td><td>string</td><td>USD equivalent of toTokenAmount. <br><br><strong>Note</strong>: Will be null for those tokens whose usd price is not available from external price feeds </td></tr><tr><td>quotes</td><td>array</td><td><p>An object (within an array) containing the swap details.The object consists of:</p><p><br><code>fromTokenAmount</code>:  Amount of tokens (without Token decimals) user needs to pay for the swap<br><br><code>maxFromTokenAmount:</code> Maximum amount of tokens (without Token decimals) user would need to pay after adding slippage.</p><p></p><p><code>slippagePercentage</code>:  Percentage of slippage tolerance</p><p><br><code>feeAmount</code>:  Platform fee for the transaction</p><p><br><code>feeToken</code> : An object containing the details of the feeToken, which includes <code>tokenType</code> , <code>name</code> , <code>symbol</code> , <code>decimals</code> <br><br><code>priceImpact</code>:  percentage difference between USD price of fromTokenAmount and toTokenAmount. Will be null if either fromTokenAmountUSD or toTokenAmountUSD is null <br><br><code>fromTokenAmountUSD:</code> USD equivalent of fromTokenAmount. Will be null for those tokens whose usd price is not available from external price feeds</p><p></p><p>Note: Values are of type string </p></td></tr><tr><td>status code</td><td></td><td><p><code>200</code>:  Successful response<br><code>400</code>: Bad Request</p><p><code>401</code>: Unauthorized (in case no/wrong API key is passed)</p><p><code>404</code>: Not Found</p><p><code>429</code>: Too  many requests (in case of rate limit breach)<br><code>500</code>: Internal Server Error  </p></td></tr></tbody></table>

[^1]:


# Examples

Here you will some of the examples of the API integration

{% hint style="warning" %}
The values and responses provided are solely for illustrative purposes and to aid in the understanding of requests and responses; actual values and responses may vary.
{% endhint %}

## 1. ExactIn swap: Get Transaction Data for swap from USDC to APT when fromTokenAmount is entered

<mark style="color:green;">`POST`</mark> `https://api.panora.exchange/swap`

```javascript
const end_point = 'https://api.panora.exchange/swap'
const query = {
    fromTokenAddress: "0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b",
    toTokenAddress: "0xa",
    toWalletAddress: "0x1c3206329806286fd2223647c9f9b130e66baeb6d7224a18c1f642ffe48f3b4c",
    fromTokenAmount: 100,
};

const headers = {
    "x-api-key": "Your API key"
};

const queryString = new URLSearchParams(query).toString();
const url = `${end_point}?${queryString}`;

const response = await (
    await fetch(url, {
        method: 'POST',
        headers: headers
    })
).json();

```

Below is the response for the above request

{% tabs %}
{% tab title="200" %}

```json
// Succesful response
{
    "fromToken": {
        "address": "0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b",
        "decimals": 6,
        "current_price": "0.99995023"
    },
    "toToken": {
        "address": "0xa",
        "decimals": 8,
        "current_price": "5.55701085"
    },
    "fromTokenAmount": "100",
    "fromTokenAmountUSD": "99.995023",
    "quotes": [
        {
            "toTokenAmount": "17.96724953",
            "priceImpact": "-0.15",
            "slippagePercentage": "1",
            "feeAmount": "0",
            "feeToken": {
                "tokenType": "0x1::aptos_coin::AptosCoin",
                "name": "Aptos Coin",
                "symbol": "APT",
                "decimals": 8
            },
            "minToTokenAmount": "17.78757703",
            "txData": {
                "function": "0x1c3206329806286fd2223647c9f9b130e66baeb6d7224a18c1f642ffe48f3b4c::panora_swap::router_entry",
                "type_arguments": [
                    "0x1::string::String",
                    "0x1::aptos_coin::AptosCoin",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::aptos_coin::AptosCoin"
                ],
                "arguments": [
                    null,
                    "0x1c3206329806286fd2223647c9f9b130e66baeb6d7224a18c1f642ffe48f3b4c",
                    1,
                    2,
                    [
                        3,
                        1,
                        0
                    ],
                    [
                        [
                            [
                                40
                            ],
                            [
                                40
                            ]
                        ],
                        [
                            [
                                44
                            ],
                            []
                        ],
                        [
                            [
                                23
                            ],
                            []
                        ]
                    ],
                    [
                        [
                            [
                                2
                            ],
                            [
                                2
                            ]
                        ],
                        [
                            [
                                0
                            ],
                            []
                        ],
                        [
                            [
                                0
                            ],
                            []
                        ]
                    ],
                    [
                        [
                            [
                                false
                            ],
                            [
                                false
                            ]
                        ],
                        [
                            [
                                true
                            ],
                            []
                        ],
                        [
                            [
                                false
                            ],
                            []
                        ]
                    ],
                    [
                        [
                            2,
                            2
                        ],
                        [
                            3,
                            4
                        ],
                        [
                            2,
                            4
                        ]
                    ],
                    [
                        [
                            [
                                "0xa928222429caf1924c944973c2cd9fc306ec41152ba4de27a001327021a4dff7"
                            ],
                            [
                                "0xa928222429caf1924c944973c2cd9fc306ec41152ba4de27a001327021a4dff7"
                            ]
                        ],
                        [
                            [
                                "0x18269b1090d668fbbc01902fa6a5ac6e75565d61860ddae636ac89741c883cbc"
                            ],
                            [
                                "0x0"
                            ]
                        ],
                        [
                            [
                                "0x0"
                            ],
                            [
                                "0x0"
                            ]
                        ]
                    ],
                    [
                        [
                            "0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b",
                            "0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b"
                        ],
                        [
                            "0xa",
                            "0x2ebb2ccac5e027a87fa0e2e5f656a3a4238d6a48d93ec9b610d570fc0aa0df12"
                        ],
                        [
                            "0x357b0b74bc833e95a115ad22604854d6b0fca151cecd94111770e5d6ffc9dc2b",
                            "0x2ebb2ccac5e027a87fa0e2e5f656a3a4238d6a48d93ec9b610d570fc0aa0df12"
                        ]
                    ],
                    [
                        [
                            "0xa",
                            "0xa"
                        ],
                        [
                            "0x357b0b74bc833e95a115ad22604854d6b0fca151cecd94111770e5d6ffc9dc2b",
                            "0x2ebb2ccac5e027a87fa0e2e5f656a3a4238d6a48d93ec9b610d570fc0aa0df12"
                        ],
                        [
                            "0xa",
                            "0x2ebb2ccac5e027a87fa0e2e5f656a3a4238d6a48d93ec9b610d570fc0aa0df12"
                        ]
                    ],
                    null,
                    [
                        [
                            [
                                10000
                            ],
                            [
                                10000
                            ]
                        ],
                        [
                            [
                                10000
                            ],
                            []
                        ],
                        [
                            [
                                10000
                            ],
                            []
                        ]
                    ],
                    [
                        [
                            [
                                4,
                                135,
                                1,
                                0,
                                0,
                                0,
                                0,
                                0
                            ]
                        ]
                    ],
                    "0xa",
                    [
                        90000000,
                        10000000
                    ],
                    1778757703,
                    10000000000000000,
                    "0x90c588d22ee7dd42d55d73e63b50f0f9dfe7113952374040ae8c4adfd137176d"
                ]
            },
            "toTokenAmountUSD": "99.84420058",
            "feeAmountUSD": "0"
        }
    ]
}
```

{% endtab %}

{% tab title="400" %}

```json
//Bad Request
{
    "statusCode": 400,
    "message": "<Error Message>",
    "status": "fail"
}
```

{% endtab %}

{% tab title="401" %}

```json
//Unauthorized
{
    "statusCode": 401,
    "message": "<Error Message>",
    "status": "fail"
}
```

{% endtab %}

{% tab title="404" %}

```json
//Not Found
{
    "statusCode": 404,
    "message": "<Error Message>",
    "status": "fail"
}
```

{% endtab %}

{% tab title="429" %}

```json
//Too Many Request
{
    "statusCode": 429,
    "message": "<Error Message>",
    "status": "fail"
}
```

{% endtab %}

{% tab title="500" %}

```json
// Internal Server Error
{
    "statusCode": 500,
    "message": "internal server error",
    "status": "fail"
}
```

{% endtab %}
{% endtabs %}

This response can be sent to Aptos chain with the required signatures to execute the transaction.&#x20;

## 2. ExactOut swap: Get transaction data for swap from USDC to APT when toTokenAmount is entered

<mark style="color:green;">`POST`</mark> `https://api.panora.exchange/swap`

<pre class="language-javascript"><code class="lang-javascript"><strong>const end_point = 'https://api.panora.exchange/swap'
</strong>const query = {  
    fromTokenAddress: "0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b",
    toTokenAddress: "0xa",
    toTokenAmount: 10.5,
    toWalletAddress: "0x1c3206329806286fd2223647c9f9b130e66baeb6d7224a18c1f642ffe48f3b4c",
};

const headers = {
    "x-api-key": "Your API key"
};

const queryString = new URLSearchParams(query).toString();
const url = `${end_point}?${queryString}`;

const response = await (
    await fetch(url, {
        method: 'POST',
        headers: headers
    })
).json();


</code></pre>

{% hint style="info" %}
Note:  toTokenAmount here is amount (without Token Decimals) that the user desires to receive after the swap is executed
{% endhint %}

Below is the response for the above request

{% tabs %}
{% tab title="200" %}

```json
// Successful response
{
    "fromToken": {
        "address": "0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b",
        "decimals": 6,
        "current_price": "0.99994999"
    },
    "toToken": {
        "address": "0xa",
        "decimals": 8,
        "current_price": "5.55088748"
    },
    "toTokenAmount": "10.5",
    "toTokenAmountUSD": "58.28431854",
    "quotes": [
        {
            "fromTokenAmount": "58.292962",
            "maxFromTokenAmount": "58.875892",
            "slippagePercentage": "1",
            "feeAmount": "0",
            "feeToken": {
                "tokenType": "0x1::aptos_coin::AptosCoin",
                "name": "Aptos Coin",
                "symbol": "APT",
                "decimals": 8
            },
            "priceImpact": "-0.01",
            "txData": {
                "function": "0x1c3206329806286fd2223647c9f9b130e66baeb6d7224a18c1f642ffe48f3b4c::panora_swap::router_entry",
                "type_arguments": [
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::string::String",
                    "0x1::aptos_coin::AptosCoin"
                ],
                "arguments": [
                    null,
                    "0x1c3206329806286fd2223647c9f9b130e66baeb6d7224a18c1f642ffe48f3b4c",
                    2,
                    1,
                    [
                        1,
                        0,
                        1
                    ],
                    [
                        [
                            [
                                44
                            ],
                            [
                                44
                            ],
                            [
                                44
                            ]
                        ],
                        [
                            []
                        ],
                        [
                            []
                        ]
                    ],
                    [
                        [
                            [
                                0
                            ],
                            [
                                0
                            ],
                            [
                                0
                            ]
                        ],
                        [
                            []
                        ],
                        [
                            []
                        ]
                    ],
                    [
                        [
                            [
                                false
                            ],
                            [
                                true
                            ],
                            [
                                true
                            ]
                        ],
                        [
                            []
                        ],
                        [
                            []
                        ]
                    ],
                    [
                        [
                            2,
                            3,
                            3
                        ],
                        [
                            4
                        ],
                        [
                            4
                        ]
                    ],
                    [
                        [
                            [
                                "0x925660b8618394809f89f8002e2926600c775221f43bf1919782b297a79400d8"
                            ],
                            [
                                "0x925660b8618394809f89f8002e2926600c775221f43bf1919782b297a79400d8"
                            ],
                            [
                                "0x925660b8618394809f89f8002e2926600c775221f43bf1919782b297a79400d8"
                            ]
                        ],
                        [
                            [
                                "0x0"
                            ]
                        ],
                        [
                            [
                                "0x0"
                            ]
                        ]
                    ],
                    [
                        [
                            "0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b",
                            "0xa",
                            "0xa"
                        ],
                        [
                            "0x2ebb2ccac5e027a87fa0e2e5f656a3a4238d6a48d93ec9b610d570fc0aa0df12"
                        ],
                        [
                            "0x2ebb2ccac5e027a87fa0e2e5f656a3a4238d6a48d93ec9b610d570fc0aa0df12"
                        ]
                    ],
                    [
                        [
                            "0xa",
                            "0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b",
                            "0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b"
                        ],
                        [
                            "0x2ebb2ccac5e027a87fa0e2e5f656a3a4238d6a48d93ec9b610d570fc0aa0df12"
                        ],
                        [
                            "0x2ebb2ccac5e027a87fa0e2e5f656a3a4238d6a48d93ec9b610d570fc0aa0df12"
                        ]
                    ],
                    null,
                    [
                        [
                            [
                                10000
                            ],
                            [
                                10000
                            ],
                            [
                                10000
                            ]
                        ],
                        [
                            []
                        ],
                        [
                            []
                        ]
                    ],
                    [
                        [
                            [
                                4,
                                135,
                                1,
                                0,
                                0,
                                0,
                                0,
                                0
                            ]
                        ]
                    ],
                    "0xa",
                    [
                        58875892
                    ],
                    1050000000,
                    10000000000000000,
                    "0x90c588d22ee7dd42d55d73e63b50f0f9dfe7113952374040ae8c4adfd137176d"
                ]
            },
            "fromTokenAmountUSD": "58.29004677"
        }
    ]
}
```

{% endtab %}

{% tab title="400" %}

```json
//Bad Request
{
    "statusCode": 400,
    "message": "<Error Message>",
    "status": "fail"
}
```

{% endtab %}

{% tab title="401" %}

```json
//Bad Request
{
    "statusCode": 401,
    "message": "<Error Message>",
    "status": "fail"
}
```

{% endtab %}

{% tab title="404" %}

```json
//Not Found
{
    "statusCode": 404,
    "message": "<Error Message>",
    "status": "fail"
}
```

{% endtab %}

{% tab title="429" %}

```json
//Too Many Request
{
    "statusCode": 429,
    "message": "<Error Message>",
    "status": "fail"
}
```

{% endtab %}

{% tab title="500" %}

```json
// Internal Server Error
{
    "statusCode": 500,
    "message": "internal server error",
    "status": "fail"
}
```

{% endtab %}
{% endtabs %}

This response can be sent to Aptos chain with the required signatures to execute the transaction.&#x20;

## 3. ExactIn swap: Get Quote Data for swap from USDC to APT when fromTokenAmount is entered

<mark style="color:green;">`GET`</mark> `https://api.panora.exchange/swap/quote`

```javascript
const end_point = 'https://api.panora.exchange/swap/quote'
const query = {
    fromTokenAddress: "0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b",
    toTokenAddress: "0xa",
    fromTokenAmount: 100,
};

const headers = {
    "x-api-key": "Your API key"
};

const queryString = new URLSearchParams(query).toString();
const url = `${end_point}?${queryString}`;

const response = await (
    await fetch(url, {
        method: 'GET',
        headers: headers
    })
).json();

```

Below is the response for the above request

{% tabs %}
{% tab title="200" %}

```json
// Successful response
{
    "fromToken": {
        "address": "0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b",
        "decimals": 6,
        "current_price": "0.99995007"
    },
    "toToken": {
        "address": "0xa",
        "decimals": 8,
        "current_price": "5.54399864"
    },
    "fromTokenAmount": "100",
    "fromTokenAmountUSD": "99.995007",
    "quotes": [
        {
            "toTokenAmount": "18.03063233",
            "priceImpact": "-0.03",
            "slippagePercentage": "1",
            "feeAmount": "0",
            "feeToken": {
                "tokenType": "0x1::aptos_coin::AptosCoin",
                "name": "Aptos Coin",
                "symbol": "APT",
                "decimals": 8
            },
            "minToTokenAmount": "17.850326",
            "toTokenAmountUSD": "99.96180112",
            "feeAmountUSD": "0"
        }
    ]
}
```

{% endtab %}

{% tab title="400" %}

```json
//Bad Request
{
    "statusCode": 400,
    "message": "<Error Message>",
    "status": "fail"
}
```

{% endtab %}

{% tab title="401" %}

```json
//UnAuthourized
{
    "statusCode": 401,
    "message": "<Error Message>",
    "status": "fail"
}
```

{% endtab %}

{% tab title="404" %}

```json
//Not Found
{
    "statusCode": 404,
    "message": "<Error Message>",
    "status": "fail"
}
```

{% endtab %}

{% tab title="429" %}

```json
//Too Many Request
{
    "statusCode": 429,
    "message": "<Error Message>",
    "status": "fail"
}
```

{% endtab %}

{% tab title="500" %}

```json
//Not Found
{
    "statusCode": 500,
    "message": "internal server error",
    "status": "fail"
}
```

{% endtab %}
{% endtabs %}

## 4. ExactOut swap: Get Quote data for swap from USDC to APT when toTokenAmount is entered

<mark style="color:green;">`GET`</mark> `https://api.panora.exchange/swap/quote`

```javascript
const query = {  
    fromTokenAddress: "0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b",
    toTokenAddress: "0xa",
    toTokenAmount: 10.5
};

const headers = {
    "x-api-key": "Your API key"
};

const queryString = new URLSearchParams(query).toString();
const url = `${end_point}?${queryString}`;

const response = await (
    await fetch(url, {
        method: 'GET',
        headers: headers
    })
).json();
```

Below is the response for the request.

{% tabs %}
{% tab title="200" %}

```json
// Successful response
{
    "fromToken": {
        "address": "0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b",
        "decimals": 6,
        "current_price": "0.99995009"
    },
    "toToken": {
        "address": "0xa",
        "decimals": 8,
        "current_price": "5.53744039"
    },
    "toTokenAmount": "10.5",
    "toTokenAmountUSD": "58.1431241",
    "quotes": [
        {
            "fromTokenAmount": "58.172607",
            "maxFromTokenAmount": "58.754333",
            "slippagePercentage": "1",
            "feeAmount": "0",
            "feeToken": {
                "tokenType": "0x1::aptos_coin::AptosCoin",
                "name": "Aptos Coin",
                "symbol": "APT",
                "decimals": 8
            },
            "priceImpact": "-0.05",
            "fromTokenAmountUSD": "58.16970361"
        }
    ]
}
```

{% endtab %}

{% tab title="400" %}

```json
//Bad Request
{
    "statusCode": 400,
    "message": "<Error Message>",
    "status": "fail"
}
```

{% endtab %}

{% tab title="401" %}

```json
//UnAuthorized
{
    "statusCode": 401,
    "message": "<Error Message>",
    "status": "fail"
}
```

{% endtab %}

{% tab title="404" %}

```json
//Not Found
{
    "statusCode": 404,
    "message": "<Error Message>",
    "status": "fail"
}
```

{% endtab %}

{% tab title="429" %}

```json
//Too many requests
{
    "statusCode": 429,
    "message": "<Error Message>",
    "status": "fail"
}
```

{% endtab %}

{% tab title="500" %}

```json
//Internal Server Error
{
    "statusCode": 500,
    "message": "<Error Message>",
    "status": "fail"
}
```

{% endtab %}
{% endtabs %}


# SDK\_GASLESS

SDK for swaps, balances, token lists, and prices

## Installation

Using npm

```
npm install @panoraexchange/swap-sdk
```

Using yarn

```
yarn add @panoraexchange/swap-sdk
```

Using pnpm

```
pnpm add @panoraexchange/swap-sdk
```

## Usage

### 1. Initialize

```javascript
import Panora, { PanoraConfig } from "@panoraexchange/swap-sdk"

const config: PanoraConfig = {
  panoraApiKey: "PANORA_API_KEY", // Optional. Default is Panora's public api key
  geomiApiKey: "GEOMI_API_KEY", // Optional. AKA Aptos Build Api Key. Takes higher priority over rpcUrl
  rpcUrl: "CUSTOM_RPC_URL", // Optional
}

const panora = new Panora(config)
```

* **Public API Key**:

  ```
  a4^KV_EaTf4MW#ZdvgGKX#HUD^3IFEAOV_kzpIE^3BQGA8pDnrkT7JcIy#HNlLGi
  ```

  ***Note:** This API key's limits should be sufficient for most use cases. Protocols within the Aptos ecosystem with specific requirements or customization may submit a ticket on Discord.*&#x20;

### 2. Swap

Fetches a swap quote and executes the transaction on-chain in a single step. Use this when you want to trigger end-to-end transaction without fetching or managing quotes separately. Refer [API page](https://docs.panora.exchange/developer/swap/api) for all available query parameters&#x20;

#### i.  ExactInSwap:

```javascript
const exactInSwap = async () => {
  const response = await panora.swap({
    params: {
      chainId: "1",
      fromTokenAddress:
        "0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b",
      toTokenAddress: "0xa",
      fromTokenAmount: "100",
      toWalletAddress: "YOUR WALLET ADDRESS",
      slippagePercentage: "1",
      integratorFeeAddress: "INTEGRATOR FEE WALLET ADDRESS",
      integratorFeePercentage: "1",
    },
    private_key: "YOUR PRIVATE KEY",
  })
}
```

#### ii. ExactOutSwap:

```javascript
const exactOutSwap = async () => {
  const response = await panora.swap({
    params: {
      chainId: "1",
      fromTokenAddress:
        "0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b",
      toTokenAddress: "0xa",
      toTokenAmount: "10.5",
      toWalletAddress: "YOUR WALLET ADDRESS",
      slippagePercentage: "1",
      integratorFeeAddress: "INTEGRATOR FEE WALLET ADDRESS",
      integratorFeePercentage: "1",
    },
    private_key: "YOUR_PRIVATE_KEY",
  })
}
```

### 3. Quote & Execute

#### a. Quote: Returns quote for a swap transaction. Contains transaction data that can be used to build, sign and submit directly

#### i. ExactInSwapQuote

```javascript
const exactInSwapQuote = async () => {
  const response = await panora.getQuote({
    params: {
      chainId: "1",
      fromTokenAddress:
        "0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b",
      toTokenAddress: "0xa",
      fromTokenAmount: "100",
      toWalletAddress: "YOUR WALLET ADDRESS",
      slippagePercentage: "1",
      integratorFeeAddress: "INTEGRATOR FEE WALLET ADDRESS",
      integratorFeePercentage: "1",
    },
  });
};

```

#### ii. ExactOutSwapQuote

```javascript
const exactOutSwapQuote = async () => {
  const response = await panora.getQuote({
    params: {
      chainId: "1",
      fromTokenAddress:
        "0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b",
      toTokenAddress: "0xa",
      toTokenAmount: "10.5",
      toWalletAddress: "YOUR WALLET ADDRESS",
      slippagePercentage: "1",
      integratorFeeAddress: "INTEGRATOR FEE WALLET ADDRESS",
      integratorFeePercentage: "1",
    },
  });
};

```

#### b. Execute Quote: Executes a transaction using a pre-fetched swap quote. Unlike swap function, this function does not fetch the quote itself. Use getQuote function to fetch a swap quote.

```typescript
const quoteResponse = await panora.getQuote({
  params: {
    chainId: "1",
    fromTokenAddress:
      "0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b",
    toTokenAddress: "0xa",
    toTokenAmount: "10.5",
    toWalletAddress: "YOUR WALLET ADDRESS",
    slippagePercentage: "1",
    integratorFeeAddress: "INTEGRATOR FEE WALLET ADDRESS",
    integratorFeePercentage: "1",
  },
});

const txResponse = await panora.executeQuote({
  quote: quoteResponse,
  privateKey: "YOUR_PRIVATE_KEY"
});

```

### 4. Gasless Transactions

Trigger swap transactions with fee-payer enabled, allowing another account to cover the network gas fees by sponsoring the transaction.

Fetch swap quote

<pre class="language-typescript"><code class="lang-typescript"><strong>const quote = await panora.getQuote({
</strong>  params: {
    chainId: "1",
    fromTokenAddress:
      "0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b",
    toTokenAddress: "0xa",
    fromTokenAmount: "100",
    toWalletAddress: "YOUR WALLET ADDRESS",
    slippagePercentage: "1",
    integratorFeeAddress: "INTEGRATOR FEE WALLET ADDRESS",
    integratorFeePercentage: "1",
    // Builds and returns the raw transaction of the payload
    getRawTransaction: true,
  },
  // Builds the transaction with fee payer enabled
  withFeePayer: true,
});
</code></pre>

Retrieve fee payer account

```typescript
// Using private key
const formattedPrivateKey = PrivateKey.formatPrivateKey(
  "YOUR PRIVATE KEY",
  PrivateKeyVariants.Ed25519
);
const privateKey = new Ed25519PrivateKey(formattedPrivateKey);
const feePayerAccount = Account.fromPrivateKey({ privateKey });
const feePayerPublicKey = feePayerAccount.publicKey;

// Using Account.generate()
const feePayerAccount = Account.generate()
const feePayerPublicKey = feePayerAccount.publicKey;
```

Sign the raw transaction as fee payer

```typescript
// Using raw transaction from quote response
// This will only be present when 'getRawTransaction' is set to true
const rawTransaction = quote?.quotes?.[0].rawTransaction;

// Sign the transaction with the fee payer account
const feePayerAuthenticator = aptos.transaction.signAsFeePayer({
  signer: feePayerAccount,
  transaction: rawTransaction,
});

// By building the response payload
const txData = quote.quotes?.[0].txData;
const paylod = {
  function: txData?.function,
  typeArguments: txData?.type_arguments,
  functionArguments: txData?.arguments,
};

const rawTransaction = await aptos.transaction.build.simple({
  sender: "YOUR WALLET ADDRESS",
  data: paylod,
  withFeePayer: true,
});

const feePayerAuthenticator = aptos.transaction.signAsFeePayer({
  signer: feePayerAccount,
  transaction: rawTransaction,
});
```

Execute  gasless swap transaction

```typescript
const executeQuoteResponse = (await panora.executeQuote({
  quote,
  privateKey: "YOUR PRIVATE KEY",
  getTxInfo: true,
  feePayerSig: feePayerAuthenticator,
  isSimulationEnabled: true,
  // By default the transaction is simualted without a fee payer. Adding this will ensure that feePayer has sufficient balance to cover the gas fee for the transaction.
  feePayerPublicKey,
})) as SwapTxResponseWithStatus;

console.log("Transaction Response", executeQuoteResponse);
```

Gasless Transactions Code Sample

```typescript
import {
  Account,
  Ed25519PrivateKey,
  PrivateKey,
  PrivateKeyVariants,
} from "@aptos-labs/ts-sdk"
import { SwapTxResponseWithStatus } from "@panoraexchange/swap-sdk"

const gasless = async () => {
  const quote = await panora.getQuote({
    params: {
      chainId: "1",
      fromTokenAddress:
        "0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b",
      toTokenAddress: "0xa",
      fromTokenAmount: "100",
      toWalletAddress: "YOUR WALLET ADDRESS",
      slippagePercentage: "1",
      integratorFeeAddress: "INTEGRATOR FEE WALLET ADDRESS",
      integratorFeePercentage: "1",
      getRawTransaction: true,
    },
    withFeePayer: true,
  })

  const formattedPrivateKey = PrivateKey.formatPrivateKey(
    "YOUR PRIVATE KEY",
    PrivateKeyVariants.Ed25519
  )

  const privateKey = new Ed25519PrivateKey(formattedPrivateKey)
  const feePayerAccount = Account.fromPrivateKey({ privateKey })
  const feePayerPublicKey = feePayerAccount.publicKey

  const rawTransaction = quote?.quotes?.[0].rawTransaction

  const feePayerAuthenticator = aptos.transaction.signAsFeePayer({
    signer: feePayerAccount,
    transaction: rawTransaction,
  })

  const executeQuoteResponse = (await panora.executeQuote({
    quote: quote,
    privateKey: "YOUR PRIVATE KEY",
    getTxInfo: true,
    feePayerSig: feePayerAuthenticator,
    isSimulationEnabled: true,
    feePayerPublicKey,
  })) as SwapTxResponseWithStatus

  console.log("Transaction Response", executeQuoteResponse)
}
```

### 5. Get Balances

Fetch wallet balances

```typescript
const response = await panora.getBalances({
  walletAddress: "YOUR WALLET ADDRESS",
});
```

### 6. Get Tokenlist

Fetch Panora's Aptos Token List

```tsx
const response = await panora.getTokenList()
```

### 7. Get Prices

Fetch Token Prices

```typescript
const response = await panora.getPrices({
  tokenAddress: ["0xa"],
});

```

## Attribution

Kindly include proper attribution when using the SDK in projects or presentations. Mention “Powered by Panora” wherever applicable.


# Overview

## AI

Panora is built to be consumed by AI agents as much as by humans. This section indexes every surface designed for coding agents (Claude Code, Cursor, Codex, ChatGPT, Gemini) and AI-augmented developer tools.

### What's available

| Surface          | Use it for                                                                                  | Get started                                                                     |
| ---------------- | ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- |
| **MCP Servers**  | Letting an AI assistant read these docs *and* execute swaps / DCA / limit orders            | Docs MCP at `docs.panora.exchange/~gitbook/mcp`; executor MCP via `@panora/cli` |
| **Agent Skills** | Drop-in playbooks that teach Claude Code / Cursor / Codex how to integrate Panora correctly | `npx skills add panora-exchange/agent-skills`                                   |
| **llms.txt**     | Pointing ChatGPT / Claude.ai / Gemini at the entire doc set in one fetch                    | `docs.panora.exchange/llms.txt`                                                 |
| **CLI**          | LLM-friendly command line for swap, DCA, limit, and 15+ other commands                      | `npm install -g @panora/cli`                                                    |

### Which one do I need?

| You're...                                            | Start with                                                                                                          |
| ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
| Building a dApp or bot programmatically              | Agent Skills — gives your AI assistant Panora-specific context (which SDK, exact-match token rules, fee-payer flow) |
| Trading or scripting from the terminal               | CLI + wire its MCP server into Claude Code or Cursor                                                                |
| Asking ChatGPT / Claude.ai about Panora              | Drop them the llms.txt URL                                                                                          |
| Wanting your agent to read the live docs as it works | Add the Docs MCP endpoint                                                                                           |

### Quick start (Claude Code)

```bash
# 1. Install the CLI + executor MCP
npm install -g @panora/cli

# 2. Wire both MCP servers into Claude Code
claude mcp add --scope user --transport stdio \
  -- panora npx -y -p @panora/cli panora-mcp

claude mcp add --scope user --transport http \
  panora-docs https://docs.panora.exchange/~gitbook/mcp

# 3. Install the agent skills (auto-detects Claude Code / Cursor / Codex)
npx skills add panora-exchange/agent-skills

# 4. Verify
claude mcp list
```

Open Claude Code and ask *"Swap 1 APT to USDC on Panora"* — the agent discovers the skill, routes to the executor MCP, and submits on-chain.

### Resources

* 📦 [`@panora/cli`](https://www.npmjs.com/package/@panora/cli) on npm
* 📚 [`panora-exchange/agent-skills`](https://github.com/panora-exchange/agent-skills) on GitHub
* 🔌 [Live Docs MCP endpoint](https://docs.panora.exchange/~gitbook/mcp)
* 📄 [llms.txt](https://docs.panora.exchange/llms.txt) · [llms-full.txt](https://docs.panora.exchange/llms-full.txt)


# MCP Servers

## MCP Servers

Panora ships **two MCP servers**. Install whichever fits your workflow — or both.

| Server            | Transport                        | What it does                                                                                  |
| ----------------- | -------------------------------- | --------------------------------------------------------------------------------------------- |
| **`panora-docs`** | HTTP (hosted)                    | Search + fetch pages from these docs                                                          |
| **`panora`**      | stdio (bundled in `@panora/cli`) | Quote, swap, DCA, limit, prices, tokens, balances — signs and submits with your stored wallet |

### Docs MCP — hosted, no install

```
https://docs.panora.exchange/~gitbook/mcp
```

Two tools: `searchDocumentation(query)`, `getPage(url)`.

#### Claude Code

```bash
claude mcp add --scope user --transport http \
  panora-docs https://docs.panora.exchange/~gitbook/mcp
```

#### Cursor / Claude Desktop / Windsurf

```json
{
  "mcpServers": {
    "panora-docs": {
      "url": "https://docs.panora.exchange/~gitbook/mcp"
    }
  }
}
```

#### claude.ai

Settings → **Connectors** → **Add custom connector** → paste the URL.

### Executor MCP — bundled in @panora/cli

`panora-mcp` is one of the two binaries shipped by [`@panora/cli`](https://www.npmjs.com/package/@panora/cli). Stdio transport. Exposes \~17 tools across swap, DCA, limit, prices, tokens, balances, and account management.

#### Claude Code

```bash
# Public-tier key (works on first run)
claude mcp add --scope user --transport stdio \
  -- panora npx -y -p @panora/cli panora-mcp

# Your own API key (higher rate tier)
claude mcp add --scope user --transport stdio \
  --env PANORA_API_KEY=panora_... \
  -- panora npx -y -p @panora/cli panora-mcp
```

#### Cursor / Claude Desktop / Windsurf

```json
{
  "mcpServers": {
    "panora": {
      "command": "npx",
      "args": ["-y", "-p", "@panora/cli", "panora-mcp"],
      "env": {
        "PANORA_API_KEY": "panora_..."
      }
    }
  }
}
```

### Read-only mode

By default, `panora-mcp` exposes all \~17 tools — including the 5 destructive ones (`execute_swap`, `create_dca`, `cancel_dca`, `create_limit`, `cancel_limit`) that sign and submit on-chain.

To run with **signing disabled**, pass `--read-only` or set `PANORA_MCP_READ_ONLY=1`. Destructive tools are filtered out of `tools/list` entirely (agents don't see them) and any direct call is rejected.

#### CLI flag

```bash
npx -y -p @panora/cli panora-mcp --read-only
```

#### Environment variable (Claude Desktop / Cursor)

```json
{
  "mcpServers": {
    "panora": {
      "command": "npx",
      "args": ["-y", "-p", "@panora/cli", "panora-mcp"],
      "env": {
        "PANORA_MCP_READ_ONLY": "1"
      }
    }
  }
}
```

#### When to use

* **Hosted MCP deploys** (ChatGPT custom GPTs, Claude.ai connectors) where no wallet should ever be present.
* **Demo / shared workstations** — read prices, tokens, balances without signing risk.
* **CI / testing** — verify quote and build paths without touching real funds.

#### What stays available

`quote_swap`, `build_swap_tx`, `get_prices`, `list_tokens`, `search_tokens`, `get_chart`, `get_markets`, `get_balances`, `get_account_info`, `list_crosschain_tokens`, `list_dca_orders`, `list_limit_orders`, `decode_unsigned_tx`. `build_swap_tx` returns unsigned txData the user can sign elsewhere (browser wallet, `panora sign`).

The default mode is **unchanged** — destructive tools remain enabled. Read-only is opt-in.

### Verify

```bash
claude mcp list
```

Both servers should show `connected`.

### Security

The executor MCP can sign transactions with your stored wallet. Per-account `allowMcpAutoSign` gate (default ON when you import an account); pass `--no-allow-mcp-auto-sign` on `panora account import` to require manual signing. Every sign/submit appends to `~/.local/state/panora/audit.log`. Use a wallet with limited funds for AI-driven trading.

### Related

* Agent Skills — playbooks that teach your agent which MCP tool to call.
* CLI — the command-line companion to the executor MCP.
* [`@panora/cli`](https://www.npmjs.com/package/@panora/cli) on npm.


# Agent Skills

## Agent Skills

Agent Skills are Markdown files (`SKILL.md`) that AI coding agents load on demand. They teach the agent how to integrate Panora correctly — which package, which method, exact-match token rules, fee-payer flow, error catalog.

Source repo: [`panora-exchange/agent-skills`](https://github.com/panora-exchange/agent-skills).

### Install

```bash
# All four skills (auto-detects Claude Code / Cursor / Codex)
npx skills add panora-exchange/agent-skills

# Or one at a time
npx skills add panora-exchange/agent-skills --skill panora
npx skills add panora-exchange/agent-skills --skill panora-sdk
npx skills add panora-exchange/agent-skills --skill panora-widget
npx skills add panora-exchange/agent-skills --skill panora-rest
```

The `skills` CLI ([vercel-labs/skills](https://github.com/vercel-labs/skills)) clones the repo and symlinks the SKILL.md files into `~/.claude/skills/`, `~/.cursor/skills/`, `~/.codex/skills/` etc.

### What each skill covers

| Skill               | Audience                                      | The agent loads it when...                                    |
| ------------------- | --------------------------------------------- | ------------------------------------------------------------- |
| **`panora`**        | Traders, ops devs, agents using the CLI / MCP | "Swap APT to USDC", "create a DCA", "list my limit orders"    |
| **`panora-sdk`**    | Node / browser app developers                 | "Integrate `@panoraexchange/swap-sdk`", "do a fee-payer swap" |
| **`panora-widget`** | Frontend engineers embedding swap UI          | "Embed Panora swap in my Next.js app"                         |
| **`panora-rest`**   | Python / Go / Rust / curl devs                | "Call the Panora API from Python"                             |

The agent picks the right skill based on the user's request — you don't pick.

### What's inside a skill

```
skills/<name>/
├── SKILL.md       ← frontmatter (name, description, tags) + main playbook
├── examples.md    ← end-to-end snippets the agent reads on demand
└── reference.md   ← full API reference (panora, panora-sdk)
```

### Manage installed skills

```bash
npx skills list -g                                  # what's installed
npx skills update                                   # pull latest
npx skills remove                                   # interactive
```

### Related

* MCP Servers — skills point at MCP tools; install both for the full experience.
* CLI — the `panora` skill's anchor package.
* [`panora-exchange/agent-skills`](https://github.com/panora-exchange/agent-skills) on GitHub.


# llms.txt

## llms.txt

These docs are published in two LLM-friendly formats following the [llmstxt.org standard](https://llmstxt.org). Point any LLM tool at either URL.

| File                | URL                                                                                | Use when                                                                                                |
| ------------------- | ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
| **`llms.txt`**      | [`docs.panora.exchange/llms.txt`](https://docs.panora.exchange/llms.txt)           | You want a **structured index** — page titles, descriptions, links. The LLM follows the links it needs. |
| **`llms-full.txt`** | [`docs.panora.exchange/llms-full.txt`](https://docs.panora.exchange/llms-full.txt) | You want the **entire docs corpus** inline. Best for deep RAG and offline ingestion.                    |

### Per-page markdown

Every page on docs.panora.exchange is also available as raw markdown — append `.md` to any URL:

```
https://docs.panora.exchange/developer/swap/sdk.md
https://docs.panora.exchange/product-suite/dca.md
```

Or send the request with `Accept: text/markdown`.

### How to use

#### ChatGPT / Claude.ai

> Read <https://docs.panora.exchange/llms-full.txt> and answer questions about Panora.

#### Custom GPT / Claude Project instructions

> Reference the Panora docs at <https://docs.panora.exchange/llms.txt> — fetch the linked pages as needed.

#### RAG pipeline

```bash
curl https://docs.panora.exchange/llms-full.txt > panora-docs.md
# Chunk, embed, and index with your tool of choice.
```

### Why this matters

LLMs work better with Markdown than HTML — higher signal density, no nav/footer/script noise eating context. Pointing your agent at `llms-full.txt` instead of scraping HTML cuts token usage by roughly 80%.

### Auto-generated

Both files regenerate automatically whenever a docs page changes. Zero maintenance — the page descriptions you see on the live site are what populate `llms.txt`.

### Related

* Agent Skills — structured playbooks layered on top of these docs.
* MCP Servers — for live, queryable access to the same content.


# CLI

## CLI

[`@panora/cli`](https://www.npmjs.com/package/@panora/cli) is a TypeScript CLI that ships two binaries from one npm package:

| Binary           | What it is                                                              |
| ---------------- | ----------------------------------------------------------------------- |
| **`panora`**     | Human / scripting CLI with `--json` output mode                         |
| **`panora-mcp`** | Stdio MCP server for AI agents (Claude Code, Cursor, Codex, Gemini CLI) |

Designed to be LLM-friendly: non-interactive, JSON-native, deterministic output, no TTY prompts mid-command.

### Install

```bash
npm install -g @panora/cli

# Or run without installing
npx @panora/cli --help
npx -y -p @panora/cli panora-mcp     # start the MCP server
```

### First run

The CLI ships with a bundled shared API key — works on a fresh machine, no setup.

```bash
panora quote APT USDC 1 --json
panora prices APT USDC --json
panora tokens ls --json
panora whoami
```

Bring your own key for a higher tier:

```bash
panora apikey set panora_...
```

### Command groups

| Group             | Description                                     |
| ----------------- | ----------------------------------------------- |
| `panora swap`     | Execute a swap — signs and submits              |
| `panora quote`    | Get a swap quote (read-only)                    |
| `panora dca`      | DCA orders — create / list / cancel             |
| `panora limit`    | Limit orders — create / list / cancel           |
| `panora prices`   | Live token prices                               |
| `panora tokens`   | List / search / info                            |
| `panora balances` | Wallet balances                                 |
| `panora markets`  | Markets / terminal data                         |
| `panora charts`   | Chart pair mappings                             |
| `panora account`  | `add` / `import` / `generate` / `ls` / `remove` |
| `panora config`   | Manage CLI config                               |
| `panora apikey`   | Manage the Panora API key                       |
| `panora whoami`   | Show the active wallet                          |
| `panora sign`     | Sign an unsigned tx                             |

Run `panora <group> --help` for sub-command detail.

### Use as an MCP server

The same CLI install gives you `panora-mcp`. Wire it into Claude Code:

```bash
claude mcp add --scope user --transport stdio \
  -- panora npx -y -p @panora/cli panora-mcp
```

Full setup for every client → MCP Servers.

### Pair with the agent skill

```bash
npx skills add panora-exchange/agent-skills --skill panora
```

Now your agent knows when to use which command vs. which MCP tool.

### Resources

* [`@panora/cli` on npm](https://www.npmjs.com/package/@panora/cli)
* [README — auth chain, storage model, security](https://github.com/panora-exchange/cli)
* [Agent skill source](https://github.com/panora-exchange/agent-skills)s


# Become Our Partner

We’re open to exploring partnership opportunities with other projects across the Aptos ecosystem and beyond. By collaborating, we can enhance each other’s offerings and deliver a superior user experience.

If you are interested in partnering with Panora, please reach out to us via Discord or e-mail at <team@panora.exchange>.&#x20;

For other inquiries or more information, feel free to contact us through our [official channels](https://docs.panora.exchange/official-links). We’re happy to discuss how we can work together!


# Media & Brand Kit

Media & Brand Kit - <https://panora.exchange/media-kit>


# Panora Help

**1) What is Panora?**

[Panora ](https://panora.exchange/)is a one-stop trading hub, aggregating all liquidity on Aptos. Panora's DeFi suite unlocks the full potential of decentralized finance through an integrated protocol network, ensuring efficient transactions via smart systems.&#x20;

**2) What are Panora's product offerings?**

Panora' current product suite consists of:

* **Panora Swap:**
  * A Meta-DEX Aggregator that consolidates liquidity from AMMs, CLAMMs, CLOBs, LSDs, and also other DEX aggregators.
  * Offers the most competitive trading rates through advanced routing strategies like multi-hop and transaction splitting.
* **Panora Flows:**
  * Unifies bridge and DEX aggregation in one sleek, intuitive interface empowering users to move and swap assets across 10+ blockchains into Aptos with ease.&#x20;
* **Panora Terminal:**
  * Aptos' all-in-one command center for analytics and trading. It combines advanced on-chain insights, real-time data feeds, and swap execution into a single powerful interfac with integrated portfolio view and best-rate swap execution via Panora Swap.
* **Panora API and SDK's:**
  * Developer-friendly APIs and SDKs for the entire Panora product suite, Aptos token list and price feeds.

**3) What is Panora's mission?**

Our mission is to empower individuals to unlock the full potential of DeFi by offering innovative solutions and cutting-edge technology and to solve their DeFi needs without having to know the intricacies of DeFi.

**4) Who is the team behind Panora?**

Our leadership team comprises forward-thinking individuals with a wealth of experience in DeFi, AI research, software development, and strategic vision. Our dedicated team of engineers, designers, and creatives are the backbone of Panora. Fueled by a passion for cutting-edge technology, they work tirelessly to enhance user experiences and drive the evolution of our platform.

**5) Is Panora live yet?**

Yes, Panora is live on Aptos Mainnet and can be accessed at [https://app.panora.exchange](https://app.panora.exchange/swap).&#x20;

**6) Where can I learn more about Panora?**

We're glad you're interested in learning more about Panora. We recommend reading our Medium articles (<https://medium.com/@panoraexchange>) and following us on Twitter (<https://twitter.com/PanoraExchange>) to learn more about what we are building at Panora. Our gitbook would soon be updated with more reading resources.

**7) I'm interested in partnering with Panora, how can I get in touch with the team?**

We are super excited that you wish to partner with us. For any partnership related requests, please raise a ticket on Discord.&#x20;

**8) How can I provide user or technical feedback to the team?**

Panora greatly values user feedback and ensures to incorporate valuable feedback into the product at the earliest. Please drop your feedback in the #feedback channel on Discord or fill our feedback form directly on our app for any reports on bugs, feature requests or general comments.

**9) Is there a token or airdrop for Panora?**

Currently, there is no token sale or airdrop. Anyone claiming this is a scam. Please report such instances in the respective communication channels.

**10) Are there any Panora bounty or rewards programs?**

There are various  programs that are planned in the near future. Follow us on Twitter or stay updated through announcements channel on Discord for any upcoming bounty or reward programs.


# Legal Disclaimer

Please read this disclaimer carefully before using <https://panora.exchange/> and/or any of its sub-domains (hereinafter referred to as the "Website").

By using the Website, you confirm that you accept this legal disclaimer and agree to comply with it. If you do not agree, you must not use the Website.

## Information published is not advice

The information provided on the Website does not constitute investment advice, financial advice, trading advice, or any other sort of advice, and you should not treat any of the Website's content as such. Our team provides the Website as a service to the public, and is not responsible for, and expressly disclaims all liability for, damages of any kind arising out of use, reference to, or reliance on any information contained within the Website. While the information contained within the Website is periodically updated, no guarantee is given that the information provided in the Website is correct, complete, and up-to-date.

### Usage risks

The Website will not be responsible for any losses, damages, or claims arising from events falling within the scope of events like, but not limited to: mistakes made by the user (e.g., payments sent to wrong addresses), software problems of the Website or any related software or service (e.g., malware or unsafe cryptographic libraries), technical failures (e.g., hardware wallets malfunction), security problems experienced by the user (e.g., unauthorized access to wallets), actions or inactions of third parties (e.g., bankruptcy of service providers, information security attacks on service providers, and fraud conducted by third parties).

## Investment risks

The investment in cryptocurrencies can lead to loss of money and prices having large range fluctuations. The information published on the Website cannot guarantee no money loss.

The Website user is responsible for understanding these risks, doing own due diligence, and making own decision on how to interface with the Website.

### Compliance with tax obligations

The users of the Website are solely responsible to determinate what, if any, taxes apply to their cryptocurrency holdings. The owners of, or contributors to, the Website are NOT responsible for determining the taxes that apply to user transactions.

### No warranties

The Website is provided on an "as is" basis without any warranties of any kind regarding the Website and/or any content, data, materials and/or services provided on the Website.

The Website functionality is not guaranteed and could be disabled fully or in part without prior notice.

## Security

Security audits don't eliminate risks completely. The Website is not guaranteed to be secure or free from bugs or viruses.

### Limitation of liabilities

Unless otherwise required by law, in no event shall the owners of, or contributors to, the Website be liable for any damages of any kind, including, but not limited to, loss of use, loss of profits, or loss of data arising out of or in any way connected with the use of the Website.

## Arbitration

The user of the Website agrees to arbitrate any dispute arising from or in connection with the Website or this disclaimer, except for disputes related to copyrights, logos, trademarks, trade names, trade secrets or patents.


# Brand & Logos

Panora's Brand Assets, including the Panora logo, wordmark, and other visual materials, are copyrighted and should be used in accordance with the following guidelines:

#### **Permitted Uses**

* Referring to Panora's products and services.
* Linking to Panora's official site or products, such as "Trade on Panora."
* Announcing an official partnership with Panora, with approval from Panora's team.

#### **Prohibited Uses:**

* Using Panora's Brand Assets in your products' name, logo, NFTs, etc.
* Using Panora's logos in whole or in part as part of your products' logos, marketing material, website, or other.
* Creating digital or physical products for sale that use Panora's Brand Assets, including merchandise, NFTs, and other products.
* Creating derivative names that imply official endorsement, such as "Panorama"
* Changing or adapting Panora's Brand Assets in any way.

Please use your creativity and common sense when incorporating Panora's Brand Assets into your projects. If you have any questions or need further clarification, please contact us at <team@panora.exchange>.

You can download our logos from our brand kit [here](https://panora.exchange/media-kit).&#x20;


# Terms and Conditions

Last Updated Date: 27th Oct 2025

### INTRODUCTION&#x20;

IntelGPT Technologies Pte Ltd., a company incorporated under the laws of the Singapore including its affiliates and subsidiaries worldwide (hereinafter referred to as “Panora”, “we”, “us” or “our”) is committed to protecting its users’ (as defined below) (“you”, “your” or “user(s)”) privacy and implementing appropriate security measures.  We appreciate the trust you place in us while visiting, accessing and/or using Panora’s (a) website <https://panora.exchange/>; and (b) application [https://app.panora.exchange](https://app.panora.exchange/swap); (c) all associated subpages and subdomains associated with or linked thereto by Panora, collectively with any materials, tools, protocols and services available therein, and successors website(s) or application(s) thereto (collectively, the “Platform”). The Platform is a decentralized, non-custodial web interface built on the Aptos blockchain that provides users with access to advanced decentralized trading features, including optimized token swaps, cross-chain asset transfers, and real-time analytics. The Platform integrates decentralized protocols (the “Protocol”) designed for both experienced traders and DeFi enthusiasts. Panora delivers superior capital efficiency and intelligent liquidity routing through its integrated suite of products and innovative technology.&#x20;

These Terms and Conditions (“Terms”) govern your access to and use of the Platform.

PLEASE READ THESE TERMS CAREFULLY BEFORE USING THE PLATFORM OR THE SERVICES. THESE TERMS GOVERN YOUR USE OF THE PLATFORM AND ALL RELATED SERVICES OFFERED BY PANORA, UNLESS INTENDED OTHERWISE UNDER A SEPARATE WRITTEN AGREEMENT EXECUTED WITH YOU, SPECIFICALLY FOR SUCH PURPOSE. WE ARE ONLY WILLING TO PROVIDE THE PLATFORM AND SERVICES TO YOU IF YOU ACCEPT THESE TERMS IN THEIR ENTIRETY. BY ACCESSING OR USING THE PLATFORM AND/OR THE SERVICES, OR ANY PART THEREOF, YOU CONFIRM THAT YOU HAVE READ AND UNDERSTOOD THESE TERMS, AND ACCEPT AND AGREE TO BE BOUND BY AND COMPLY WITH THESE TERMS IN THEIR ENTIRETY. IF YOU DO NOT AGREE WITH THESE TERMS, THEN YOU MUST REFRAIN FROM ACCESSING OR USING THE PLATFORM OR THE SERVICES.&#x20;

If you are accepting these Terms on behalf of a company or other legal entity, you represent and warrant that you have the authority to bind such an entity to these Terms, in which case “you” or “your” will refer to that entity. If you do not have such authority, or if you do not accept all of these Terms on behalf of the entity, we are unwilling to provide you with access to the Services or Platform. These Terms, together with the Privacy Policy, and any other policies made available by Panora from time to time, constitute the entire agreement between you and Panora and supersede all prior understandings regarding the Platform and Services. While Panora may occasionally interrupt Platform access for maintenance, updates, or upgrades, sometimes without prior notice, it will strive to minimize disruption and prioritize off-peak scheduling. The failure to enforce any provision of these Terms shall not be deemed a waiver unless explicitly stated in writing by Panora. If any provision is found unenforceable, the remainder will remain valid and enforceable. You may not assign your rights or obligations without Panora’s prior written consent, while Panora may assign its rights freely. These Terms do not establish any partnership, joint venture, employment, or agency relationship between you and Panora, and neither party has authority to bind the other. The provisions of these Terms that by their nature should survive termination, including but not limited to indemnity, disclaimers, limitations of liability, intellectual property rights, governing law, dispute resolution and miscellaneous provisions, shall survive any termination or expiration of these Terms.

“User(s)” means any individual, company, legal entity, protocol, smart contract system, or other participant that (i) accesses, visits, or uses the Platform for trading, swapping, bridging, or other services (including end-users of the Platform), or (ii) integrates, connects, or makes available its decentralized exchange protocol, liquidity source, smart contracts, APIs, SDKs, or related technology to or through the Platform (including integration partners or protocol providers).

### DISCLAIMER

1. General Risk Acknowledgement&#x20;

You acknowledge and agree that using the Platform involves significant risks. The Platform provides advanced decentralized trading Services — built on the Aptos blockchain and integrated with multiple liquidity sources and protocols. These Protocol are inherently volatile and experimental.&#x20;

The value of any digital assets you swap, bridge, or trade via Platform may experience rapid and unpredictable fluctuations due to market volatility, liquidity constraints, smart contract vulnerabilities, Protocol failures, regulatory changes, or external exploits.&#x20;

While Panora leverages Aptos’ high throughput and security features, risks associated with blockchain technology and third-party protocols remain. Before engaging with Panora’s products such as Swap, Flows, Terminal, you should carefully evaluate your financial situation, risk tolerance, technical knowledge, and investment goals. There is a risk of partial or total loss of your funds, and you should only use Platform if you fully understand and accept these risks.&#x20;

You expressly agree that you assume all risks in connection with your access to and use of the Platform. Additionally, you expressly waive and release us from any and all liability, claims, causes of action, or damages arising from or in any way relating to your access to and use of the Platform.&#x20;

You acknowledge and agree that risk assessment may be conducted using Third-Party Services to monitor wallet addresses and/or other content for non-compliant behavior based on publicly available information. We reserve the right to block or restrict access of the wallet address associated with such illicit activity. We hold no liability for such assessment, restriction, results, or accuracy of the Third-Party Services.

2. No Advisory or Fiduciary Relationship By using the Platform, you expressly acknowledge that:
   1. Panora or the Platform does not act as your financial advisor, fiduciary, broker, or agent in any capacity.
   2. No communication, interface, or content on the Platform constitutes investment, financial, legal, or tax advice.
   3. Platform does not conduct suitability checks, risk assessments, or appropriateness evaluations in relation to any strategy or transaction.
   4. You are solely responsible for all decisions related to the use of leverage, asset allocation, risk selection, and closing of positions.
   5. You agree that no aspect of the Platform shall be interpreted as a solicitation to invest, trade, or participate in any financial product.
3. Informational Nature of Platform Content&#x20;

All content and data presented through Platform including but not limited to, token swap rates, liquidity sources, routing paths, protocol integrations, real-time analytics, third-party metrics, transaction histories, charts, and risk indicators are provided solely for informational and illustrative purposes. Specifically:&#x20;

* This information does not constitute financial, investment, or trading advice, nor is it a recommendation or endorsement of any asset, strategy, or protocol.&#x20;
* Content may be inaccurate, incomplete, outdated, or based on third-party sources outside Panora’s control.&#x20;
* Some data may reflect simulated, hypothetical, or projected outcomes that do not guarantee actual results.&#x20;
* Users should not rely solely on this information for making investment, trading, or financial decisions. Users are strongly encouraged to conduct their own independent research, perform due diligence, and assess risks before engaging in any token swaps, cross-chain transactions, or other DeFi activities through Panora’s Platform.

4. User Responsibility&#x20;

You are solely responsible for:&#x20;

* Assessing whether the swap rates provided by Panora along with any Protocol integration available through Platform aligns with your individual financial situation, investment objectives, and risk tolerance;&#x20;
* Understanding how Protocols, smart contracts, and blockchain networks especially on Aptos and integrated chains function before engaging with Panora’s Platform;&#x20;
* Actively monitoring your swaps, cross-chain transactions, including managing your own risk parameters and liquidity;&#x20;
* Bearing all financial losses, opportunity costs, and risks arising from your use of Panora’s Platform, smart contract interactions, and related services; Acknowledging that Panora disclaims any liability for direct or indirect losses resulting from your use of the Platform, including frontend access, backend smart contracts, APIs, or third-party integrations.&#x20;
* Completing Know Your Client (KYC) and Know Your Business (KYB) checks, if applicable, through a third-party provider to access certain products and/or features. Your refusal to provide requested information may result in access restrictions.

5. No Guarantee of Performance or Outcome&#x20;

You understand and agree that Panora provides no guarantee of

* 15\. Any return on investment, or capital preservation;&#x20;
* Execution quality, Protocol uptime, or protection against market movements;&#x20;
* Protocol solvency, collateral valuation methods, or timely liquidation avoidance.&#x20;
* Use of the Platform is at your sole discretion and risk. You are encouraged to consult with licensed professionals before allocating significant capital.

6. Prohibited Uses&#x20;

You agree not to:&#x20;

* Use the Platform in violation of any applicable law or regulation;&#x20;
* Exploit or abuse any vulnerability, mispricing, or error in Panora’s frontend or backend smart contract logic;&#x20;
* Engage in wash trading, market manipulation, Sybil attacks, or exploit Panora’s systems for personal gain;&#x20;
* Circumvent access controls or create multiple accounts for the purpose of evading limits or gaming the system.&#x20;

Any funds misappropriated through such prohibited conduct shall be treated as void and subject to recovery without limitation. Panora reserves the right to restrict or disable access in such events.

7. Panora is a blockchain-based software interface that enables users to interact directly with decentralized protocols available on public networks. Panora does not operate as a broker, exchange, payment service provider, custodian, or wallet service, and does not at any time have possession, control, or custody of user assets or private keys. All transactions are executed by the user, from the user’s self-custodial wallet, directly with third-party protocols.
8. Panora does not issue, create, or offer digital payment tokens (as defined under applicable laws), nor does it provide services for the exchange of such tokens for fiat currency or other tokens on behalf of users. Any digital assets displayed or accessible through the Platform are the sole responsibility of the underlying Protocol or network.
9. At no point does Panora:   \
   (a) receive or hold user funds,   \
   (b) store, safeguard, or manage private keys,   \
   (c) have the ability to freeze, reverse, or otherwise affect the movement of digital assets.   \
   The user retains full control over their assets at all times.
10. All interactions with the Platform require the user to connect and use a self-custodial wallet. Transactions occur only when initiated and cryptographically signed by the user. Panora cannot, and does not, execute any transaction on behalf of a user without such action.
11. Panora is not licensed, registered, or regulated as a digital payment token service provider, money transmitter, payment services provider, or equivalent in any jurisdiction. The Platform is provided strictly as a technology service and may not be used in jurisdictions where such use would be unlawful or subject to licensing.
12. The Platform may display or facilitate access to independent Protocols, liquidity sources, or smart contracts. Panora does not own, control, operate, or endorse such third parties and is not responsible for their performance, security, or compliance. Users engage with such Protocols entirely at their own discretion and risk.
13. Users are solely responsible for ensuring that their use of the Platform complies with all applicable laws and regulations in their jurisdiction, including, without limitation, any digital asset, securities, tax, and anti-money laundering laws.
14. Panora confirms that:
    1. Panora does not custody user assets.
    2. Panora does not transmit, exchange, or broker digital payment tokens (DPTs).
    3. Panora does not solicit or facilitate fiat-to-crypto or crypto-to-fiat transactions.
    4. Users interact solely with open-source smart contracts, fully under their own discretion.
    5. Panora does not qualify as a DPT service provider under the Payment Services Act 2019.
    6. The Platform does not require a license under current MAS regulations based on current business activities.
    7. This position is monitored continuously. If changes in activity or regulatory scope occur, Panora will assess its obligations and update users accordingly.

### INTERPRETATIONS

1. Modifications: We reserve the right to change or modify these Terms at any time and at our sole discretion. Any changes to or modifications of these Terms will be in effect as of the “Last Updated Date” referred to at the top. You should review these Terms before using any Services. You agree and understand that by using the Services after the “Last Updated Date”, you accept and agree to the revised Terms.
2. Comprehensive Agreement: These Terms, along with the Privacy Policy available at: docs.panora.exchange (the “Privacy Policy”) and any rules outlined on the Platform, constitute a legally binding and enforceable agreement between Panora and you, as User of the Platform and the Services. These Terms supersede any prior or contemporaneous negotiations, discussions, agreements, understandings, representations, and warranties, whether written or oral, between you and us regarding the subject matter.
3. Headings: The headings and subheadings in the Terms are for ease of reference only and are not to be taken into account in the construction or interpretation of any provision or provisions to which they refer.
4. Extended meaning: Unless otherwise specified in these Terms, words importing the singular include the plural and vice versa and words importing gender include all genders. The word “include”, “includes” or “including” will be interpreted on an inclusive basis and be deemed to be followed by the words “without limitation”.

The language in these Terms will be interpreted as to its fair meaning, and not strictly for or against any party.

### ELIGIBILITY

1. Eligibility Criteria&#x20;

To access and use the Platform and Services, you represent and warrant that you:

* are an individual, company, entity, or other legal organization with full legal capacity, power, and authority to enter into and comply with these Terms;
* if acting on behalf of a legal entity, are duly authorized to bind that entity to these Terms;
* are not located in, incorporated in, or operating from any jurisdiction where accessing or using the Platform would:
  * be in violation of applicable law or regulation, or
  * cause Panora or any third party to be in contravention of such laws or regulations; and
* are not a person or entity listed on any government or international sanctions list, including but not limited to those maintained by:
  * the United Nations Security Council,
  * the U.S. Department of the Treasury’s Office of Foreign Assets Control (OFAC),
  * the European Union and its member states,
  * the United Kingdom,
  * or any other relevant governmental authority.

2. Restricted Jurisdiction&#x20;
   1. The use of the Platform and Services is strictly prohibited in the following jurisdictions, including where sanctions, embargoes, or legal restrictions are in force (“Restricted Jurisdictions”): Algeria, Afghanistan, Albania, American Samoa, Antigua, Belarus, Bolivia, Burma (Myanmar), Central African Republic, China, Cuba, Democratic Republic of Congo, Guam, Iran, Iraq, Ivory Coast, Liberia, Libya, Morocco, Nepal, North Korea, Northern Mariana Islands, Pakistan, Puerto Rico, Somalia, South Sudan, Sudan, Syria, Ukraine, Yemen, and Zimbabwe.
   2. By accessing or using the Platform, you represent and warrant that you are not a resident, citizen, tax resident, or agent of any of the above-listed countries or regions.
   3. If it is determined, or reasonably suspected, that you are accessing or have accessed the Services from a Restricted Jurisdiction, or in violation of applicable sanctions or laws: (a) Panora may, in its sole discretion and without prior notice, restrict, suspend, or permanently terminate your access to the Services; (b) you will be deemed to have committed a material breach of these Terms; (c) Panora shall have no liability to you for any losses, damages, or claims arising from such restriction, suspension, or termination; and (d) you agree to indemnify and hold harmless Panora, its affiliates, and contributors from any claims, liabilities, or damages arising from your breach of this clause. Panora reserves the right to update, expand, or amend the list of Restricted Jurisdictions at any time and without notice. You are responsible for reviewing these Terms periodically to ensure ongoing compliance.
3. No Circumvention

   You agree that:

   1. Use of VPNs, proxies, or similar services to bypass jurisdictional or geographic restrictions imposed by Panora is strictly prohibited;
   2. Doing so will constitute a material breach of these Terms and may result in immediate suspension or termination of your access to the Platform;
   3. Panora reserves the right to update the list of Restricted Jurisdictions or modify eligibility criteria at its sole discretion, with or without prior notice, especially in response to legal, regulatory, or operational requirements.
4. Your Responsibility for Legal Compliance

   You are solely responsible for:

   1. Ensuring that your use of the Platform is compliant with all local laws and regulations applicable in your jurisdiction;
   2. Determining the legality of your actions in accessing or using any Services;
   3. Indemnifying and holding harmless Panora for any liability, claim, damage, or loss resulting from your violation of jurisdictional or eligibility requirements.

### ABOUT THE PLATFORM

1. Panora offers a cutting-edge decentralized trading Platform built on the Aptos blockchain, designed to empower users with efficient, transparent, and optimized access to  the Protocol. By leveraging Aptos’ high-performance architecture, which offers low latency, high throughput, and advanced parallel transaction processing, Panora delivers fast and cost-effective trade executions. The Platform aggregates liquidity from a diverse range of sources, including automated market makers (AMMs), order books, concentrated liquidity pools, liquid staking derivatives, and other decentralized exchange aggregators. This aggregation ensures that users receive the best available prices and optimal trading routes.
2. Panora is committed to enhancing the DeFi experience through an intuitive interface, advanced routing algorithms, and comprehensive tools that cater to both novice and professional traders. It integrates multiple product offerings, including token swaps, cross-chain bridging, analytics, and developer APIs within a seamless ecosystem.
3. By combining cutting-edge blockchain technology with innovative product design, Panora aims to redefine how users trade in the decentralized world.

### SERVICES OFFERED

Panora provides a decentralized, non-custodial suite of DeFi-native tools purpose-built for the Aptos blockchain. Designed for sophisticated DeFi participants, institutional traders, and experienced investors, Panora’s services are modular, capital-efficient, and optimized to abstract complexity into curated, one-click strategies. The Platform currently offers the following core modules (the “Services”):

1. Swap — The Superior Swapping Experience (“Panora Swap”)

Panora Swap is a Meta-DEX aggregator that consolidates liquidity from a wide array of sources, including Automated Market Makers (AMMs), Concentrated Liquidity AMMs (CLAMMs), Onchain Order Books, Liquid Staking Derivatives (LSDs), and other DEX aggregators. This allows users to access the most competitive trading rates by utilizing advanced routing strategies such as multi-hop transactions and trade splitting.

Key Features:

* Optimal Routing: Panora compares rates across integrated liquidity sources to find the best trading paths, maximizing returns and minimizing slippage.
* Transaction Splitting: Large trades are split across multiple DEXs to optimize pricing and reduce liquidity impact.
* Multi-Hop Functionality: Complex trades across multiple tokens and DEXs can be executed within a single transaction, saving time and gas fees.
* User-Centric Design: The Platform offers an intuitive interface with advanced filtering options, empowering users of all experience levels to trade effectively.

Panora Swap supports integration with multiple liquidity sources and wallets within the Aptos ecosystem, providing a secure, efficient, and transparent trading experience for everything from simple token swaps to sophisticated arbitrage strategies.

2. Flows — Cross-Chain Asset Movement and Swapping (“Panora Flows”)

Panora Flows is the cross-chain engine that enables Aptos traders to move and swap assets seamlessly across 10+ blockchains. Bridging is facilitated through trusted bridge service providers, and once assets arrive on Aptos, swaps are executed through Panora’s integrated liquidity sources. This ensures users benefit from best-price execution, minimal slippage, and a unified trading experience—without reliance on third-party cross-chain swap providers.&#x20;

Key Capabilities:

* Intelligent Liquidity Aggregation: Liquidity is aggregated and compared across multiple decentralized exchanges to ensure users receive the best market rates.
* Multi-Chain Support: Facilitates asset movement and swapping across diverse blockchain ecosystems.
* Unified Transaction Tracking: Enables users to monitor cross-chain transaction statuses from initiation through completion within one interface.

3. Terminal — Aptos’ All-in-One Trading Command Center (“Panora Terminal”)

Panora Terminal is a comprehensive dashboard for Aptos DeFi analytics and trading, combining real-time on-chain data feeds, token analytics, portfolio management, and direct swap execution powered by Panora Swap.

Key features:

* Overview & Data Dashboard: Live tracking of token prices, liquidity, market caps, and other key metrics.
* Category Filters: Ability to sort tokens by categories such as Meme Coins, Native Assets, Trending, Gainers, Losers, and custom filters like Favorites.
* One-Click Buy: Instant swap execution with a single click.
* Trending Bar: Real-time updates on hot tokens and market movers.
* Portfolio Overview: Displays real-time token balances, market values, and performance metrics.

A fee of one percent (1%) is applied by Platform on transactions executed via the Panora Terminal interface.

4. APIs (Application Programming Interface) and SDKs (Software Development Kit) — Developer Tools

Panora offers developer-friendly APIs and SDKs that provide access to the full product suite, including token lists and price feeds on Aptos. These tools enable seamless integration for developers building applications on top of Panora’s infrastructure.

5. DCA — Automated Recurring Investment (“Panora DCA”)

Panora DCA enables users to invest consistently and systematically by setting up recurring token purchases at fixed intervals. The Platform automates the execution of these orders directly on-chain, smoothing out price volatility and removing the need for constant market monitoring.

Key Features:

* Automated Recurring Orders: Users can schedule recurring purchases of selected token pairs at customized intervals, enabling disciplined and long-term investment strategies.
* Customizable Strategy: Configure order amount, frequency, and total number of purchases to align with your investment plan.
* Secure Execution: Orders are executed reliably and securely on-chain via Panora’s decentralized network of executors, while users retain full custody of their assets until execution.
* User-Friendly Interface: Panora provides an intuitive dashboard to create, monitor, adjust, or cancel active DCA orders, giving full control over your recurring investment strategy.

Panora DCA integrates seamlessly within the Platform, offering a secure, efficient, and transparent experience for building long-term token positions without manual intervention.

6. Limit Orders — Trade on Your Own Terms (“Panora Limit Orders”)

Panora Limit Orders empower users to execute trades automatically at pre-set prices, giving full control over trading strategies without constant market monitoring. Orders are executed directly on-chain by Panora once the market conditions meet the specified criteria.

&#x20; Key Features:

* Pre-Set Price Execution: Users can define target prices for token pairs. Trades are triggered automatically when the market reaches these prices.
* Customizable Orders: Easily place, update, or cancel limit orders via Panora’s intuitive interface.
* Secure and Non-Custodial: Assets remain fully under user control until a match is found and the trade is finalized.
* Automated Execution: Panora executes trades automatically, potentially allowing users to receive more favorable rates than anticipated.
* User-Friendly Dashboard: The Platform provides a streamlined interface to create, monitor, and manage all active and completed limit orders efficiently.

Panora Limit Orders integrate seamlessly within the Platform, offering a secure, efficient, and transparent experience for automated, price-targeted trading.

### PLATFORM MECHANISM

Panora’s Platform is designed to provide a seamless, secure, and transparent trading experience across multiple products. Each product offers a different trading strategy or functionality, but all follow the same core principles: easy wallet connection, clear transaction configuration, transparent review, and real-time monitoring of activity.

1. Swap

The Swap feature enables instant token-to-token trades within the same blockchain.\
&#x20;Mechanism:

* Connect Wallet – Users begin by connecting their wallet via the “Connect” button on the interface.
* Select Token Pair – Choose the token to sell and the token to buy from supported assets.
* Enter Amount – Specify the trade amount.
* Review and Confirm – The interface displays expected output, price impact, and fees before confirmation.
* Execution and Settlement – Once confirmed, the trade executes instantly on the same network, and the output tokens are credited to the wallet.

History – Users can track completed swaps in the transaction history panel.<br>

2. Cross-Chain Swap (Panora Flows)

The Cross-Chain Swap feature allows users to bridge assets across 10+ blockchains, with swaps executed using Panora’s integrated liquidity.

Mechanism:

* Connect Wallets – Users connect both source and destination wallets. Platform prompts to switch if connected to the wrong network.
* Configure Transaction – Select source chain, destination chain, token pair, and amount.
* Routing – Platform selects the optimal bridging path via supported bridge providers, then executes swaps using integrated liquidity sources on Panora.
* Review and Confirm – Users are shown estimated output, fees, and settlement times.
* Execution and Monitoring – Transaction progresses through bridging, arrival, and swap stages, tracked in real time.

History – Outcomes marked as Success or Failed (reverted), with transparent records available.

3. Limit Orders&#x20;

Limit Orders allow traders to set a target price for a trade, executed automatically once conditions are met.

Mechanism:&#x20;

* Connect Wallet – Start by connecting your wallet via “Connect.”&#x20;
* Select Token Pair & Amount – Choose token pair and specify amount.&#x20;
* Set Price & Expiry – Enter desired execution price and order validity duration.&#x20;
* Review and Confirm – Confirm order details; order is added to Active Orders.&#x20;
* Execution – When market price matches the set condition, the order executes automatically.
* Completion or Cancellation – Orders are moved to Completed upon fill or can be cancelled manually/automatically on expiry.
* Fees: 1% fees apply to Limit Orders.

4. Dollar-Cost Averaging (DCA)&#x20;

DCA allows traders to accumulate positions over time by scheduling recurring token purchases.

Mechanism:

* Connect Wallet – Start by connecting your wallet via “Connect.”&#x20;
* Select Token Pair & Amount – Choose pair and specify investment amount.&#x20;
* Set Strategy – Define DCA interval (hourly, daily, weekly) and number of orders. Optional custom price ranges can be configured.&#x20;
* Review and Confirm – Confirm strategy details; recurring orders are placed automatically.
* Monitoring – Orders appear under Active Orders and move to Completed when filled.
* Cancellation – DCA strategies can be cancelled at any time.&#x20;
* Fees: 1% fees apply to DCA Orders.

5. Terminal&#x20;

The Terminal is Panora’s advanced trading interface offering pro-level tools for analytics, execution, and strategy management.&#x20;

Mechanism:&#x20;

* Connect Wallet – Start by connecting your wallet.&#x20;
* Access Tools – Utilize advanced charting, on-chain analytics, and trade management features.
* Execute Trades – Place swaps, limit orders, or strategies directly from the terminal.
* Track & Manage – Monitor live and historical activity with professional dashboards.

### FEES AND CHARGES

Panora aims to maintain transparency and fairness in its fee structure across its suite of products. The following outlines the applicable fees and charges that users may incur while using the Panora Platform:

1. Cross-Chain Bridging and Swaps
   1. Bridging Fees: Fees may apply when using third-party bridge providers or protocols. These fees are determined by the respective providers and may vary depending on the network and service used.
   2. Swapping Fees: Panora does not charge any fees on standard token swaps executed solely within the Aptos ecosystem. However, for cross-chain transactions (i.e., bridging plus swapping), Panora charges a 1% fee on swaps executed on the Aptos side of the flow.&#x20;
   3. Network Fees: Standard blockchain gas or network fees apply separately and are charged by the relevant blockchain networks for transaction processing.
2. Terminal Services

   The Platform charges a one percent (1%) fee on all transactions executed through the Panora Terminal interface, including swaps and other trading activities.
3. Limit Orders.

   A fee of one percent (1%) of the executed transaction amount is charged on all Limit Orders placed through the Platform. This fee is deducted automatically upon successful execution of the order.
4. Dollar-Cost Averaging (DCA).

   A fee of one percent (1%) of the executed transaction amount is charged on each recurring order under a DCA strategy. This fee is deducted automatically upon execution of each individual order.
5. API and SDK Integrations.

   Where third-party partners integrate Panora’s services via API or SDK, any fees charged to end users by such partners will be subject to a revenue-sharing arrangement between Panora and the partner, as mutually agreed in advance. The share of fees attributable to Panora will be collected and settled as per the commercial terms agreed with each partner.
6. Additional Notes
   1. All fees are calculated on the transaction amount and are deducted automatically at the time of execution.
   2. Panora does not charge any deposit or withdrawal fees; however, users remain responsible for any gas fees or network costs incurred on the respective blockchains.
   3. Fees are subject to change and users will be notified of any material changes to the fee structure via Platform announcements or updated Terms.
   4. Fees charged by Protocols integrated within Panora’s Platform are beyond Panora’s control.
   5. Panora reserves the right to modify its fee structure at any time. Any material changes will be communicated through Platform announcements and updated Terms prior to taking effect.

### INTELLECTUAL PROPERTY

1. Ownership of Intellectual Property. All rights, titles, and interests in and to the Platform and Services, including but not limited to the software, source code, algorithms, databases, user interfaces, functionality, designs, graphics, audio, video, text, trademarks, service marks, trade names, logos, domain names, and all other proprietary materials or content (“Intellectual Property”) are and shall remain the exclusive property of Panora or its licensors. This includes all improvements, derivative works, modifications, or enhancements, irrespective of any input or Feedback you may provide. Nothing in these Terms conveys to you any ownership or proprietary right in or to the Intellectual Property.
2. Limited License. Subject to your continued compliance with these Terms, Panora grants you a limited, revocable, non-exclusive, non-transferable, and non-sublicensable license to access and use the Platform and Services solely for your personal, non-commercial use. All rights not expressly granted herein are reserved.
3. Prohibited Use

   You agree not to:

   1. Copy, reproduce, distribute, publicly display, publish, modify, translate, adapt, or create derivative works of the Platform or any part thereof;
   2. License, sell, lease, rent, assign, transfer, or otherwise exploit the Platform or Services;
   3. Reverse engineer, decompile, disassemble, or otherwise attempt to discover the source code or underlying technology, except as permitted by applicable law;
   4. Use the Platform or Services for commercial purposes, data scraping, automated data gathering, or unauthorized extraction of information;
   5. Remove, alter, or obscure any copyright, trademark, or proprietary notices displayed within or associated with the Platform or Services.
4. Trademarks and Branding

   All trademarks, logos, service marks, and trade names appearing on the Platform, including but not limited to “Panora” and any related branding, are the property of Panora or its affiliates or licensors. You may not use these marks for any purpose, including advertising or publicity, without prior written consent. Unauthorized use may constitute trademark infringement or unfair competition in violation of applicable laws.
5. User IP and Feedback
   1. User IP: You hereby grant Panora a perpetual, irrevocable, royalty-free, worldwide, and non-exclusive license (with the right to sublicense) to use, reproduce, display, distribute, and adapt any intellectual property you submit, upload, or provide through the Platform (“User IP”) to the extent it: 1. forms part of or is necessary for the operation of the Platform, Services, or any derivative products; and 2. enables Panora to provide access, functionality, or services to you or other users. This includes the right to sublicense such User IP to third-party service providers or affiliates as necessary to deliver the Services.
   2. Feedback: Any ideas, suggestions, bug reports, or recommendations you submit regarding the Platform or Services (“Feedback”) are non-confidential and become the property of Panora. You grant Panora a perpetual, irrevocable, transferable, worldwide, royalty-free license to use, reproduce, modify, publish, translate, distribute, sublicense, and otherwise exploit any such Feedback for any purpose, without obligation or compensation to you.
6. Created IP: All Intellectual Property developed or created in connection with your use of the Platform or Services, including any code, content, features, or functionality (“Created IP”), shall automatically vest in Panora at the time of creation. You hereby irrevocably assign to Panora, with full title guarantee, all right, title, and interest in and to any Created IP, and shall (or shall ensure your agents or contractors shall) promptly execute any further documents or take actions reasonably required to give effect to this clause.
7. Reservation of Rights. Except for the limited rights expressly granted to you under these Terms, no rights or licenses are granted to you under any Intellectual Property of Panora, whether by implication, estoppel, or otherwise.
8. Copyright Infringement – Notice Procedure

   If you believe that any material on the Platform infringes your copyright, you may submit a written notice to us including:

   1. A physical or electronic signature of the rights holder or authorized representative;
   2. Identification of the copyrighted work allegedly infringed;
   3. A description of the infringing material and its location on the Platform;
   4. Your contact information (address, phone number, email);
   5. A good faith statement that the use is not authorized by the copyright owner, agent, or law;
   6. A statement under penalty of perjury that the above is accurate and that you are authorized to act on behalf of the copyright owner.

   Please send all notices to: <team@panora.exchange>

### THIRD PARTY LINKS AND INTEGRATIONS

1. The Panora Platform may include links to, integrations with, or access points for third-party websites, decentralized applications (dApps), Protocols, or other blockchain-based services (collectively, “Third-Party Services”). These are provided solely for user convenience and do not constitute any endorsement, sponsorship, or affiliation between Panora and such Third-Party Services. Panora does not review, monitor, or make any representations regarding the content, functionality, reliability, legality, or suitability of any Third-Party Services.&#x20;
2. By accessing or interacting with Third-Party Services through the Platform, you acknowledge and accept that such interactions are undertaken entirely at your own risk. Panora does not control, and is not responsible for, the content, operations, security standards, or data practices of these Third-Party Services. Your use of any such service is governed solely by the terms, conditions, and policies of the respective third party.
3. You further understand and agree that certain functionalities accessible via the Platform — including but not limited to swapping or exchanging virtual currencies — are provided solely by third-party providers. While Panora may facilitate your access to these services, it is not a party to, and bears no responsibility or liability for, any actions, transactions, failures, or activities of such providers.
4. Panora disclaims all liability for any damages, losses, errors, failures, omissions, or security incidents arising from your use of or reliance on Third-Party Services. This includes, without limitation, services provided by blockchain networks, oracles, lending or borrowing protocols, liquidity pools, or other integrated Platforms. Panora does not guarantee the legality, quality, or performance of any products, tokens, or services offered by third parties.
5. Interacting with Third-Party Services may expose you to elevated risks, including phishing attacks, contract exploits, fraud, smart contract vulnerabilities, or other malicious behavior. You are strongly encouraged to conduct independent due diligence before engaging with any third-party Platform or contract, including reviewing source code (where available), audits, reputation, user feedback, and the security posture of the Protocol. Always verify authenticity and take all necessary precautions to protect your assets and private keys.
6. Third-Party Services may change, suspend, or terminate at any time without notice, and Panora has no control over such decisions. Panora makes no guarantees regarding the availability, functionality, or compatibility of any integrated Third-Party Service and reserves the right to disable or remove any such integration at its sole discretion without prior notice or liability.

### YOUR REPRESENTATION AND WARRANTIES

Before your use of the Platform or Services, and on an ongoing basis, you represent, warrant, covenant and agree that:

1. If you are a legal entity, decentralized protocol, or other organization, you are duly organized, validly existing, and in good standing under the laws of your jurisdiction, and have the full power, capacity, and authority to enter into these Terms and perform your obligations hereunder.
2. You have complied, and will continue to comply, with all applicable laws in connection with your operations and use of the Platform, including AML, CTF, sanctions, securities, consumer protection, tax, and data protection obligations. You are not owned or controlled by any person or entity listed on any sanctions list.
3. Digital assets values can fluctuate greatly in value depending on market conditions; the user is aware of the volatile nature of cryptocurrencies, and holds Panora harmless for any loss or damages arising from such volatility;
4. There is a risk of losing cryptocurrency and other funds of value when using the Service and Platform, Panora has no responsibility to you for any such loss;
5. Your use of the Platform and the Service is at your sole option, discretion, and risk;
6. You have read, understood and accepted the risks associated with the use of the Platform and Services as detailed in this Terms and Privacy Policy. By continuing to use the Platform and Services, you expressly assume all such risks, including but not limited to those relating to system failures, security vulnerabilities, third-party interactions, regulatory uncertainties, and the potential loss of digital assets;
7. You are solely responsible for any applicable taxes which may be payable on any transactions / activity by you through your using the Platform or Service;
8. You will not access or use the Platform or Services to conduct, promote or otherwise facilitate any illegal activities.&#x20;
9. To your knowledge, there are no undisclosed material defects, vulnerabilities, or security risks in any Protocol or integration materials you provide to Panora.
10. The telecommunication networks, blockchain networks, and internet access services required for you to access and use the Platform and Services are entirely beyond the control of Panora, and Panora shall have no liability whatsoever for any outages, slowness, capacity constraints or other deficiencies affecting the same;
11. You are: (i) aged 18 (eighteen) or over, (ii) you are of the age of majority in your jurisdiction and have the full right, power and authority to enter into and comply with these Terms, on behalf of yourself and/or any entity for which you may access the Platform or Services, (iii) you are accessing the Platform and Services from a jurisdiction in which it is legal to do so, (iv) you are not a Politically Exposed Person, nor are you on any applicable sanctions lists or terrorism finance watchlists, including but not limited to those of the U.S. and the E.U., (v) your access and use of the Platform and Services shall comply with all applicable laws and regulations; and (vi) that you will inform Panora immediately if you are placed onto one of these lists or change your residence to a prohibited jurisdiction;
12. In using the Platform and Services, you acknowledge that you are NOT dealing with, and that Panora is NOT operating as and has NO legal duties related to, a crypto-asset service provider, virtual asset service provider, asset manager, brokerage, custodian, exchange, virtual asset trading Platform, investment or financial advisor, loan or credit service provider, money or payment service operator, securities dealer or issuer, or equivalent under the applicable regulations (you should not use the Platform or Services as such, if you require such services or such a service provider);
13. Should you discover a bug or error that may lead to an exploit of the Services, the Platform or other loss of funds from Panora, you have the responsibility to notify Panora at the following email: <team@panora.exchange>, as soon as practicable; any attempt by you to use such a discovered exploit or bug for illicit financial gain is illegal and strictly prohibited under the Terms; such exploits or bugs should be disclosed in a responsible manner and in strict confidence to <team@panora.exchange> and no other entity.
14. All information, documents, and statements you provide to Panora in connection with these Terms are true, accurate, and not misleading in any material respect.
15. Panora reserves the right to prosecute to the fullest extent of the law anyone who exploits or attempts to exploit the Platform or Service in an unlawful manner.

### NO WARRANTIES

1. Panora provides the Platform and Services to you on an “as-is” and “as-available” basis, and disclaims any and all warranties, representations, or guarantees, whether express or implied, including but not limited to any implied warranties of merchantability, fitness for a particular purpose, non-infringement, accuracy, or completeness. Panora does not warrant, guarantee, or represent that the Platform or Services will meet your requirements, operate without interruptions, or be error-free. You acknowledge that Panora makes no representations regarding the quality, reliability, or availability of the Services, and that your use of the Services is solely at your own risk.
2. While Panora will make commercially reasonable efforts to maintain and support the Platform and Services, we do not guarantee or warrant that the Platform or Services will be uninterrupted, error-free, timely, or secure. There may be delays, failures, interruptions, or bugs, which may impact your experience. Panora does not commit to resolving any defects or issues within a specified timeframe, and there is no warranty or guarantee that such issues will be rectified. You acknowledge that the Platform and Services may be subject to periodic maintenance, system upgrades, or unforeseen technical difficulties that may affect their availability and performance.
3. By accessing and using the Platform and Services, you agree to abide by the rules and guidelines as outlined on the Platform. Panora retains full and exclusive authority over the issuance, operation, maintenance, and termination of the Platform and Services. This includes, but is not limited to, the right to manage user access, set policies, determine usage limits, and modify or discontinue the Platform or Services as we deem appropriate. You acknowledge that Panora has full discretion in determining the scope and availability of the Platform and Services provided and reserves the right to change or alter these terms, policies, or the functionality of the Platform and Services at any time.
4. In the event of any disputes or disagreements concerning the use of the Platform or Services, the interpretation of these Terms, or the enforcement of any rules, the decision of Panora shall be final and binding. Panora retains sole discretion in resolving disputes, including any interpretations of the Terms, and such decisions are not subject to appeal or review by any party. You agree that you will not challenge the decisions of Panora, and that you will comply with any instructions or resolutions provided by Panora as part of the dispute resolution process.

### ACKNOWLEDGEMENTS AND RISK DISCLOSURE

By using the Panora Platform, you acknowledge, understand, and agree to the following:

1. Non-Custodial Service – Panora is a non-custodial interface. The Platform does not hold, control, or have access to your funds at any time. All transactions are executed directly from your connected wallet via smart contracts. You are solely responsible for the security of your wallet, private keys, and seed phrases. Loss of access to your wallet will result in permanent loss of assets.
2. Market Risk – Trading in digital assets involves inherent volatility and risks beyond Panora’s control, which may result in receiving more or less value than expected.
3. Execution Risk – Trades executed via Panora are routed to third-party DEXs and liquidity sources. Prices and amounts displayed before execution are indicative only. Actual execution prices may differ due to slippage, price impact, or blockchain conditions.
4. Smart Contract Risk – All transactions are executed via smart contracts, which may contain bugs, vulnerabilities, or exploits. Panora does not guarantee the functionality, accuracy, or security of these contracts.
5. Third-Party Protocol Risk – Panora integrates with external Protocols like DEXs, AMMs, and liquidity pools. The Platform does not control their performance, uptime, fees, or security. Any failure or exploit in these Protocols may result in loss of funds.
6. Oracle/Data Risk – Asset pricing and trade routing may rely on external oracles and data feeds. Inaccurate, delayed, or manipulated data may cause unexpected outcomes or failed transactions.
7. Network Risk – Panora operates on the Aptos blockchain. Network congestion, downtime, or transaction failures may delay or prevent trade execution. Panora bears no responsibility for such disruptions.
8. No Financial Advice – Information on the Platform, including price data, routing suggestions, and liquidity metrics, is for informational purposes only and does not constitute investment, trading, or legal advice. You must conduct your own research before executing trades.
9. Regulatory Compliance – You are solely responsible for ensuring that your use of Panora complies with the laws and regulations of your jurisdiction.
10. No MAS/DPT Safeguards – Panora is not licensed or regulated by the Monetary Authority of Singapore or any other regulator. Users have no access to statutory protections available under regulated Digital Payment Token (DPT) service providers.
11. Beta/Early Access Features – Certain features may be experimental or in beta. Such features are provided “as-is” without warranty and may be changed or removed without notice.
12. User Responsibility – You are solely responsible for verifying trade details, understanding the risks of token swaps, and managing your own positions and assets. Panora is not liable for any losses arising from your use of the Platform.
13. The use of blockchain technology, decentralized finance protocols, and digital payment tokens involves substantial risks, including, but not limited to, market volatility, technical failures, cybersecurity threats, and potential total loss of assets. The user acknowledges and accepts these risks, and agrees that Panora shall have no liability for any loss, damage, or claim arising from such risks.
14. Panora solely provides a user interface and related software tools that enable interaction with publicly accessible blockchain networks and smart contracts.\
    Panora does not:
    1. match or arrange counterparties for the exchange of Digital Payment Tokens (“DPTs”),
    2. intermediate transactions between buyers and sellers,
    3. guarantee execution of any transaction,
    4. maintain an order book or trading Platform functionality that would constitute an “exchange” under applicable law.
15. Panora does not receive, transmit, or transfer DPTs between persons as a business. Any transfer of DPTs occurs solely between a user’s self-custodial wallet and the chosen third-party protocol, without passing through or being controlled by Panora.
16. Where the Platform displays routing paths, liquidity sources, or pricing, this information is algorithmically generated from public blockchain data and is provided solely for informational purposes.
17. Panora does not solicit, negotiate, or otherwise arrange any transaction between counterparties.
18. All Protocols, bridges, or liquidity sources accessible via the Platform operate independently and are not owned, controlled, or operated by Panora.\
    Panora’s inclusion of such access does not constitute participation in, or provision of, any regulated service under the Payment Services Act 2019.
19. Any fees collected by Panora relate exclusively to the use of the Platform’s interface and technology.

Such fees are not tied to the custody, transmission, exchange, or brokerage of DPTs, and are payable regardless of whether a transaction is ultimately executed on any third-party protocol.

### NON-CUSTODIAL AND FIDUCIARY DUTIES

The Platform is purely non-custodial, meaning we do not ever have custody, possession, or control of your digital assets at any time. It further means you are solely responsible for the custody of the cryptographic private keys to the digital asset wallets you hold and you should never share your wallet credentials or seed phrase with anyone. We accept no responsibility for, or liability to you, in connection with your use of a wallet and make no representations or warranties regarding how the Platform will operate with any specific wallet. Likewise, you are solely responsible for any associated wallet and we are not liable for any acts or omissions by you in connection with or as a result of your wallet being compromised.

These Terms are not intended to, and does not, create or impose any fiduciary duties on us. To the fullest extent permitted by law, you acknowledge and agree that we owe no fiduciary duties or liabilities to you or any other party, and that to the extent any such duties or liabilities may exist at law or in equity, those duties and liabilities are hereby irrevocably disclaimed, waived, and eliminated. You further agree that the only duties and obligations that we owe you are those set out expressly in these Terms.

### INDEMNITY

1. Indemnification by You&#x20;

You agree to indemnify, defend, and hold harmless Panora, its partners, officers, directors, employees, agents, licensors and service providers from and against any and all claims, actions, demands, losses, damages, liabilities, costs, or expenses, including, but not limited to, reasonable attorneys’ fees, legal costs, or settlement amounts, arising out of or in connection with:

* Your use or misuse of the Platform or Services;
* Any violation or breach of these Terms, including any other applicable terms, conditions, or policies referenced herein.
* Any breach of any representation, warranty, covenant, or obligation you have provided under these Terms.
* Any violation of applicable laws, regulations, or the rights of third parties, including, but not limited to, intellectual property rights, privacy rights, or other proprietary rights.
* Any other party’s access and use of the Platform with your assistance or using any device or account that you own or control. Any content, information, or data you submit, post, upload, or transmit through the Platform or Services, including but not limited to content that is defamatory, infringing, unlawful, or objectionable in nature.

2. Panora reserves the right, at its sole discretion and expense, to assume the exclusive defence and control of any matter otherwise subject to indemnification under this section. In such cases, you agree to cooperate fully with Panora in the defence of any such matter, including providing all necessary information and assistance to Panora in asserting any available defences. You may not settle any such claim, action, or demand without the prior written consent of Panora.
3. The indemnification obligations outlined herein are in addition to any other legal or equitable remedies available to Panora, and shall survive the termination, expiration, or suspension of these Terms, as well as your cessation of use of the Platform or Services.

### LIMITATION OF LIABILITY

To the fullest extent permitted by applicable law, Panora, its officers, directors, employees, agents, licensors and service providers shall not be liable for any direct, indirect, incidental, special, consequential, punitive, or exemplary damages, including but not limited to damages for loss of profits, goodwill, data, use, or other intangible losses resulting from:

1. Your access to, use of, or inability to access or use the Platform or Services.
2. Any unauthorized access to or use of your wallet, data, or any security breaches associated with your wallet.
3. Any conduct, content, transactions, or interactions with third parties in connection with or related to the Platform or Services, including but not limited to defamatory, offensive, or illegal conduct by other users or third parties.
4. Any interruption, suspension, downtime, or termination of the Platform or Services, including but not limited to planned maintenance or unforeseen outages.
5. Any errors, bugs, viruses, or other harmful components that may be transmitted through the Platform or Services, whether caused by Panora or a third party.
6. Any technical malfunctions, failures, omissions, interruptions, latency, deletions, defects, or failures related to your device, network, software, or any providers that may prevent your ability to access or use the Platform or Services.
7. Any injury or damage to your computer, device, or other equipment arising from your use of the Platform or Services, including the downloading of materials or accessing content.
8. Any inability to fully access the Platform or Service or any other third-party website, Platform, or service linked to or integrated with the Platform or Services.
9. Any other matter related to or arising from your use of the Platform or Services or the use of any third-party services, including but not limited to loss of data, downtime, or other interruptions.

This limitation of liability applies regardless of whether the alleged liability is based on contract, tort, negligence, strict liability, or any other basis, and even if we have been advised of the possibility of such liability. Some jurisdictions do not allow the exclusion of certain warranties or the limitation or exclusion of certain liabilities and damages. Accordingly, some of the disclaimers and limitations set forth in the Terms may not apply to you. This limitation of liability shall apply to the fullest extent permitted by law.

### TERMINATION AND SUSPENSION

Panora reserves the right, at its sole discretion, to suspend, restrict, or terminate your access to the Services as well as to the Platform, in whole or in part, at any time and without prior notice if:

1. You breach any of the terms and conditions outlined in these Terms.
2. Your account is suspected or flagged for activities related to money laundering, fraud, or any illegal or unauthorized activity.
3. Your actions or omissions pose a security risk, threaten the integrity or functionality of the Platform or Services, or impact any associated systems.
4. Suspension or termination is required by law, regulatory authority, or as part of a legal investigation or official request.
5. Unexpected technical, security, or operational issues arise that necessitate temporary or permanent suspension or termination of access.
6. Your failure to provide or maintain reporting, API access, or auditability required to verify attributed trades and Fees.
7. Your  engagement in fraud, misrepresentation, or unlawful conduct.
8. Any other reason Panora deems necessary.
9. Panora decides, at its discretion, to discontinue or modify the Platform or Services, either temporarily or permanently.

Effect of Suspension

1. Your access to any functionality associated with the Platform or Services, including transactions, balances, and information, will be temporarily disabled until the suspension is lifted.
2. During suspension, you will not be able to access, initiate, or complete any transactions within the Services or through any associated accounts.
3. Suspension does not relieve you of any ongoing obligations, including any fees owed, indemnification obligations, or liabilities arising from prior use of the Platform or Services.
4. Panora will not be liable to you or any third party for any suspension of your access or any associated loss of data, assets, or other consequences due to the suspension.

Effect of Termination

1. All associated functionalities, including access to transactions and information linked to your account, will be permanently disabled.&#x20;
2. Any remaining balance in your account at the time of termination may be forfeited. Panora reserves the right to restrict access to assets within your account upon termination, with no obligation to return or compensate for such balances.
3. All rights and licenses granted hereunder shall immediately cease;
4. Termination does not relieve you of any obligations accrued prior to termination, including any outstanding fees or liabilities arising from your use of the Platform or Services.
5. You may voluntarily terminate your use of the Services at any time by discontinuing access to the Platform and Services. However, termination does not relieve you of any obligations or liabilities incurred prior to termination.
6. Panora shall not be liable to you or any third party for any termination of your access, or any loss of data, assets, or other consequences that may result from termination.

Post-Termination

1. Provisions within these Terms that, by their nature, should survive termination (including, but not limited to, indemnity, limitation of liability, disclaimers of warranties, and intellectual property rights) will remain in effect even after termination or suspension.
2. The Protocol shall promptly remove references to Panora from its website, platform, and promotional materials.
3. You remain responsible for any fees, charges, or other obligations incurred before the effective date of termination.

### GOVERNING LAW

If you believe a dispute may arise in connection with these Terms, you must first send a written notice of the potential dispute to <team@panora.exchange> ("Dispute Notice"). Upon receipt of the Dispute Notice, Panora shall have sixty (60) days to review the matter and attempt to resolve the issue amicably.

If the dispute is not resolved within the sixty (60) day period, both you and Panora agree that the dispute shall be subject to the exclusive jurisdiction of the courts of Singapore. These Terms, and any disputes or claims arising out of or in connection with them or their subject matter (including your access to or use of the Platform and Services), shall be governed by and construed in accordance with the laws of Singapore. Class Action Waiver. To the maximum extent permitted by law, you agree that any dispute will be resolved on an individual basis, and that you will not bring or participate in any class, consolidated, or representative action against Panora.

### REPORTING

If you identify any vulnerabilities, security issues, or concerns regarding the Platform or Services, please report them promptly by contacting <team@panora.exchange>. Your cooperation helps us maintain a secure and reliable Platform.<br>


