Partner API reference
Version 1 · JSON over HTTPS
The Juvega Partner API lets approved partners sell eSIMs, gift cards, phone numbers and crypto swaps from their own website, app or bot. It is a JSON REST API. Prices are in USD, and orders are paid from your prepaid partner balance.
To get access, apply on the Partners page. Once approved, create an API key there.
Basics
- Base URL:
https://juvega.com/api/v1 - Authentication: send your key in a header:
Authorization: Bearer jv_live_…(orX-API-Key: jv_live_…). Keep keys on your server, never in a web page or app. - Format: send JSON with
Content-Type: application/json. Every reply is JSON. - Errors: an HTTP error status and
{"error": {"code": "…", "message": "…"}}. - Rate limit: 120 requests per minute per partner (
429withRetry-Afterwhen exceeded).
curl https://juvega.com/api/v1/account \
-H "Authorization: Bearer jv_live_YOUR_KEY"Account and balance
GET /account
Your partner name, discount, balance and which services are available.
{
"partner": "Example Ltd",
"discount_percent": 10,
"balance": 250.00,
"currency": "USD",
"services": {"esim": true, "giftcard": true, "numbers": true, "swap": true}
}POST /account/topup
Body {"amount": 500}. Returns a payment_url: pay it in crypto and the amount is added to your balance once the payment is confirmed. Amounts from 50 to 20000 USD. You can also top up on the Partners page.
Products (eSIMs and gift cards)
GET /products
Optional filters: type=esim or type=giftcard, country=JP (eSIMs, two-letter code), q= (search), page, per_page (up to 500).
{
"data": [
{"id": "japan-5gb-30days", "type": "esim", "name": "Japan 5GB 30Days", "country": "Japan", "country_code": "JP",
"data_gb": 5, "days": 30, "price": 9.00, "currency": "USD", "options": []},
{"id": "amazon-com-usa", "type": "giftcard", "brand": "Amazon.com", "price": 23.40,
"options": [{"id": "o1a2b3c4", "label": "25 USD", "price": 23.40}, {"id": "o5d6e7f8", "label": "50 USD", "price": 46.80}]}
],
"page": 1, "per_page": 100, "total": 1240
}price is your price (after your discount). For gift cards, buy one of the options.
GET /products/{id}
One product.
Orders
POST /orders
{"product": "japan-5gb-30days", "reference": "your-order-123"}
{"product": "amazon-com-usa", "option": "o1a2b3c4", "reference": "your-order-124"}The price is taken from your balance straight away. reference is optional but recommended: sending the same reference again returns the first order instead of buying twice, so retries are safe.
Reply (201):
{
"id": "20261101-142233-9f8e7d6c",
"reference": "your-order-123",
"status": "processing",
"type": "esim",
"price": 9.00,
"delivery": null
}GET /orders/{id}
Poll every 5 to 10 seconds until status is delivered (usually under a minute). Then delivery holds the item:
eSIM:
"delivery": {
"iccid": "8910…",
"activation_code": "LPA:1$smdp.example$ABC123",
"qr_code_url": "https://…/qr.png",
"smdp_address": "smdp.example",
"matching_id": "ABC123"
}Gift card:
"delivery": {"code": "XXXX-XXXX-XXXX", "pin": "", "link": "", "instructions": "…", "expires": ""}If an item cannot be delivered, status becomes failed, error explains why, and your balance is refunded automatically.
GET /orders
Your orders, newest first (page, per_page).
eSIM top-ups
Add data to an eSIM you sold earlier.
GET /topups?iccid=8910…: the top-ups available for that eSIM, with your price.POST /topupswith{"iccid": "8910…", "package": "TOPUP_…", "reference": "…"}: paid from your balance; returns an order (type:topup). PollGET /orders/{id}like other orders.
Phone numbers for 6 or 12 months
Keep the same number for months to receive SMS (receive only).
GET /rentals/offers: countries with your 6- and 12-month price.POST /rentalswith{"offer": "…", "months": 6}: paid from your balance; the reply'srental.idandrental.phoneidentify the number.GET /rentals/{rental id}: the number,paid_untiland itsmessages.POST /rentals/{rental id}/renewwith{"months": 6}: add more months.
Phone numbers (SMS verification)
GET /numbers/services: the services you can rent a number for.GET /numbers/prices?service=telegram: countries, your price and how many numbers are free.POST /numberswith{"service": "telegram", "country": "england"}: rents a number and takes the price from your balance.GET /numbers/{id}: poll for incoming SMS (smslist withcode).POST /numbers/{id}/cancel: no code yet? Cancel and get a full refund. Numbers that time out without a code are refunded automatically.POST /numbers/{id}/finish: done with the number.
Crypto swaps
Swaps are paid by your customer directly (they send coins to the deposit address), so they do not use your balance. You earn a share of the swap fee, added to your balance when the swap completes.
GET /swap/currenciesPOST /swap/quotewith{"from": "BTC", "to": "XMR", "amount": 0.01, "type": "float"}POST /swapwith{"from": "BTC", "to": "XMR", "amount": 0.01, "type": "float", "address": "<customer's XMR address>", "reference": "…"}: returnsdeposit.addressanddeposit.amountfor your customer to pay.GET /swap/{id}: status (new,pending,exchange,withdraw,done,expired,emergency).
White-label shop
No developer? Switch on your white-label shop on the Partners page: eSIMs and gift cards with your name, logo and colour, at https://juvega.com/s/your-shop/ or on your own domain. You choose your markup. Customers pay you in crypto and the difference between your price and your partner price is added to your balance.
Good practice
- Keep your balance topped up; orders fail with
402 insufficient_balancewhen it runs out. - Use a
referenceon every order. - Show eSIM
activation_codeas a QR code for your customers, and tell them to install it once only. - Questions? Contact us.