One integration, several carriers. You keep the customer; we provision the line. Base URL https://solutiontelecommobile.com/v1 — OpenAPI 3.0.
curl https://solutiontelecommobile.com/v1/balance \ -H "Authorization: Bearer stm_sandbox_your_key_here"
curl -X POST https://solutiontelecommobile.com/v1/orders \
-H "Authorization: Bearer $STM_KEY" \
-H "Idempotency-Key: your-order-4711" \
-H "Content-Type: application/json" \
-d '{"sku":"PFRQ8FIBC","quantity":1,"reference":"your-order-4711"}'
| Método | Caminho | O que faz |
|---|---|---|
| GET | /v1/catalog | Planos disponíveis para você, já no seu preço |
| GET | /v1/catalog/{sku} | Um plano |
| POST | /v1/orders | Buy — requires Idempotency-Key |
| GET | /v1/orders | Seus pedidos, do mais novo para o mais antigo |
| GET | /v1/orders/{id} | Um pedido, com ICCID, LPA e o conteúdo do QR |
| POST | /v1/orders/{id}/topup | Adiciona dados a um eSIM já vendido — o QR não muda |
| GET | /v1/balance | Saldo pré-pago |
| GET | /v1/usage/{iccid} | Dados usados, restantes e validade de um eSIM |
{
"data": {
"id": 5,
"environment": "sandbox",
"status": "delivered",
"sku": "PFRQ8FIBC",
"quantity": 1,
"unit_price_usd": "0.3750",
"total_price_usd": "0.3750",
"currency": "USD",
"reference": null,
"topup_of": 4,
"esims": [{
"iccid": "8955...",
"activation_code": "LPA:1$smdp.example$MATCHINGID",
"qrcode": "LPA:1$smdp.example$MATCHINGID"
}]
}
}
Recarga mantém o mesmo QR. POST /v1/orders/{id}/topup returns a new order with topup_of pointing at the original — the traveller installs nothing again, the data simply lands on the same eSIM.
Two of them, and the second is the one that protects you: a cap on requests per minute, and a cap on how much balance can be spent per hour. A loop without a sleep can otherwise drain your account in seconds. When you hit either, we answer 429 with Retry-After — retry with the same key, never a new one.
| Status | Código | Significado |
|---|---|---|
| 400 | missing_idempotency_key | Os endpoints de compra exigem |
| 401 | invalid_token | Chave errada ou revogada |
| 402 | insufficient_balance | Carregue a sua conta |
| 403 | account_not_live | Entrada ainda não concluída — use uma chave de sandbox |
| 404 | not_found | Plano ou pedido indisponível para a sua conta |
| 409 | idempotency_key_reuse | Mesma chave, corpo diferente |
| 429 | rate_limit | Requisições demais, ou teto de gasto por hora |
| 502 | carrier_error | A operadora falhou — o saldo voltou automaticamente |
We add fields freely; we never rename or remove one without publishing /v2 and keeping /v1 running. Write your parser to ignore unknown fields and your integration will not break.
Fale com a gente para receber uma chave