Resources to Help You Get the Most Out of NobelSMS Everything you need to launch, manage, and optimize your SMS campaigns—brought together in one place.
Person using NobelSMS SMS platform resources and documentation
Knowledge base Our Knowledge Base provides you with step-by-step instructions and best practices, enabling you to maximize the platform's potential.
Getting started with NobelSMS SMS platform — step by step setup guide Getting Started Open your account in just a few steps and begin sending SMS right away. Learn More
NobelSMS SMS dashboard overview — track metrics and manage campaigns Dashboard Overview Your central hub for all SMS-related matters. Learn how to navigate menus, track balances, and monitor campaigns. Learn More
SMS campaign setup guide — create and send bulk SMS campaigns with NobelSMS Campaign Setup From drafting your first message to scheduling and sending bulk campaigns, here’s everything you need. Learn More
SMS contact management guide — import segment and manage contact lists Contact Management Organize your audience like a pro. Import lists, create groups, and apply filters for smarter targeting. Learn More
SMS message templates guide — create reusable SMS templates Message Templates Save time by creating reusable SMS templates that keep your tone consistent. Learn More
NobelSMS payments and credits guide — manage account and billing Payments & Credits Easily top up your account, track spending, and manage your billing securely. Learn More
Quickstart Copy working code for authentication, sending SMS, and checking delivery status — pick your language and paste it straight into your project.
NodeJs
Python
PHP
  • Authenticate
  • Get Balance
  • Send a Single SMS
  • Send Bulk SMS
/**
 * NobelSMS Payment API — reference client.
 *
 * A small, dependency-free client for the NobelSMS gateway.
 * Uses only built-in Node.js APIs (Node 18+, for global `fetch`).
 *
 * Flow:
 *   1. login()       -> get an access token
 *   2. getBalance()  -> check remaining credit
 *   3. sendSms()     -> send one or many messages (same endpoint for both)
 *
 * Everything goes through the `NobelSmsClient` class, which holds the token
 * so callers don't have to pass it around manually.
 */

const BASE_URL = "https://payment-api.nobelsms.com/api/v1";

// The API wants an app identifier on several headers (x-source-platform,
// x-source-host) and in the login body (sendFrom). It can be any string —
// we set it once here so it's consistent everywhere.
const APP_NAME = "MyApplication";

// A sender ID (sendFrom on each message) is limited to 11 characters by the
// gateway. We validate against this before hitting the network.
const MAX_SENDER_LENGTH = 11;

/** Raised for any API-level or transport failure. */
class NobelSmsError extends Error {
  constructor(message) {
    super(message);
    this.name = "NobelSmsError";
  }
}

class NobelSmsClient {
  /**
   * Thin wrapper around the NobelSMS endpoints.
   *
   * Typical usage:
   *   const client = new NobelSmsClient();
   *   await client.login("your.username", "your.password");
   *   console.log(await client.getBalance());
   *   await client.sendSms([{ ... }]);
   */
  constructor(appName = APP_NAME, baseUrl = BASE_URL) {
    this._appName = appName;
    this._baseUrl = baseUrl.replace(/\/+$/, "");
    this._token = null;
  }

  // -------------------------------------------------------------------- //
  // Internal helpers
  // -------------------------------------------------------------------- //

  /**
   * Send a JSON request and return the decoded JSON response.
   *
   * `authenticated = true` automatically attaches the Bearer token, so
   * individual methods don't repeat that boilerplate.
   */
  async _request(method, path, { headers = {}, body = null, authenticated = true } = {}) {
    const allHeaders = { "Content-Type": "application/json", ...headers };

    if (authenticated) {
      if (this._token === null) {
        throw new NobelSmsError("Not logged in — call login() first.");
      }
      allHeaders["Authorization"] = `Bearer ${this._token}`;
    }

    let response;
    try {
      response = await fetch(`${this._baseUrl}${path}`, {
        method,
        headers: allHeaders,
        // Only attach a body when there is one (e.g. not on a GET).
        body: body !== null ? JSON.stringify(body) : undefined,
      });
    } catch (err) {
      // Network-level failure (DNS, connection refused, timeout, ...).
      throw new NobelSmsError(`${method} ${path} failed: ${err.message}`);
    }

    if (!response.ok) {
      // Surface the server's error body — it usually explains *why*.
      const detail = await response.text();
      throw new NobelSmsError(`${method} ${path} -> HTTP ${response.status}: ${detail}`);
    }

    return response.json();
  }

  // -------------------------------------------------------------------- //
  // Public API
  // -------------------------------------------------------------------- //

  /**
   * Authenticate and cache the access token for subsequent calls.
   * Returns the token in case the caller wants to store or inspect it.
   */
  async login(username, password) {
    const payload = await this._request("POST", "/sms-plugins-gate/login", {
      headers: { "x-source-platform": this._appName },
      body: {
        username,
        password,
        sendFrom: this._appName,
      },
      authenticated: false, // no token yet — this call is what gets us one
    });

    this._token = payload.accessToken;
    return this._token;
  }

