# Embedded Experiences
Some integrations require an embedded experience (e.g., a checkout/on-ramp/off-ramp flow inside your product).
Even if you call the APIs from your backend, you can present an embedded UI (hosted or iframe) to:
- collect beneficiary details
- confirm fees and totals
- handle compliance steps (KYC) when required
## Integration Options
### 1. JavaScript/TypeScript SDK
Install via npm:
```bash
npm install @kaito/checkout-sdk
```
**Basic usage:**
```typescript
import { KaitoCheckout } from '@kaito/checkout-sdk';
const checkout = new KaitoCheckout({
partnerId: 'prt_abc123',
environment: 'sandbox', // or 'production'
});
// On-ramp (FIAT -> CRYPTO)
checkout.onRamp({
amount: 100,
sourceCurrency: 'USD',
destinationCurrency: 'USDT',
destinationAddress: '0x...',
onSuccess: (result) => console.log('Payment:', result.paymentId),
onError: (error) => console.error(error),
onCancel: () => console.log('User cancelled'),
});
// Off-ramp (CRYPTO -> FIAT)
checkout.offRamp({
amount: 100,
sourceCurrency: 'USDT',
destinationCurrency: 'GTQ',
beneficiary: {
type: 'bank_account',
bankCode: 'BANK_X',
accountNumber: '1234567890',
},
onSuccess: (result) => console.log('Payout:', result.payoutId),
onError: (error) => console.error(error),
});
```
**Available methods:**
- `onRamp(options)` — FIAT_CRYPTO flow
- `offRamp(options)` — CRYPTO_FIAT flow
- `transfer(options)` — CRYPTO_CRYPTO flow
- `payout(options)` — FIAT_FIAT flow
### 2. Hosted Checkout (Redirect)
For partners who prefer not to embed UI components, Kaito offers a hosted checkout page.
**Flow:**
1. Create a checkout session via API
2. Redirect user to `https://checkout.kai2.io/session/{sessionId}`
3. User completes the flow on Kaito's hosted page
4. User is redirected back to your `returnUrl`
5. Receive webhook confirmation
```bash
POST /checkout/sessions
{
"railType": "FIAT_CRYPTO",
"amount": 100,
"currency": "USD",
"returnUrl": "https://yourapp.com/checkout/complete",
"cancelUrl": "https://yourapp.com/checkout/cancel",
"metadata": { "orderId": "ORD-123" }
}
```
**Response:**
```json
{
"sessionId": "ses_01JH...",
"checkoutUrl": "https://checkout.kai2.io/session/ses_01JH...",
"expiresAt": "2025-01-15T12:00:00Z"
}
```
### 3. iFrame Embed
Embed Kaito's checkout widget directly in your application.
```html
```
**Sandbox attributes:**
- `allow-scripts` — Required for widget functionality
- `allow-same-origin` — Required for session management
- `allow-forms` — Required for input handling
- `allow-popups` — Required for 3DS/KYC redirects
### 4. Mobile SDKs (Coming Soon)
- **iOS**: `KaitoCheckoutSDK` via Swift Package Manager
- **Android**: `io.kai2:checkout-sdk` via Maven Central
- **React Native**: `@kaito/react-native-checkout`
- **Flutter**: `kaito_checkout`
## Customization
### Branding
Partners can customize the checkout experience via the Partner Portal:
- Logo
- Primary and secondary colors
- Font family
- Button styles
### Localization
Supported languages: `en`, `es`, `pt`
Pass `locale` parameter to override auto-detection:
```typescript
checkout.onRamp({
locale: 'es',
// ...
});
```
## Recommended Pattern (API + Embedded UI)
1. Create a quote (`POST /quotes`)
2. Optional: create execution plan (`POST /execution-plans`)
3. Execute (`POST /payments` or `POST /payouts`)
4. Listen for webhooks (`payment.*`, `payout.*`) to update UI and ledger
> If you later add a hosted/embedded UI, these same endpoints remain the backbone.
## Webhooks for Checkout Events
Subscribe to checkout-specific events:
- `checkout.session.created`
- `checkout.session.completed`
- `checkout.session.expired`
- `checkout.session.cancelled`