On/Off-Ramp API
Enable USDC ↔ GHS conversions in your app with the Ramp API. Let your users buy USDC with Mobile Money (on-ramp) or sell USDC for Mobile Money (off-ramp).
⬡ API product
Requires merchant activation and an API secret key
The Ramp API lets merchants integrate USDC ↔ GHS (Ghana Cedis) conversion into their own applications. Users can buy USDC with Mobile Money (on-ramp) or sell USDC for Mobile Money (off-ramp) through a simple REST API.
Ramp API access requires merchant activation by SeevCash. Contact support to enable on/off-ramp for your account.
Supported corridors
| Direction | User pays | User receives | Payment method |
|---|---|---|---|
| On-ramp | GHS (Mobile Money) | USDC (Stellar) | MTN, Vodafone, AirtelTigo |
| Off-ramp | USDC (Stellar) | GHS (Mobile Money) | MTN, Vodafone, AirtelTigo |
How it works
On-ramp (GHS → USDC)
Your App Ramp API User Stellar
│ │ │ │
│── KYC ─────────▶│ │ │
│◀── verified ────│ │ │
│ │ │ │
│── create order ▶│ │ │
│◀── reference ───│ │ │
│ │── MoMo prompt ──▶│ │
│ │◀── approves ─────│ │
│ │ │ │
│ │── send USDC ─────────────────────▶ │
│◀── completed ───│ │ │- KYC — Verify the user's phone number via OTP (one-time setup)
- Create order — Specify amount, user details, and destination Stellar wallet
- Collect — API sends a Mobile Money prompt to the user's phone
- Settle — Once fiat is confirmed, USDC is sent to the user's Stellar wallet
Off-ramp (USDC → GHS)
Your App Ramp API User Stellar
│ │ │ │
│── create order ▶│ │ │
│◀── merchant │ │ │
│ address ──────│ │ │
│ │ │ │
│── user sends USDC ────────────────────────────────▶ │
│ │ │ │
│── confirm ─────▶│ │ │
│ │── MoMo payout ──▶│ │
│◀── completed ───│ │ │- Create order — Specify amount and user details
- Send USDC — User sends USDC to the merchant's Stellar address (returned in the order)
- Confirm crypto — Call the confirm endpoint with the source wallet (tx is auto-detected)
- Payout — API disburses GHS to the user's Mobile Money
Authentication
All Ramp API requests require a secret API key in the Authorization header:
Authorization: Bearer sk_live_your_secret_key| Environment | Base URL |
|---|---|
| Sandbox | Provided during merchant activation |
| Production | Provided during merchant activation |
Your API base URL is provided when your merchant account is activated for ramp services. All examples below use https://api.your-domain.com as a placeholder.
Rate limits
The API is rate-limited to 100 requests per second per merchant. Exceeding the limit returns 429 Too Many Requests.
Order lifecycle
Every ramp order moves through a deterministic status lifecycle:
| Status | Meaning |
|---|---|
quote_locked | Rate locked, waiting for payment initiation |
fiat_pending | MoMo collection initiated, awaiting user approval (on-ramp) |
crypto_pending | Waiting for user to send USDC (off-ramp) |
fiat_confirmed | Fiat received, processing crypto send (on-ramp) |
crypto_confirmed | USDC received, processing fiat payout (off-ramp) |
crypto_sending | USDC being sent on-chain (on-ramp) |
fiat_sending | MoMo payout being sent (off-ramp) |
completed | Order fully settled |
expired | Rate TTL elapsed before payment |
cancelled | Order cancelled by merchant or user |
failed | Unrecoverable error (see failure_reason) |
Integration steps
1. KYC Verification
Verify user phone numbers via OTP before their first transaction.
2. On-Ramp (Buy USDC)
Create orders for GHS → USDC conversions via Mobile Money.
3. Off-Ramp (Sell USDC)
Create orders for USDC → GHS conversions with MoMo payout.
4. Webhooks & Polling
Track order status via polling and handle completion events.
Quick start example
Here's a complete on-ramp flow in three API calls:
# 1. Verify user's phone (one-time)
curl -X POST https://api.your-domain.com/api/v1/ramp/kyc/initiate \
-H "Authorization: Bearer $SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{"first_name":"Kofi","last_name":"Mensah","phone":"0241234567","provider_name":"MTN"}'
# 2. Verify OTP (sent to user's phone)
curl -X POST https://api.your-domain.com/api/v1/ramp/kyc/verify \
-H "Authorization: Bearer $SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{"kyc_id":"<kyc_id_from_step_1>","otp_code":"123456"}'
# 3. Create on-ramp order (GHS → USDC)
curl -X POST https://api.your-domain.com/api/v1/ramp/orders \
-H "Authorization: Bearer $SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "onramp",
"fiat_amount": 100,
"destination_wallet": "GBUSER...STELLARADDRESS",
"payment_method": "mobile_money",
"user": {
"first_name": "Kofi",
"last_name": "Mensah",
"phone": "0241234567",
"network": "MTN"
}
}'Limits
Default limits apply per merchant. Contact Seev support if your organization needs different limits:
| Limit | Default |
|---|---|
| Minimum per transaction | 10 GHS |
| Maximum per transaction | Configured per merchant |
| Daily volume | Configured per merchant |
| Monthly volume | Configured per merchant |
| Minimum USDC | 1 USDC |