# 5.1 Using capture as a Library

Goal: **call the detection logic from your own Python code**, get structured opportunities back, not printed text.

1. Put the repo in your project:
   * Option A: add it as a git submodule / subtree.
   * Option B: copy the relevant engine file(s) (e.g. `spreadnet.py`) into your own repo and rename to `capture_engine.py`.
2. Refactor the core into a class or function (if not already):

You want something like:

<pre class="language-python"><code class="lang-python"># capture_engine.py

class CaptureEngine:
    def __init__(self, min_profit_threshold=0.1, sleep_seconds=2):
        self.min_profit_threshold = min_profit_threshold
<strong>        self.sleep_seconds = sleep_seconds
</strong>        # init dex configs, http session, etc.

    async def tick(self) -> list[dict]:
        """
        One full detection cycle:
        - fetch quotes
        - normalize
        - calculate spreads/profit
        - filter
        Returns: list of opportunity dicts.
        """
        # your existing logic split into steps
        opportunities = []  # fill from pipeline
        return opportunities
</code></pre>

3. Use it from another module:

```python
import asyncio
from capture_engine import CaptureEngine

async def run_engine():
    engine = CaptureEngine(min_profit_threshold=0.2, sleep_seconds=2)

    while True:
        opps = await engine.tick()
        for opp in opps:
            handle_opportunity(opp)  # your own logic
        await asyncio.sleep(engine.sleep_seconds)

def handle_opportunity(opp: dict):
    # Example structure you want:
    # {
    #   "pair": "SOL/USDC",
    #   "buy_venue": "jupiter",
    #   "buy_price": 99.8,
    #   "sell_venue": "raydium",
    #   "sell_price": 100.2,
    #   "spread_pct": 0.4,
    #   "profit_pct": 0.3,
    #   "profit_bps": 30,
    #   "timestamp": 1710000000
    # }
    print(opp)

if __name__ == "__main__":
    asyncio.run(run_engine())
```

Moral: expose a **pure function / method** that returns a list of structured opportunities. Stop printing inside the core logic; only your UI layer prints
