# Remove from Specific Bins

Selectively withdraw liquidity from individual bins while maintaining positions in others. Perfect for rebalancing, profit-taking, or adjusting your range.

### Prerequisites

* Position ID with active liquidity
* List of bin IDs to remove from
* Understanding of current bin distribution
* Gas for transaction execution

### Basic Usage

```typescript
const pair = await sdk.Pair.getPair(pairAddress);

// Remove from specific bins only
const tx = await sdk.Pair.removeLiquidity(pair, {
  positionId: "0x123...abc",
  binIds: [8388606, 8388607, 8388609]  // Selected bins
});

await sdk.fullClient.signAndExecuteTransaction({
  transaction: tx,
  signer: keypair
});
```

### Method Parameters

```typescript
interface RemoveLiquidityParams {
  positionId: string;    // Your position NFT
  binIds: number[];      // Array of bin IDs to remove
}
```

### Common Strategies

#### Remove Out-of-Range Bins

```typescript
// Get current position bins
const bins = await sdk.Position.getPositionBins(pair, positionId);
const activeId = pair.parameters.active_id;

// Find bins far from current price
const outOfRangeBins = bins
  .filter(bin => Math.abs(bin.id - activeId) > 10)
  .map(bin => bin.id);

// Remove distant liquidity
await sdk.Pair.removeLiquidity(pair, {
  positionId,
  binIds: outOfRangeBins
});
```

#### Harvest High-Fee Bins

```typescript
// Get bins with accumulated fees
const binsWithAmounts = await sdk.Position.getPositionBinsAmount(pair, positionId);

// Find bins with significant fees
const highFeeBins = binsWithAmounts
  .filter(bin => {
    const fees = calculateBinFees(bin);
    return fees > FEE_THRESHOLD;
  })
  .map(bin => bin.id);

// Collect from profitable bins
await sdk.Pair.removeLiquidity(pair, {
  positionId,
  binIds: highFeeBins
});
```

#### Rebalance Toward Active Price

```typescript
const activeId = pair.parameters.active_id;
const bins = await sdk.Position.getPositionBins(pair, positionId);

// Remove from one side to rebalance
const removeBins = bins
  .filter(bin => bin.id < activeId - 5)  // Remove below
  .map(bin => bin.id);

await sdk.Pair.removeLiquidity(pair, {
  positionId,
  binIds: removeBins
});
```

### What Happens

1. **Liquidity Burned**: Your shares in selected bins are burned
2. **Tokens Returned**: Receive proportional reserves + fees
3. **Position Updated**: Remaining bins stay untouched
4. **Fees Collected**: Accumulated fees automatically included

### Calculate Before Removing

```typescript
// Preview removal amounts
const binsToRemove = [8388606, 8388607];
const amounts = await sdk.Position.getPositionBinsAmount(pair, positionId);

const totalOut = amounts
  .filter(bin => binsToRemove.includes(bin.id))
  .reduce((acc, bin) => ({
    x: acc.x + bin.amountX,
    y: acc.y + bin.amountY
  }), { x: 0n, y: 0n });

console.log("Will receive:", totalOut);
```

### Gas Optimization

```typescript
// Batch remove many bins efficiently
const allBinIds = bins.map(b => b.id);

// More efficient than multiple transactions
await sdk.Pair.removeLiquidity(pair, {
  positionId,
  binIds: allBinIds  // Remove all at once
});
```

### Important Notes

* Cannot remove from bins without liquidity
* Fees are included automatically
* Position NFT remains active
* Can add back to same bins later

### Related Topics

* [Remove All Liquidity](/integration/dlmm/typescript-sdk/remove-liquidity/remove-all-liquidity.md) - Complete withdrawal
* [Get Position Bins](/integration/dlmm/typescript-sdk/position-management/get-position-bins.md) - Check bins first
* [Calculate Output Amounts](/integration/dlmm/typescript-sdk/remove-liquidity/calculate-output-amounts.md) - Preview returns


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.ferra.ag/integration/dlmm/typescript-sdk/remove-liquidity/remove-from-specific-bins.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
