# Banxa React Native SDK
A TypeScript-based React Native SDK for integrating with the Banxa API. This SDK provides a simple and type-safe interface for creating orders, retrieving prices, managing payment methods, and more.
## Installation
```bash
npm install @banxa/react-native-sdk
```
or
```bash
yarn add @banxa/react-native-sdk
```
## Getting Started
### Basic Setup
```typescript
import { Banxa } from '@banxa/react-native-sdk';
const banxa = new Banxa({
apiKey: 'your-api-key',
partner: 'your-partner-id',
environment: 'production', // or 'sandbox'
});
```
### Configuration Options
- `apiKey` (required): Your Banxa API key from the Partner Dashboard
- `partner` (required): Your partner identifier
- `environment` (optional): 'production' or 'sandbox' (default: 'production')
- `baseUrl` (optional): Custom base URL (overrides environment setting)
## API Modules
### Orders
Create and manage orders:
```typescript
// Create a new order
const order = await banxa.orders.createOrder({
account_reference: 'user-123',
source: 'USD',
target: 'BTC',
source_amount: '100',
payment_method_id: 1,
wallet_address: '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa',
return_url_on_success: 'https://yourapp.com/success',
return_url_on_failure: 'https://yourapp.com/failure',
});
console.log('Order created:', order.id);
console.log('Checkout URL:', order.checkout_url);
// Check if the user is eligible to complete an order (same params as createOrder)
const orderRequest = {
account_reference: 'user-123',
source: 'USD',
target: 'BTC',
source_amount: '100',
payment_method_id: 1,
wallet_address: '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa',
};
const eligibility = await banxa.orders.checkOrderEligibility(orderRequest);
if (!eligibility.eligible) {
// Show eligibility.message or disable checkout
console.log('Not eligible:', eligibility.message);
} else if (eligibility.paymentReady) {
// Use Primer order flow (in-app checkout)
const order = await banxa.orders.createOrderAndShowPrimerCheckout(orderRequest);
} else {
// Use WebView flow: create order then show CheckoutWebView with order.checkout_url
const order = await banxa.orders.createOrder(orderRequest);
const webViewProps = banxa.orders.initializeCheckoutWebView(order, { ... });
// render
}
// Get order details
const orderDetails = await banxa.orders.getOrder(order.id);
// Get orders by account reference
const userOrders = await banxa.orders.getOrdersByAccount('user-123');
// Initialize WebView for checkout
import { CheckoutWebView } from '@banxa/react-native-sdk';
import { useState } from 'react';
const [showCheckout, setShowCheckout] = useState(false);
const webViewProps = banxa.orders.initializeCheckoutWebView(order, {
onClose: () => setShowCheckout(false),
onSuccess: (url) => {
console.log('Payment successful!', url);
setShowCheckout(false);
},
onFailure: (url) => {
console.log('Payment failed', url);
setShowCheckout(false);
},
returnUrlOnSuccess: 'https://yourapp.com/success',
returnUrlOnFailure: 'https://yourapp.com/failure',
});
// In your component render:
{showCheckout && }
```
#### Create order and show Primer checkout
When the Banxa create order API returns a `payment_token` (e.g. for card/Primer flows), you can create an order and present Primer Universal Checkout in one call. Requires `@primer-io/react-native` (included as a dependency).
```typescript
// Primer options are initialised inside the function. For custom callbacks (e.g. onCheckoutComplete, onError), call Primer.configure() at app startup.
const order = await banxa.orders.createOrderAndShowPrimerCheckout({
account_reference: 'user-123',
source: 'USD',
target: 'BTC',
source_amount: '100',
payment_method_id: 1,
wallet_address: '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa',
});
```
If the order response does not include `payment_token`, the method throws; use `createOrder()` and `initializeCheckoutWebView()` with `checkout_url` instead.
### Prices
Get price quotes for currency pairs:
```typescript
// Get a price quote
const price = await banxa.prices.getPrice({
source: 'USD',
target: 'BTC',
source_amount: '100',
});
console.log('Price:', price.spot_price);
console.log('Fee:', price.fee);
console.log('Valid until:', price.valid_until);
// Get buy price
const buyPrice = await banxa.prices.getBuyPrice('USD', 'BTC', '100');
// Get sell price
const sellPrice = await banxa.prices.getSellPrice('BTC', 'USD', '0.001');
```
### Payment Methods
Retrieve available payment methods:
```typescript
// Get all payment methods
const paymentMethods = await banxa.paymentMethods.getPaymentMethods();
// Get payment methods for a specific currency pair
const methods = await banxa.paymentMethods.getPaymentMethods('USD', 'BTC');
// Get a specific payment method
const method = await banxa.paymentMethods.getPaymentMethod(1);
```
### Countries
Get supported countries:
```typescript
// Get all countries
const countries = await banxa.countries.getCountries();
// Get a specific country
const country = await banxa.countries.getCountry('US');
```
### Currencies
Get supported currencies:
```typescript
// Get all currencies
const currencies = await banxa.currencies.getCurrencies();
// Get fiat currencies only
const fiatCurrencies = await banxa.currencies.getFiatCurrencies();
// Get crypto currencies only
const cryptoCurrencies = await banxa.currencies.getCryptoCurrencies();
// Get a specific currency
const currency = await banxa.currencies.getCurrency('BTC');
```
### Customer Identity
Register and manage customer identity for KYC:
```typescript
// Register customer identity
const identity = await banxa.customerIdentity.registerCustomerIdentity({
account_reference: 'user-123',
email: 'user@example.com',
mobile: '+1234567890',
given_name: 'John',
surname: 'Doe',
date_of_birth: '1990-01-01',
address: {
address_line_1: '123 Main St',
city: 'New York',
state: 'NY',
post_code: '10001',
country_code: 'US',
},
kyc_level: 1,
});
// Get customer identity
const customerIdentity = await banxa.customerIdentity.getCustomerIdentity('user-123');
```
## Error Handling
The SDK throws `BanxaError` objects for API errors:
```typescript
import { Banxa, BanxaSDKError } from '@banxa/react-native-sdk';
try {
const order = await banxa.orders.createOrder({...});
} catch (error) {
if (error instanceof BanxaSDKError) {
console.error('Banxa API Error:', error.message);
console.error('Error Code:', error.code);
console.error('Status Code:', error.statusCode);
} else {
console.error('Unknown error:', error);
}
}
```
## TypeScript Support
The SDK is written in TypeScript and provides full type definitions:
```typescript
import { Banxa, Order, Price, PaymentMethod } from '@banxa/react-native-sdk';
const banxa = new Banxa({...});
// All methods are fully typed
const order: Order = await banxa.orders.createOrder({...});
const price: Price = await banxa.prices.getPrice({...});
```
## React Native Compatibility
This SDK uses the standard `fetch` API which is available in React Native. The WebView component requires `react-native-webview` as a peer dependency.
### Installing WebView Dependency
```bash
npm install react-native-webview
# or
yarn add react-native-webview
```
For iOS, you may need to run:
```bash
cd ios && pod install
```