Skip to content

Current account balance.

GET /api/v1/user/balance · Permission: balance.read

Terminal window
curl https://restlink23telecom.com/api/v1/user/balance \
-H "X-API-Key: $API_KEY"
200 OK
{
"balance": 1250.50,
"currency": "EUR",
"updated": "2026.02.13 10:15:00",
"credit_limit": 0,
"available_balance": 1250.50
}

available_balance is balance + credit_limit — the actual amount you can spend. Accounts without a credit line have credit_limit: 0, so available_balance equals balance.

When available_balance drops to zero or below, the response additionally contains "credit_blocked": true. Treat this as an account-funding warning. It is gated on available_balance, not on balance — a credit account with a negative balance that is still within its credit_limit is not flagged.

New processing on the current send endpoints does not create a send-time 402. It accepts and queues direct API traffic fail-open when Portal’s local balance or pricing data is unavailable. This keeps transactional traffic moving, but it does not guarantee that the upstream account has enough credit.

Monitor available_balance and credit_blocked before large campaigns. For an accepted message, use its later delivery report as the source of truth for final status and cost; do not retry an accepted message_id merely because the local cost is 0 or the balance cache is degraded.

Balance and pricing are served from a background-refreshed cache. If the cache is unavailable, the API still returns HTTP 200 but flags degradation via response headers:

Header Values Meaning
X-Sms-Gateway-Status partial, unavailable Data quality indicator
X-Sms-Gateway-Reason cache_disabled, cache_miss_refresh_failed Machine-readable reason

These headers are absent on healthy responses. Degraded balance responses look like {"balance": 0, "currency": "", "unavailable": true, "reason": "…"} — check the unavailable flag before alerting on a zero balance. Never infer a currency from a degraded response.

Status error_code When
403 FORBIDDEN An API key lacks balance.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, 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.

Poll balance once every few minutes at most (the cache refreshes on its own cadence), alert on credit_blocked: true, and ignore zero-balance readings that carry the unavailable: true flag.