---
title: "Mint a signed Swapped Connect URL (CEX funding)"
method: POST
path: "/onramp/swapped/connect-url"
tags: ["Onramp"]
---

# Mint a signed Swapped Connect URL (CEX funding)

`POST /onramp/swapped/connect-url`

Returns a signed Swapped Connect URL the modal embeds in an iframe so the user can fund from a centralized exchange. Current callers send the exact picker rate as acceptedExchangeFeeBps; omission preserves legacy fee-free delivery, while a stale rate returns 409 before any URL or session state is minted. Requires a configured public webhook callback URL.

## Headers

- `x-api-key` string — API key for authentication (omit when sending Authorization)
- `authorization` string — Bearer platform token (e.g. forwarded by user-service). Takes precedence over `x-api-key` when both are present.
- `x-user-country` string — Trusted edge-resolved ISO country. When present it overrides body.baseCountry and x-client-ip, and enables country-specific payment-method validation.
- `x-client-ip` string — The end user's IP address as observed by the edge, for edges that can name the IP but cannot resolve a country themselves (no local GeoIP database). Used only when x-user-country is absent, and ignored unless it is a publicly-routable address. Prefer x-user-country when your edge already has a country — for example Cloudflare's cf-ipcountry — since it needs no lookup here.

## Request body

- SwappedConnectUrlRequestBody
  - `smartAccount` string, required — Ethereum address (0x followed by 40 hex characters)
  - `baseCountry` string — ISO-3166-1 alpha-2 country code
  - `baseCurrencyCode` string — ISO fiat currency code
  - `locale` string
  - `connection` string
  - `acceptedExchangeFeeBps` integer

## Response `200`

Signed Connect URL

- SwappedUrlResponse
  - `ok` true, required
  - `url` string, required
  - `currencyCode` string, required
  - `sandbox` boolean, required
  - `externalCustomerId` string, required
  - `expiresAt` string, required
  - `exchangeFeeBps` integer

## Other responses

- `400` — Invalid request
- `401` — Authentication required or invalid credential
- `403` — API key lacks the required deposits scope, or the account is not registered to the calling project
- `409` — The Exchange Fee changed after the caller loaded the picker; the returned rate must be disclosed and accepted before retrying
- `500` — Server misconfigured or signing failed
- `503` — Swapped on-ramp is not configured

---

[API](https://skmtc.net/rhinestonewtf/apis/deposit-service-api.md) · [All operations](https://skmtc.net/rhinestonewtf/apis/deposit-service-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/rhinestonewtf/deposit-service-api/revisions/c9aa3f252e4f/schema)
