How to import Hyperliquid perps, funding and fees into Koinly
Updated October 2026. Not tax advice.
Koinly can sync a Hyperliquid address, but over 2025–2026 its own feedback board logged a run of Hyperliquid gaps: perp PnL trades not imported, futures fee rebates mis-summed, spot↔perp transfers imported as transactions, and staking rewards in the wrong currency. Many were fixed, but if your numbers don't match your Hyperliquid account, or the sync pushes you onto a bigger plan, a CSV import gives you control.
1. Get your data
Hyperliquid has three histories: fills (every trade, with closedPnl and fee), funding (hourly funding payments per position) and the ledger (deposits from Arbitrum, withdrawals, transfers, vault deposits, rewards). The app's "Export as CSV" covers trade history. The public info API (userFillsByTime, userFunding, userNonFundingLedgerUpdates) covers all three.
The 10,000-fill limit. The API (and the UI export) only return your most recent 10,000 fills. Funding and ledger history are complete. If you trade a lot, save an export at least every few months.
2. Map it to Koinly's universal CSV
Koinly's universal format has the columns Date, Sent Amount, Sent Currency, Received Amount, Received Currency, Fee Amount, Fee Currency, Net Worth Amount, Net Worth Currency, Label, Description, TxHash. Dates as YYYY-MM-DD HH:mm:ss UTC.
| Hyperliquid event | Koinly row | Label |
|---|---|---|
| Perp fill with positive closedPnl | Received USDC = PnL | realized gain |
| Perp fill with negative closedPnl | Sent USDC = |PnL| | realized gain |
| Perp trading fee | Sent USDC = fee | margin fee |
| Maker rebate (negative fee) | Received USDC | realized gain |
| Funding paid | Sent USDC | margin fee |
| Funding received | Received USDC | realized gain |
| Spot buy / sell | Sent quote, Received base (or the reverse), fee in fee token | (none: a trade) |
| Deposit / withdrawal | Received / Sent USDC | (none: Koinly matches it to your Arbitrum wallet transfer) |
| Spot↔perp class transfer, sub-account transfer | Skip: internal movement |
Perp positions are not imported as asset buys and sells: Koinly only needs the realized result, the fees and funding, which is what the labels above do.
3. Keep the row count down
Koinly plans are priced by transaction count (roughly 100 / 1,000 / 3,000 / 10,000+ transactions for the Newbie / Hodler / Trader / Pro tiers). An active Hyperliquid trader can produce thousands of fills a month. Summing PnL, fees and funding per coin per day gives the same yearly totals in a fraction of the rows. In one test on a market-making address, 11,499 fills became 453 Koinly rows.
4. Import
- In Koinly, add a wallet named "Hyperliquid (CSV)". If you already have a Hyperliquid API wallet with the same history, delete it or you will double count.
- Import the CSV with "Import from file".
- Check the yearly realized PnL in Koinly against your own totals before filing.
Do it automatically
PerpLedger does steps 1–3 in your browser: paste your address, get a yearly summary (realized PnL, fees, funding, deposits, withdrawals) for free, and the full Koinly CSV for a one-time $9 in USDC/USDT on Arbitrum.