API reference
List plans
Returns the catalogue you can sell, priced at your tier in your account currency.
GET
https://app.journeystack.co/api/public/v1/plansQuery parameters
| Field | Type | Description |
|---|---|---|
country | string | ISO 3166-1 alpha-2 country code, e.g. SG. Case-insensitive. |
region | string | Region code for multi-country packs, e.g. EU, AS, ME. |
type | string | fixed (a data bundle) or unlimited (billed per day). |
search | string | Substring match on the plan name. |
min_days | integer | Only plans with validity of at least this many days. |
max_days | integer | Only plans with validity of at most this many days. |
page | integerdefault 1 | 1-based page number. |
limit | integerdefault 50 | Results per page, 1–100. |
Behaviour you should rely on
- The
typefilter is applied after the page is fetched, so a page may return fewer rows thanlimitwhen filtering by type. - Plans are ordered cheapest first and only active plans are returned.
Request
cURL
curl "https://app.journeystack.co/api/public/v1/plans?country=SG®ion=SG" \
-H "Authorization: Bearer $JS_KEY"Response
200 OK
{
"data": [{
"id": "0f4c1c2e-6f8a-4a09-9f0d-2f1b8c7d5e41",
"name": "Singapore Unlimited",
"type": "unlimited",
"data": {
"unlimited": true,
"bytes": null,
"daily_allowance": "500 MB",
"throttled_speed": "1 Mbps"
},
"validity": { "days": null, "billed_per_day": true, "min_days": 1, "max_days": 365 },
"coverage": { "type": "country", "code": "SG", "name": "Singapore" },
"price": { "amount": 2.45, "currency": "USD", "per": "day" }
}],
"pagination": { "page": 1, "limit": 50, "total": 2271 }
}Selected response fields
| Field | Type | Description |
|---|---|---|
id | uuid | Journey Stack plan ID. Pass this as plan_id when ordering. |
type | string | fixed or unlimited. |
data.bytes | integer|null | Total data for fixed plans. null on unlimited plans. |
data.daily_allowance | string|null | Full-speed allowance per day on unlimited plans. |
data.throttled_speed | string|null | Speed after the daily allowance is used. |
validity.days | integer|null | Fixed validity. null when the plan is billed per day. |
validity.billed_per_day | boolean | When true, send days on the order. |
price.amount | number | Your price. For per-day plans this is the price for one day. |
price.per | string | esim or day. |
Errors
| Code | HTTP | What to do |
|---|---|---|
| unauthorized | 401 | Check the Authorization header and that the key is still active in your portal. |
| account_inactive | 403 | Nothing to retry. Contact support@journeystack.co. |
| rate_limited | 429 | Honour `Retry-After` (60 seconds) and back off. Ask support for a higher limit. |
| internal_error | 500 | Retry with the same idempotency key — it can never double-charge you. |
Sandbox console
Run this endpoint against the sandbox with your own test key. Nothing is provisioned on the live network and no real money moves.