# POST /v1/mirrors/batch

## Add multiple mirrors with optional overrides.

> Create up to 99 mirrors in a single request by providing an array of Mirror objects. Any addresses that are already mirrored will be skipped and not overwritten. The response may include a \`skipped\` array listing the addresses that were skipped because you were already mirroring them.

```json
{"openapi":"3.1.1","info":{"title":"Odinbot API","version":"0.1.0"},"servers":[{"url":"https://api.odinbot.io"}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"apiKey","name":"x-api-key","in":"header"}},"schemas":{"Mirror":{"required":["address"],"allOf":[{"$ref":"#/components/schemas/CommonControlsOrOverrides"},{"type":"object","properties":{"address":{"type":"string","description":"Solana public key of the wallet you want to mirror. This field is mandatory and uniquely identifies the mirror entry."},"autoSellProfileKey":{"description":"Key of the auto-sell profile OdinBot should apply for this mirror only. If you supply the literal string \"override_to_empty\", OdinBot will remove any auto-sell profile from this mirror even when a global profile exists in Controls.","anyOf":[{"type":"string"},{"type":"string","enum":["override_to_empty"]}]}}}]},"CommonControlsOrOverrides":{"type":"object","properties":{"tradeSizeLamports":{"type":"integer","format":"int64","minimum":0,"description":"Total lamports Odinbot spends per copy buy when no scaling strategy is in effect."},"tradeSpeed":{"type":"string","description":"Selects the speed tier for copy-trades.","enum":["Standard","Turbo","Godly"]},"buyMinPriorityFee":{"type":"number","description":"Minimum priority fee for buys. Applies to spot copy buys on Instant buy mode.","minimum":0},"sellStrategy":{"type":"string","description":"Defines how Odinbot exits positions when the mirrored wallet sells.","enum":["SellAll","SellProportionally","NoSell"]},"maxBuysPerMirrorPerHour":{"type":"integer","description":"Limits how many buys Odinbot will make for a mirrored wallet within an hour.","minimum":0},"maxBuysPerMirrorPerDay":{"type":"integer","description":"Limits the number of buys Odin will make for a mirrored wallet within a 24-hour window.","minimum":0},"maxBuysPerTokenPerDay":{"type":"integer","description":"Maximum number of buys allowed for the same token in a 24-hour window.","minimum":0},"maxBuysPerTokenPerWeek":{"type":"integer","description":"Maximum number of buys allowed for the same token in a 7-day window.","minimum":0},"allowPumpFun":{"type":"boolean","description":"If `true`, OdinBot is allowed to copy trades on pump.fun."},"snipeLaunchpadLaunches":{"type":"boolean","description":"If `true`, OdinBot will snipe (quickly buy) the tokens that your mirror launches (or creates) on a launchpad."},"launchpadLaunchSnipeTradeSizeSol":{"type":"number","description":"Amount in SOL to spend on each launchpad snipe (independent of tradeSizeLamports).","minimum":0},"mevProtection":{"type":"string","description":"Sets MEV protection.","enum":["Fastest","Balanced","Protected"]},"degenMode":{"type":"boolean","description":"Removes slippage entirely for trades not executed on Pump.fun or PumpSwap."},"allowBuys":{"type":"boolean","description":"Master switch that disables all new buys when set to false. Sells remain unaffected."},"buyStrategy":{"type":"string","description":"`Constant` uses tradeSizeLamports for every buy. `Scaling` calculates size from ssMinBuy, ssPercent, and ssMaxBuy.","enum":["Constant","Scaling"]},"ssMinBuy":{"type":"number","description":"Defines the smallest trade size (in SOL) that Odinbot will execute. If your buy would be below this size, no trade will be made. (only used when `buyStrategy` is set to `Scaling`).","minimum":0},"ssPercent":{"type":"number","description":"Percentage of the mirror's original buy size OdinBot should match.","minimum":0},"ssMaxBuy":{"type":"number","description":"Sets the largest trade size (in SOL) that Odinbot will execute. If the calculated buy size exceeds this value, Odinbot will instead use this value for the buy size.","minimum":0},"buyMode":{"type":"string","description":"`Instant` will copy buys instantly. `BuyTheDip` will wait for a dip after the mirror's buy before buying. `BuyTheDip` mode uses `buyDipPct` and `buyDipTimeoutSecs`.","enum":["Instant","BuyTheDip"]},"buyDipPct":{"type":"number","description":"Only used in `BuyTheDip` mode. How much the price dips before you buy. Must be a number between 0 and 100. If empty, defaults to 5.","exclusiveMinimum":0,"exclusiveMaximum":100},"buyDipTimeoutSecs":{"type":"number","description":"Only used in `BuyTheDip` mode. How long to wait for a dip after your mirror buys. Max 7 days. If empty, defaults to 1 day.","exclusiveMinimum":0,"maximum":604800},"crossMirrorPrevention":{"type":"boolean","description":"When enabled, only the mirrored wallet that caused the first trade of a token can trade that token until the position is closed."},"pfSlippage":{"type":"number","description":"Allowed slippage (%) when buying on Pump.fun or PumpSwap.","minimum":0},"buyExtraTipPct":{"type":"number","description":"Adds a percentage-based additional tip to potentially speed up mirrored buys. The tip scales with the trade size.","minimum":0},"sellExtraTipPct":{"type":"number","description":"Adds a percentage-based additional tip to potentially speed up mirrored sells. The tip scales with the trade size.","minimum":0},"minMcUsd":{"type":"number","description":"Minimum market cap (USD) a token must have for OdinBot to buy it."},"maxMcUsd":{"type":"number","description":"Maximum market cap (USD) above which OdinBot will not buy."},"minTokenAgeSecs":{"type":"number","description":"Minimum token age (in seconds) a token must have for OdinBot to buy it.","minimum":0},"maxTokenAgeSecs":{"type":"number","description":"Maximum token age (in seconds) a token must have for OdinBot to buy it.","minimum":0},"onlyCopyNewPositions":{"type":"boolean","description":"Only copy the buy if the mirror is opening a new position. A new position means the mirror's balance of the token they're buying was 0 immediately before this buy. Defaults to false."}}}},"responses":{"400":{"description":"Bad request. Check to make sure you're passing the right parameters.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Message"}}}}}},"401":{"description":"Unauthorized. Make sure you're using the right api key.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Message"}}}}}},"429":{"description":"Too many requests","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Message"}}}}}}}},"paths":{"/v1/mirrors/batch":{"post":{"summary":"Add multiple mirrors with optional overrides.","description":"Create up to 99 mirrors in a single request by providing an array of Mirror objects. Any addresses that are already mirrored will be skipped and not overwritten. The response may include a `skipped` array listing the addresses that were skipped because you were already mirroring them.","requestBody":{"description":"JSON object containing: `mirrors`- an array of Mirror objects. Maximum 99 items per request.","content":{"application/json":{"schema":{"type":"object","required":["mirrors"],"properties":{"mirrors":{"type":"array","items":{"$ref":"#/components/schemas/Mirror"}},"save":{"type":"boolean","$comment":"defaults to `false`","description":"Also saves the newly mirrored wallets in your saved wallets. Defaults to `false`."}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"skipped":{"type":"array","items":{"type":"string"}}}}}}},"400":{"$ref":"#/components/responses/400"},"401":{"$ref":"#/components/responses/401"},"429":{"$ref":"#/components/responses/429"}}}}}}
```