  /**
   * Fetch the current account balance.
   *
   * Response shape:
   *   {
   *     "id": 1234,
   *     "car_id": 1234,
   *     "balance_updated": "2026.01.01 12:12:12",
   *     "currency_code": "EUR", // OR "USD"
   *     "balance": 12.33
   *   }
   */
  async getBalance() {
    return this._request("GET", "/sms-plugins-gate/current-balance", {
      headers: { "x-source-host": this._appName },
    });
  }

  /**
   * Send one or more SMS messages.
   *
   * The endpoint is always "bulk" — a single message is just an array with
   * one item, so there's no separate single-send method to maintain.
   *
   * Each message is an object:
   *   {
   *     sendTo:   "+14047241937",  // valid phone number
   *     sendFrom: "MyApp",         // sender name, max 11 chars
   *     message:  "Hello!",        // over 160 chars is sent as 2 SMSs
   *     country:  "US"             // ISO country code
   *   }
   *
   * Returns a summary with per-message delivery details.
   */
  async sendSms(messages) {
    // Validate locally so an obvious mistake fails fast, before the
    // round-trip to the server.
    for (const message of messages) {
      if (message.sendFrom.length > MAX_SENDER_LENGTH) {
        throw new Error(
          `sendFrom '${message.sendFrom}' exceeds ${MAX_SENDER_LENGTH} characters.`
        );
      }
    }

    return this._request("POST", "/sms-plugins-gate/bulk-send-sms", {
      headers: {
        "x-source-platform": this._appName,
        "x-source-host": this._appName,
      },
      body: messages,
    });
  }
}

// ---------------------------------------------------------------------- //
// Example run
// ---------------------------------------------------------------------- //

async function main() {
  const client = new NobelSmsClient();

  // 1. Authenticate.
  // TODO: Use your own credentials (and keep them out of source control).
  await client.login("your.username", "your.password");

  // 2. Check the balance.
  const balance = await client.getBalance();
  console.log(`Balance: ${balance.balance} ${balance.currency_code}`);

  // 3. Send a single message (array with one item).
  // TODO: Change to a real number to test yourself.
  const result = await client.sendSms([
    {
      sendTo: "+14047241937",
      sendFrom: "MyApp",
      message: "Hello!",
      country: "US",
    },
  ]);
  console.log("# Sending 1 SMS...");
  console.log(`Sent ${result.sentCount}, rejected ${result.rejectedCount}`);

  // 4. Send several messages in one request.
  // TODO: Change to real numbers to test yourself.
  const bulk = await client.sendSms([
    { sendTo: "+14047241937", sendFrom: "MyApp", message: "Msg 1", country: "US" },
    { sendTo: "+14047241938", sendFrom: "MyApp", message: "Msg 2", country: "US" },
  ]);

  console.log("# Sending multiple SMSs...");
  for (const detail of bulk.details) {
    console.log(`${detail.dnis}: ${detail.http_status} (${detail.message_id})`);
  }
  console.log(`Sent ${bulk.sentCount}, rejected ${bulk.rejectedCount}`);
}

main().catch((err) => {
  console.error(err);
  process.exit(1);
});
Compliance & Guidelines SMS regulations vary from country to country. To help you stay compliant and deliver messages without interruptions, we’ve gathered essential regulatory and operator guidelines in one hub.
API Access & Documentation For businesses that want to integrate SMS directly into their systems, NobelSMS provides API connectivity.
SMS API capabilities icon — send SMS manage contacts check delivery status Capabilities Send SMS, manage contacts, check delivery status, and more.
SMS API access icon — API credentials and documentation Access API credentials and full documentation are available here.
SMS API access icon — API credentials and documentation How to get started Please reach out to your account manager or our support team for details, technical guidance, and best practices.
FAQ Quick answers to the most common questions—from setup and billing to delivery rules and API use.
How quickly can I start sending SMS with NobelSMS?
You can get started right away. Create a free account, add credits, and you’re ready to launch campaigns within minutes.
Do I need a contract or long-term commitment?
No contracts required. NobelSMS works on a pay-as-you-go model, so you only pay for the messages you send.
Are there setup or hidden fees?
No. Our pricing is transparent—what you see is what you pay. There are no onboarding or maintenance fees.
Can I get special rates for high volumes?
Yes. If you’re planning to send large volumes of SMS, our team can create a custom pricing plan tailored to your needs. Contact your account manager for details.
Does NobelSMS offer API access?
Yes. API connectivity is available for businesses that want to integrate SMS into their systems. Please reach out to your account manager for access and documentation.
What payment methods do you support?
We accept both FIAT payments (cards, bank transfers) and crypto payments, giving you flexibility in how you fund your account.
Is there a limit to how many SMS I can send at once?
No fixed limits—whether you need to send a handful of messages or large-scale bulk campaigns, NobelSMS is built to scale with your needs.
Need Assistance? We’re Here to Help Try for Free Create Free Account
Chat offline! We're currently offline. Please leave a message