Get pricing
Copy page
SMS rates per destination country and network.
GET /api/v1/user/pricing · Permission: pricing.read
Request
Section titled “Request”curl https://restlink23telecom.com/api/v1/user/pricing \ -H "X-API-Key: $API_KEY"const res = await fetch('https://restlink23telecom.com/api/v1/user/pricing', { method: 'GET', headers: { 'X-API-Key': process.env.API_KEY },});
if (!res.ok) { const err = await res.json(); throw new Error(`${err.error_code}: ${err.description}`);}const data = await res.json();console.log(data);import osimport requests
res = requests.get( "https://restlink23telecom.com/api/v1/user/pricing", headers={"X-API-Key": os.environ["API_KEY"]},)res.raise_for_status()print(res.json())<?php$ch = curl_init('https://restlink23telecom.com/api/v1/user/pricing');curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['X-API-Key: ' . getenv('API_KEY')],]);
$response = curl_exec($ch);$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);curl_close($ch);
if ($status !== 200) { throw new Exception("HTTP $status: $response");}$data = json_decode($response, true);print_r($data);require "net/http"require "json"
uri = URI("https://restlink23telecom.com/api/v1/user/pricing")req = Net::HTTP::Get.new(uri)req["X-API-Key"] = ENV.fetch("API_KEY")
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }raise "HTTP #{res.code}: #{res.body}" unless res.is_a?(Net::HTTPSuccess)
puts JSON.parse(res.body)import java.net.URI;import java.net.http.HttpClient;import java.net.http.HttpRequest;import java.net.http.HttpResponse;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://restlink23telecom.com/api/v1/user/pricing")) .header("X-API-Key", System.getenv("API_KEY")) .GET() .build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());System.out.println(response.body());package main
import ( "fmt" "io" "net/http" "os")
func main() { req, err := http.NewRequest("GET", "https://restlink23telecom.com/api/v1/user/pricing", nil) if err != nil { panic(err) } req.Header.Set("X-API-Key", os.Getenv("API_KEY"))
res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close()
data, _ := io.ReadAll(res.Body) fmt.Println(string(data))}using System.Text;
using var client = new HttpClient();client.DefaultRequestHeaders.Add("X-API-Key", Environment.GetEnvironmentVariable("API_KEY"));
var response = await client.GetAsync("https://restlink23telecom.com/api/v1/user/pricing");
response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());Response
Section titled “Response”API key
Section titled “API key”An array of pricing entries — one per network. X-Account-Currency contains the account currency when known:
[ { "mcc": "310", "mnc": "004", "mccmnc": "310004", "dialcode": "1", "country": "United States", "network": "Verizon Wireless", "rate": 0.0085, "prev_rate": 0.0080, "rate_start_date": "2026.01.08 22:15:29", "rate_end_date": "2100.01.01 00:00:00", "change_type": "Increase" }]Portal session
Section titled “Portal session”Portal session calls return an envelope; API integrations always receive the array above.
{"currency": "EUR", "prices": [ {"mcc": "310", "mccmnc": "310004", "country": "United States", "network": "Verizon Wireless", "rate": 0.0085, "rate_start_date": "2026.01.08 22:15:29", "rate_end_date": "2100.01.01 00:00:00"}]}| Field | Description |
|---|---|
mcc / mccmnc |
Mobile Country Code and combined identifier |
mnc |
Mobile Network Code (omitted when empty) |
dialcode |
International dialing prefix (omitted when empty) |
country / network |
Human-readable names |
rate |
Current rate in your account currency |
prev_rate |
Previous rate, for change tracking (omitted when zero) |
rate_start_date |
When the current rate took effect (YYYY.MM.DD HH:MM:SS) |
rate_end_date |
Far-future sentinel (2100.01.01) while the rate is ongoing |
change_type |
Same, Increase or Decrease (omitted when empty) |
Currency
Section titled “Currency”Rates are denominated in the active workspace’s account currency. API-key
responses expose that ISO 4217 code in X-Account-Currency (omitted while it
is unknown and readable cross-origin); balance also carries
it as currency.
Errors
Section titled “Errors”| Status | error_code |
When |
|---|---|---|
| 403 | FORBIDDEN |
An API key lacks pricing.read. Only this case carries required_permission; enable it in Portal → API Keys. |
| 403 | FORBIDDEN |
An Integration SMS key can call only the integration send endpoint; no required_permission is included. |
| 403 | SECTION_ACCESS_DENIED |
A team member (portal session or a key they created) whose role hides Balance & prices or lacks balance.read; the body carries "section": "balance_prices". Owners never receive this error. |
| 403 | API_KEY_CREATOR_INACTIVE |
The key’s creator is no longer active. |
| 429 | RATE_LIMIT_EXCEEDED |
The account’s request rate limit is exceeded (shared by API keys and portal sessions). Retry-After is 1 and X-RateLimit-Limit/X-RateLimit-Burst give the applied limit; a suspended account or team member gets Retry-After: 60 and zero limits. |
| 429 | TOO_MANY_ATTEMPTS |
Too many failed API-key checks from one IP; wait for Retry-After seconds. No X-RateLimit-* headers. |
| 503 | API_KEY_VALIDATION_UNAVAILABLE, AUTH_PROTECTION_UNAVAILABLE, REPLAY_PROTECTION_UNAVAILABLE (signed POST only), RATE_LIMIT_UNAVAILABLE, SECTION_ACCESS_UNAVAILABLE, WORKSPACE_ACCESS_UNAVAILABLE |
A check before the handler is briefly unavailable; retry. See Temporary errors. |
Portal sessions can also receive CROSS_TENANT_WORKSPACE, NO_ACCESSIBLE_WORKSPACE or NO_MAIN_WORKSPACE; see Errors. A cookie-authenticated POST without a valid CSRF token gets CSRF_FAILED.
POST /user/pricingreturns identical data (kept for frontend compatibility; the request body is ignored).GET /user/pricing/:idignores the:idvalue and returns{"currency": "EUR"}(or an empty string when unknown); fetch the full list and filter client-side bymccmnc.- Check
status === falsebefore treating the body as prices: during account setup the endpoint returns HTTP 200 with{"status": false, "error": "Account is in setup process", …}. - Degraded-cache behavior matches balance:
an empty array
[]for API keys or"prices": []for sessions, plusX-Sms-Gateway-Status.
