Skip to main content

pulse-tax

Crypto tax reporting via PULSE Protocol — collect trade history from Binance, Bybit, Kraken, and OKX in one command. Export to Koinly, CoinTracker, or JSON.

PyPI version License


The problem

You trade on 3 exchanges. Each one stores your history differently. Koinly, CoinTracker, and every tax accountant want a CSV. You end up logging in to each exchange, hunting for the export button, downloading 3 different CSV formats, and converting them manually.

With pulse-tax: one command.


Installation

pip install pulse-tax

Quick Start

1. Create config file

pulse-tax init

This creates pulse_tax_config.json. Edit it to add your API keys (read-only keys are sufficient — no trading permissions needed):

{
  "binance": {
    "api_key": "YOUR_BINANCE_API_KEY",
    "api_secret": "YOUR_BINANCE_API_SECRET"
  },
  "bybit": {
    "api_key": "YOUR_BYBIT_API_KEY",
    "api_secret": "YOUR_BYBIT_API_SECRET"
  },
  "kraken": {
    "api_key": "YOUR_KRAKEN_API_KEY",
    "api_secret": "YOUR_KRAKEN_API_SECRET"
  },
  "okx": {
    "api_key": "YOUR_OKX_API_KEY",
    "api_secret": "YOUR_OKX_API_SECRET",
    "passphrase": "YOUR_OKX_PASSPHRASE"
  }
}

Remove exchanges you don't use.

2. Export

# Export 2026 trades to Koinly CSV
pulse-tax export --year 2026 --format koinly

# Export to CoinTracker
pulse-tax export --year 2026 --format cointracker

# Export to JSON (backup / custom processing)
pulse-tax export --year 2026 --format json

Output files are created in the current directory:

  • koinly_2026.csv — import directly at koinly.com
  • cointracker_2026.csv — import directly at cointracker.io
  • pulse_tax_2026.json — full structured data

Python API

from pulse_tax import TaxCollector, KoinlyExporter
from pulse_tax.collectors import BinanceCollector, BybitCollector

# Configure exchanges
collector = TaxCollector()
collector.add_exchange(BinanceCollector(api_key="...", api_secret="..."))
collector.add_exchange(BybitCollector(api_key="...", api_secret="..."))

# Collect
report = collector.collect(year=2026, verbose=True)
print(f"{report.total_trades} trades from {report.exchanges}")

# Export
csv = KoinlyExporter().export(report.trades, report.transfers)
with open("koinly_2026.csv", "w") as f:
    f.write(csv)

Supported Exchanges

Exchange Trades Deposits/Withdrawals
Binance Yes Yes
Bybit Yes (spot + perps) Yes
Kraken Yes Yes
OKX Yes (spot + futures) Yes

Supported Export Formats

Format Service How to import
koinly Koinly Imports > Add import > Universal CSV
cointracker CoinTracker Portfolio > Add transaction > CSV
json Any Custom processing

Why PULSE?

pulse-tax is part of the PULSE Protocol ecosystem. PULSE provides a universal semantic interface for AI-to-AI and agent-to-service communication.

The same exchange adapters that pulse-tax uses for collecting history are also used by:


Security Note

pulse-tax only needs read-only API keys. It never places orders, never withdraws funds. Create a separate read-only key on each exchange specifically for tax reporting.


License

Apache 2.0 — free forever, open source.

Metadata

Release files for pulse-tax 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pulse-tax 0.1.0
File Size Uploaded Provenance Actions
pulse_tax-0.1.0.tar.gz 17.6 kB Without provenance Details for pulse_tax-0.1.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for pulse-tax 0.1.0
File Interpreter ABI Platform Actions
pulse_tax-0.1.0-py3-none-any.whl Python 3 none any Details for pulse_tax-0.1.0-py3-none-any.whl

Total release size: 37.8 kB

Release files / pulse_tax-0.1.0.tar.gz

Download URL pulse_tax-0.1.0.tar.gz
Size 17.6 kB
Tags Source
SHA-256 checksum
How to use checksums
849294796f731aba393c43124d4a1a0ff08226e78de978b903b64673fc92d971
BLAKE2b-256 checksum
How to use checksums
5dbdd04bb383e9be9d3c1ae2b81c6d4708f214993c0ab1f24f4bb69de43d59f0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.3

Release files / pulse_tax-0.1.0-py3-none-any.whl

Download URL pulse_tax-0.1.0-py3-none-any.whl
Size 20.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f761cd0860c104a71cb8e11ecb2bd25f60e1ae629776058eb48c2dcfa8899f20
BLAKE2b-256 checksum
How to use checksums
f6616f72675079bbb5ff85b93b8be1d9586299597ffaea7bf3607a9a084fba42
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.3

Security for pulse-tax 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page