> For the complete documentation index, see [llms.txt](https://docs.swapper.finance/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.swapper.finance/resources/faq.md).

# FAQ

## Integration

### Which package do I install?

**`@swapper-finance/deposit-sdk`** — the [iframe SDK](/widget-integration/iframe-sdk.md). It works in any framework, or none, and is the only package you need to embed Swapper.

### What's the minimum to get a widget on screen?

Four values — `integratorId`, `dstChainId`, `dstTokenAddr`, `depositWalletAddress` — passed to `openSwapperModal` or `new SwapperIframe`. See the [Quick Start](/getting-started/quick-start.md).

### How do I get an `integratorId`?

Open a ticket in [Discord](https://discord.gg/y8eevERxBz) — see [Support](/resources/support.md). You'll also get access to the [Integrator Dashboard](/integrator-dashboard/overview.md), where you configure your [webhooks](/tracking-deposits/webhooks.md) and API keys.

### Can I change the destination or styling after the widget loads?

Yes. `updateConfig()`, `updateStyles()`, and `updateCustomContractCalls()` patch the live widget over `postMessage` — no reload. See the [iframe SDK](/widget-integration/iframe-sdk.md#methods).

### The first open is slow. Can I make it instant?

Preload it. Use [`preloadSwapperModal`](/widget-integration/modal-and-embed.md#preloading-the-modal) or [`preloadSwapperEmbed`](/widget-integration/modal-and-embed.md#inline-embed-swapperembed). The widget loads hidden in the background; smart-wallet authorization is deferred until the user actually opens it.

## Deposits

### What can users pay with?

A [card / bank on-ramp](/deposit-methods/fiat-onramp.md), a [crypto transfer to a deposit address](/deposit-methods/transfer-crypto.md) (QR — from any wallet or exchange, on any supported chain including Bitcoin, Solana and Tron), or a [connected wallet](/deposit-methods/wallet-deposit.md) (EVM or Solana) that signs the route. You choose which to offer with [`supportedDepositOptions`](/widget-integration/configuration.md#supporteddepositoptions).

### What do I actually receive?

Exactly your `dstTokenAddr` on `dstChainId`, delivered to `depositWalletAddress` — regardless of what the user paid with.

### Can I set deposit limits?

Yes — [`minDepositUsd` / `maxDepositUsd`](/widget-integration/configuration.md#mindepositusd--maxdepositusd), validated against the USD value of the received amount. The transfer flow also floors the minimum so gas is always covered.

### Can I run actions after the swap (stake, wrap, LP)?

Yes — [Custom Contract Calls](/widget-integration/custom-contract-calls.md) chain arbitrary on-chain actions after delivery, atomically.

## Tracking

### How do I know a deposit completed?

Two channels: a [widget event](/tracking-deposits/widget-events.md) in the browser (instant, for UX) and a [webhook](/tracking-deposits/webhooks.md) to your server (reliable, for accounting). Use both.

### Why did I get two webhooks for one deposit?

A card on-ramp that is swept onward through a smart wallet produces two linked deposits (`onramp` + `smart_wallet`). Count the flow **once**, keyed by the funding tx. See [Webhooks → Linking](/tracking-deposits/webhooks.md#linking-onramp--smart-wallet-deposit).

### Where do I set my webhook URL?

In the [Integrator Dashboard](/integrator-dashboard/overview.md#webhooks), under **Webhooks** — up to five HTTPS endpoints, plus the signing secret. The widget's `webhookUrl` option is ignored. See [Webhooks → Setup](/tracking-deposits/webhooks.md#setup).

### How do I verify a webhook is really from Swapper?

Check the `X-Webhook-Signature` header — HMAC-SHA256 (Base64) of the raw body with your secret. Code sample in [Webhooks](/tracking-deposits/webhooks.md#verifying-the-signature).

### Are webhooks retried?

Once — an initial attempt plus one retry \~30s later. Deduplicate on `eventId` and return `200` within 10 seconds. See [Delivery & idempotency](/tracking-deposits/webhooks.md#delivery-retries--idempotency).

## API

### Do I need an API key?

Not for the widget — your public `integratorId` is all it needs. For calling [API v1](/api-v1/overview.md) from your servers a key is optional: without one you're on the free tier (send your `integrator` id); with one you get higher [rate limits](/api-v1/rate-limits.md) and can charge an [integrator fee](/api-v1/integrator-fees.md). Create keys in the [Integrator Dashboard](/integrator-dashboard/overview.md), and keep them server-side. See [Authentication](/api-v1/authentication.md).

## Amounts & custody

### What format are amounts in?

Base-unit strings (wei / lamports / smallest unit), never floats. Prices and USD values are decimal strings. See the [API v1 conventions](/api-v1/overview.md#conventions).

### Can Swapper move my users' funds?

Only within what each flow is for:

* **Wallet deposits** are signed by the user in their own wallet; Swapper never holds a key that can sign for it.
* A **smart wallet** (one of the QR flow's addresses) gives Swapper a scoped session key that can only swap what arrives into your destination token.
* Funds sent to a **deposit address** (the QR flow's other kind of address, and [API deposit addresses](/api-v1/endpoints/deposit-addresses.md)) are swept and delivered on the user's behalf — to the destination the address was issued for, or back as a refund.
