nexmo vs plivo vs twilio
Communication APIs for SMS, Voice, and Verification
nexmoplivotwilioSimilar Packages:

Communication APIs for SMS, Voice, and Verification

twilio, plivo, and nexmo are backend communication platforms that enable developers to integrate SMS, voice calls, and verification services into web and mobile applications. twilio is the market leader with a vast ecosystem of communication tools. plivo focuses on cost-effective global messaging and voice with a simpler API surface. nexmo was a major player acquired by Vonage, and its original npm package is now deprecated in favor of the Vonage Server SDK. All three provide Node.js libraries to interact with their REST APIs, but they differ in maintenance status, feature depth, and pricing models.

Npm Package Weekly Downloads Trend

3 Years

Github Stars Ranking

Stat Detail

Package
Downloads
Stars
Size
Issues
Publish
License
nexmo041494 kB1-MIT
plivo0104957 kB424 days agoMIT
twilio01,52715.4 MB5213 days agoMIT

Twilio vs Plivo vs Nexmo: Architecture, Maintenance, and API Design

When building applications that need to send texts, make calls, or verify users, you typically rely on a Communication Platform as a Service (CPaaS). twilio, plivo, and nexmo have been the top contenders in this space for years. However, their current status and technical approaches differ significantly. Let's break down how they handle core tasks and what that means for your architecture.

⚠️ Package Status and Maintenance

This is the most critical factor for long-term projects.

twilio is actively maintained.

  • The twilio npm package receives regular updates.
  • Security patches and new feature additions are frequent.
  • It is safe for production use in new projects.
// twilio: Actively maintained
const twilio = require('twilio');
const client = twilio(accountSid, authToken);

plivo is actively maintained.

  • The plivo npm package is stable and updated.
  • Focuses on core messaging and voice stability.
  • It is safe for production use in new projects.
// plivo: Actively maintained
const plivo = require('plivo');
const client = new plivo.Client(authId, authToken);

nexmo is deprecated.

  • The nexmo package is no longer updated.
  • Vonage (the owner) directs users to @vonage/server-sdk.
  • Using nexmo in new projects introduces security and compatibility risks.
// nexmo: DEPRECATED - Do not use in new projects
const Nexmo = require('nexmo');
const nexmo = new Nexmo(key, secret);
// Migration path: npm install @vonage/server-sdk

πŸ“© Sending SMS Messages

All three platforms allow you to send text messages, but the method signatures and object structures vary.

twilio uses a resource-based approach.

  • You access .messages on the client instance.
  • Parameters like from, to, and body are explicit.
  • Returns a promise with detailed message metadata.
// twilio: Send SMS
await client.messages.create({
  body: 'Hello from Twilio',
  from: '+1234567890',
  to: '+0987654321'
});

plivo uses a similar resource structure but with different parameter names.

  • You access .messages on the client instance.
  • Uses src and dst instead of from and to.
  • Generally returns a simpler response object.
// plivo: Send SMS
await client.messages.create({
  text: 'Hello from Plivo',
  src: '+1234567890',
  dst: '+0987654321'
});

nexmo (Legacy) used a callback-heavy style originally, though promises were added later.

  • You access .message on the instance.
  • Uses sendSms method with positional arguments or an object.
  • Requires migration to Vonage SDK for modern promise support.
// nexmo: Send SMS (Legacy)
const message = {
  from: 'Vonage',
  to: '+0987654321',
  text: 'Hello from Nexmo'
};

nexmo.message.sendSms(message.from, message.to, message.text, (err, responseData) => {
  if (err) { console.log(err); }
});

πŸ“ž Making Voice Calls

Voice APIs are more complex because they involve call flow control (what happens when someone answers).

twilio uses TwiML to define call behavior.

  • You create a call and point it to a URL or inline TwiML.
  • Highly flexible for interactive voice response (IVR) systems.
  • Supports complex call branching and recording.
// twilio: Make Voice Call
await client.calls.create({
  url: 'http://example.com/call-control.xml',
  from: '+1234567890',
  to: '+0987654321'
});

plivo uses Plivo XML (similar to TwiML).

  • You initiate a call and specify an answer URL.
  • Supports basic call flow and recording features.
  • Slightly less extensive than Twilio for complex IVR.
// plivo: Make Voice Call
await client.calls.create({
  answer_url: ['http://example.com/call-control.xml'],
  from: '+1234567890',
  to: '+0987654321'
});

nexmo (Legacy) used the Voice API with JSON call objects.

  • You defined the call flow in a JSON object.
  • Vonage now uses a more modern Voice API in the new SDK.
  • Legacy package lacks newer voice features like websockets.
// nexmo: Make Voice Call (Legacy)
const call = {
  to: [{ type: 'phone', number: '+0987654321' }],
  from: { type: 'phone', number: '+1234567890' },
  ncco: [{ action: 'talk', text: 'Hello' }]
};

nexmo.voice.createCall(call, (err, res) => {
  if (err) { console.log(err); }
});

πŸ” User Verification (2FA)

Sending one-time passwords (OTP) is a common use case. All three have dedicated APIs for this.

twilio has a dedicated verify service.

  • Handles rate limiting and retry logic automatically.
  • Supports multiple channels (SMS, Voice, Email).
  • Best for high-security requirements.
// twilio: Send Verification Code
await client.verify.v2.services('VAxxxx').verifications.create({
  to: '+0987654321',
  channel: 'sms'
});

plivo offers a Verify API.

  • Simple send and check workflow.
  • Good for basic 2FA needs.
  • Less configurable than Twilio Verify.
// plivo: Send Verification Code
await client.verify.send_verification({
  recipient: '+0987654321',
  channel: 'sms'
});

nexmo (Legacy) had a Verify API.

  • Now part of Vonage Verify API.
  • Legacy package does not receive security updates for auth flows.
  • Migration is essential for compliance.
// nexmo: Send Verification Code (Legacy)
nexmo.verify.request({
  number: '+0987654321',
  brand: 'MyApp'
}, (err, result) => {
  if (err) { console.log(err); }
});

🚨 Error Handling and Reliability

How each library handles network failures and API errors impacts your code stability.

twilio throws standard JavaScript errors.

  • Errors include status codes and error codes (e.g., 21211 for invalid number).
  • Easy to catch and handle with try/catch blocks.
  • Detailed error messages help with debugging.
// twilio: Error Handling
try {
  await client.messages.create({ ... });
} catch (error) {
  console.log(`Twilio Error ${error.code}: ${error.message}`);
}

plivo throws errors with response details.

  • Errors contain API error codes and messages.
  • Consistent with standard Node.js error patterns.
  • Requires checking error object properties.
// plivo: Error Handling
try {
  await client.messages.create({ ... });
} catch (error) {
  console.log(`Plivo Error: ${error.message}`);
}

nexmo (Legacy) used callbacks or promises inconsistently.

  • Older versions relied heavily on callbacks.
  • Error objects varied between API endpoints.
  • Modern async/await patterns are harder to implement cleanly.
// nexmo: Error Handling (Legacy)
nexmo.message.sendSms(..., (err, result) => {
  if (err) {
    console.log(`Nexmo Error: ${err}`);
  }
});

πŸ“Š Summary: Key Differences

Featuretwilioplivonexmo
Statusβœ… Activeβœ… Active❌ Deprecated
SMS Paramsfrom, to, bodysrc, dst, textfrom, to, text
Voice ControlTwiML (XML)Plivo XMLNCCO (JSON)
Verify APIβœ… Advancedβœ… Basicβœ… Legacy
Error StyleStandard ErrorsStandard ErrorsCallbacks/Mixed
ReplacementN/AN/A@vonage/server-sdk

πŸ’‘ The Big Picture

twilio is the safe bet for most teams. It costs more, but the reliability, documentation, and feature depth save engineering time. Use it for critical communication flows where failure is not an option.

plivo is the budget-friendly alternative. It works well for high-volume SMS or simple voice needs where you don't need advanced IVR or video. It is a solid choice for cost-sensitive startups.

nexmo should be avoided. If you see this package in a codebase, plan a migration to the Vonage Server SDK immediately. Using deprecated communication libraries poses security risks for user data and verification flows.

Final Thought: For new projects, choose between twilio and plivo based on budget and feature needs. Never start a new project with nexmo.

How to Choose: nexmo vs plivo vs twilio

  • nexmo:

    Do NOT choose nexmo for new projects. The nexmo npm package is deprecated and has been replaced by the Vonage Server SDK (@vonage/server-sdk). Existing projects using nexmo should plan a migration to Vonage to ensure security updates and continued support. Treat this package as legacy technology.

  • plivo:

    Choose plivo if cost is a primary concern and you need high-volume SMS or voice capabilities without extra features. It offers competitive pricing and a straightforward API that works well for simple use cases. It is suitable for startups or projects where budget efficiency outweighs the need for a broad feature set.

  • twilio:

    Choose twilio if you need the most reliable infrastructure with extensive documentation and a wide range of features like video, verify, and programmable voice. It is ideal for enterprise projects where uptime and support are critical, despite potentially higher costs. The ecosystem is mature, making it easier to find help and integrations.

README for nexmo

Nexmo Client Library for Node.js

Contributor Covenant build status Known Vulnerabilities codecov

Nexmo is now known as Vonage

A Node.JS REST API Wrapper library for Nexmo.

For full API documentation refer to developer.nexmo.com.

NPM

Installation | Constructor | Callbacks | Messaging | Message Signing | Voice | Verify | Number Insight | Applications | Management | Redact | Pricing | JWT (JSON Web Token)

Installation

npm install nexmo

Constructor

const Nexmo = require('nexmo');

const nexmo = new Nexmo({
    apiKey: API_KEY,
    apiSecret: API_SECRET,
    applicationId: APP_ID,
    privateKey: PRIVATE_KEY_PATH,
    signatureSecret: SIGNATURE_SECRET,
    signatureMethod: SIGNATURE_METHOD
  }, options);
  • apiKey - API Key from Nexmo. If applicationId and privateKey are present, apiKey is optional.
  • apiSecret - API SECRET from Nexmo. If applicationId and privateKey are present, apiSecret is optional.
  • applicationId - (optional) The Nexmo Application ID to be used when creating JWTs.
  • privateKey - (optional) The Private Key to be used when creating JWTs. You can specify the key as any of the following:
    • A Buffer containing the file contents.
    • A String containing the path to the key file on disk.
  • signatureSecret - (optional) API singature secret from Nexmo, used for signing SMS message requests
  • signatureMethod - (optional) singature method matching the one you gave Nexmo, used for signing SMS message requests. Must be one of "md5hash", "md5", "sha1", "sha256", or "sha512"
  • options - (optional) Additional options for the constructor.

Options are:

{
  // If true, log information to the console
  debug: true|false,
  // append info the the User-Agent sent to Nexmo
  // e.g. pass 'my-app' for /nexmo-node/1.0.0/4.2.7/my-app
  appendToUserAgent: string,
  // Set a custom logger
  logger: {
    log: function() {level, args...}
    info: function() {args...},
    warn: function() {args...}
  },
  // Set a custom timeout for requests to Nexmo in milliseconds. Defaults to the standard for Node http requests, which is 120,000 ms.
  timeout: integer,
  // Set a custom host for requests instead of api.nexmo.com
  apiHost: string,
  // Set a custom host for requests instead of rest.nexmo.com
  restHost: string
}

Callbacks

All methods expect a callback function to be passed in, with a method signature of (error, response) where:

  • error - is an Error object if the API call returns an error, or null if the API call was successful.
  • response - is an Object, with the API response if the API call was successful, or null if there was an error.

Example:

callback = (error, response) => {
  if (error) {
    console.error(error)
  }

  if (response) {
    console.log(response)
  }
}

Messaging

Send a text message

nexmo.message.sendSms(sender, recipient, message, options, callback);

Send a Binary Message

nexmo.message.sendBinaryMessage(fromnumber, tonumber, body, udh, callback);
  • body - Hex encoded binary data
  • udh - Hex encoded udh

Send a WAP Push Message

nexmo.message.sendWapPushMessage(fromnumber, tonumber, title, url, validity, callback);
  • validity - is optional (if given should be in milliseconds)

Send a Short Code alert

nexmo.message.shortcodeAlert(recipient, messageParams, opts, callback);

Voice

For detailed information please see the documentation at https://developer.nexmo.com/api/voice

Make a call

Requires applicationId and privateKey to be set on the constructor.

nexmo.calls.create({
  to: [{
    type: 'phone',
    number: TO_NUMBER
  }],
  from: {
    type: 'phone',
    number: FROM_NUMBER
  },
  answer_url: [ANSWER_URL]
}, callback);

For more information see https://developer.nexmo.com/api/voice#createCall

Get a Call

nexmo.calls.get(callId, callback);

For more information see https://developer.nexmo.com/api/voice#getCall

Query Calls

nexmo.calls.get({status: 'completed'}, callback);

The first parameter can contain many properties to filter the returned call or to page results. For more information see the Calls API Reference.

Update a Call

nexmo.calls.update(callId, { action: 'hangup' }, callback);

For more information see https://developer.nexmo.com/api/voice#updateCall

Stream an Audio File to a Call

nexmo.calls.stream.start(
  callId,
  {
    stream_url: [
      'https://nexmo-community.github.io/ncco-examples/assets/voice_api_audio_streaming.mp3'
    ],
    loop: 1
  });

For more information see https://developer.nexmo.com/api/voice#startStream

Stop an audio stream in a call

nexmo.calls.stream.stop(callId);

For more information see https://developer.nexmo.com/api/voice#stopStream

Play synthesized text in a call

nexmo.calls.talk.start(
  callId,
  {
    text: 'No songs detected',
    voiceName: 'Emma',
    loop: 1
  }
);

For more information see https://developer.nexmo.com/api/voice#startTalk

Stop synthesized text in a call

nexmo.calls.talk.stop(callId);

For more information see https://developer.nexmo.com/api/voice#stopTalk

Send DTMF to a Call

nexmo.calls.dtmf.send(callId, params, callback);

For more information see https://developer.nexmo.com/api/voice#startDTMF

Files

For detailed information please see the documentation at https://developer.nexmo.com/voice/voice-api/guides/recording

Get a file (recording)

nexmo.files.get(fileIdOrUrl, callback);

Save a file (recording)

nexmo.files.save(fileIdOrUrl, file, callback);

Verify

Submit a Verification Request

nexmo.verify.request({number:<NUMBER_TO_BE_VERIFIED>,brand:<NAME_OF_THE_APP>},callback);

For more information check the documentation at https://developer.nexmo.com/api/verify#verify-request

Submit a PSD2 (Payment Services Directive 2) Verification Request

nexmo.verify.psd2({number:<NUMBER_TO_BE_VERIFIED>,payee:<NAME_OF_THE_SELLER>,amount:<AMOUNT_IN_EUROS>},callback);

For more information check the documentation at https://developer.nexmo.com/api/verify#verifyRequestWithPSD2

Validate the response of a Verification Request

nexmo.verify.check({request_id:<UNIQUE_ID_FROM_VERIFICATION_REQUEST>,code:<CODE_TO_CHECK>},callback);

For more information check the documentation at https://developer.nexmo.com/api/verify#verify-check

Search one or more Verification Request

nexmo.verify.search(<ONE_REQUEST_ID or ARRAY_OF_REQUEST_ID>,callback);

For more information check the documentation at https://developer.nexmo.com/api/verify#verify-search

Cancel verification

nexmo.verify.control({request_id:<UNIQUE_ID_FROM_VERIFICATION_REQUEST>,cmd:'cancel'},callback);

For more information check the documentation at https://developer.nexmo.com/api/verify#verify-control

Trigger next verification event

nexmo.verify.control({request_id:<UNIQUE_ID_FROM_VERIFICATION_REQUEST>,cmd:'trigger_next_event'},callback);

For more information check the documentation at https://developer.nexmo.com/api/verify#verify-control

Number Insight

Basic

nexmo.numberInsight.get({level: 'basic', number: NUMBER}, callback);

For more information check the documentation at https://developer.nexmo.com/number-insight/building-blocks/number-insight-basic/node

Example:

nexmo.numberInsight.get({level: 'basic', number: '1-234-567-8900'},  callback);

Standard

nexmo.numberInsight.get({level: 'standard', number: NUMBER}, callback);

For more information check the documentation at https://developer.nexmo.com/number-insight/building-blocks/number-insight-standard/node

Example:

nexmo.numberInsight.get({level: 'standard', number: '1-234-567-8900'}, callback);

Advanced

nexmo.numberInsight.get({level: 'advancedSync', number: NUMBER}, callback);

For more information check the documentation at https://developer.nexmo.com/number-insight/building-blocks/number-insight-advanced/node

Advanced Async

Number Insight Advanced might take a few seconds to return a result, therefore the option exists to process the result asynchronously through a webhook.

nexmo.numberInsight.get({level: 'advancedAsync', number: NUMBER, callback: "http://example.com"}, callback);

In this case, the result of your insight request is posted to the callback URL as a webhook. For more details on webhooks see the Number Insight Advanced documentation.

Applications

For an overview of applications see https://developer.nexmo.com/concepts/guides/applications

Create an App

nexmo.applications.create(params, callback);

For more information see https://developer.nexmo.com/api/application.v2#createApplication

params can be

{
"name": "My Application",
  "capabilities": {
    "voice": {
      "webhooks": {
        "answer_url": {
          "address": "https://example.com/webhooks/answer",
          "http_method": "POST"
        },
        "event_url": {
          "address": "https://example.com/webhooks/event",
          "http_method": "POST"
        }
      }
    },
    "messages": {
      "webhooks": {
        "inbound_url": {
          "address": "https://example.com/webhooks/inbound",
          "http_method": "POST"
        },
        "status_url": {
          "address": "https://example.com/webhooks/status",
          "http_method": "POST"
        }
      }
    },
    "rtc": {
      "webhooks": {
        "event_url": {
          "address": "https://example.com/webhooks/event",
          "http_method": "POST"
        }
      }
    },
    "vbc": {}
  }
}

Get a single App

nexmo.applications.get(appId, callback, v2flag);

For more information see https://developer.nexmo.com/api/application.v2#getApplication

  • v2flag - if true, you'll receive the V2 API response, else you'll receive a V1 style response from the V2 API

Get Apps by a filter

nexmo.applications.get(options, callback, v2flag);

For more information see https://developer.nexmo.com/api/application.v2#listApplication

  • options - filter options, use {} to get all your applications
  • v2flag - if true, you'll receive the V2 API response, else you'll receive a V1 style response from the V2 API

Update an App

nexmo.applications.update(appId, params, callback);

For more information see https://developer.nexmo.com/api/application.v2#updateApplication

Delete an App

nexmo.application.delete(appId, callback);

For more information see https://developer.nexmo.com/api/application.v2#deleteApplication

Management

Check Account Balance

nexmo.account.checkBalance(callback);

List Account Secrets

nexmo.account.listSecrets(apiKey, callback);

Get Account Secret

nexmo.account.getSecret(apiKey, secretId, callback);

Create Account Secret

nexmo.account.createSecret(apiKey, secret, callback);

Delete Account Secret

nexmo.account.deleteSecret(apiKey, secretId, callback);

Get Pricing for sending a message to a country.

nexmo.number.getPricing(countryCode, callback);
  • countryCode - 2 letter ISO Country Code

Get Pricing for sending a message or making a call to a number.

nexmo.number.getPhonePricing(product, msisdn, callback);
  • product - either voice or sms
  • msisdn - Mobile Station International Subscriber Directory Number (MSISDN) is a number used to identify a mobile phone number internationally. i.e. 447700900000

Get all numbers associated with the account.

nexmo.number.get(options, callback);
  • options parameter is an optional Dictionary Object containing any of the following parameters
    • pattern
    • search_pattern
    • index
    • size
    • has_application
    • application_id

For more details about these options, refer to the Numbers API reference

Example:

nexmo.number.get({pattern:714,index:1,size:50,search_pattern:2}, callback);

Search for MSISDN's available to purchase

nexmo.number.search(countryCode,options,callback);

options parameter is optional. They can be one of the following :

  1. number pattern to match the search (eg. 1408)
  2. Dictionary Object optionally containing the following parameters :
  • pattern
  • search_pattern
  • type
  • features
  • index
  • size

For more details about these options, refer to the Numbers API reference

Example:

nexmo.number.search('US',{pattern:3049,index:1,size:50,type:'mobile-lvn',features:'VOICE',search_pattern:2}, callback);

Purchase Number

nexmo.number.buy(countryCode, msisdn, callback);

// optional target_api_key option
nexmo.number.buy(countryCode, msisdn, target_api_key, callback);

For more details on these parameters, see the Numbers API reference.

Cancel Number

nexmo.number.cancel(countryCode, msisdn, callback);

// optional target_api_key option
nexmo.number.cancel(countryCode, msisdn, target_api_key, callback);

For more details on these parameters, see the Numbers API reference.

Update Number

nexmo.number.update(countryCode, msisdn, params, callback);

params is a dictionary of parameters as described in the Numbers API reference.

Update Password (API Secret)

nexmo.account.updatePassword(<NEW_PASSWORD>,callback);

Update Callback URL associated to the account

nexmo.account.updateSMSCallback(<NEW_CALLBACK_URL>,callback);

Change Delivery Receipt URL associated to the account

nexmo.account.updateDeliveryReceiptCallback(<NEW_DR_CALLBACK_URL>,callback);

Redact

Redact a specific ID

nexmo.redact.transaction(id, type, callback);

Pricing

type is the type of service you wish to retrieve pricing for: either sms, sms-transit or voice.

Get pricing for a specific country

nexmo.pricing.get(type, country_code, callback);

Get pricing for all countries

nexmo.pricing.getFull(type, callback);

Get pricing for a specific dialing prefix

nexmo.pricing.getPrefix(type, country_prefix, callback);

Get pricing for a specific phone number

nexmo.pricing.getPhone(type, phone, callback);

Media

Upload a file

nexmo.media.upload({"file": "/path/to/file"}, callback);

Upload from a URL

nexmo.media.upload({"url": "https://example.com/ncco.json"}, callback);

Search existing media

// See https://ea.developer.nexmo.com/api/media#search-media-files
// for possible search parameters
nexmo.media.search({ page_size: 1, page_index: 1 }, callback);

Download media

nexmo.media.download(id, callback);

Delete media

nexmo.media.delete(id, callback);

Update media

nexmo.media.update(id, body, callback);

Get media details

nexmo.media.get(id, callback);

JWT

There are two ways of generating a JWT. You can use the function that exists on the Nexmo definition:

const Nexmo = require('nexmo');

const jwt = Nexmo.generateJwt('path/to/private.key', {application_id: APP_ID});

Or via a Nexmo instance where your supplied applicationId and privateKey credentials will be used:

const Nexmo = require('nexmo');

const nexmo = new Nexmo({
    apiKey: API_KEY,
    apiSecret: API_SECRET,
    applicationId: APP_ID,
    privateKey: PRIVATE_KEY_PATH,
  });

const jwt = nexmo.generateJwt();

Signature

There are two ways of generating a signature hash. Both strip the sig parameter if supplied. You can use the function that exists on the Nexmo definition:

const Nexmo = require('nexmo');

const hash = Nexmo.generateSignature(SIGNATURE_METHOD, SIGNATURE_SECRET, params);

Or via a Nexmo instance where your supplied signatureSecret and signatureMethod:

const Nexmo = require('nexmo');

const nexmo = new Nexmo({
    apiKey: API_KEY,
    apiSecret: API_SECRET,
    signatureSecret: SIGNATURE_SECRET,
    signatureMethod: SIGNATURE_METHOD,
  });

const hash = nexmo.generateSignature();

SIGNATURE_METHOD is the signature method matching the one you gave Nexmo. Must be one of "md5hash", "md5", "sha1", "sha256", or "sha512".

Voice (Deprecated)

Send TTS Message

nexmo.voice.sendTTSMessage(<TO_NUMBER>,message,options,callback);

Send TTS Prompt With Capture

nexmo.sendTTSPromptWithCapture(<TO_NUMBER>,message,<MAX_DIGITS>, <BYE_TEXT>,options,callback);

Send TTS Prompt With Confirm

nexmo.voice.sendTTSPromptWithConfirm(<TO_NUMBER>, message ,<MAX_DIGITS>,'<PIN_CODE>',<BYE_TEXT>,<FAILED_TEXT>,options,callback);

Testing

Run:

npm test

Or to continually watch and run tests as you change the code:

npm run-script test-watch

Examples

See examples/README.md.

Also, see the Nexmo Node Quickstarts repo.

Creating your own requests

IMPORTANT

This section uses internal APIs and should not be relied on. We make no guarantees that the interface is stable. Relying on these methods is not recommended for production applications

For endpoints that are not yet implemented, you can use the Nexmo HTTP Client to make requests with the correct authentication method.

In these examples, we assume that you've created a nexmo instance as follows:

const nexmo = new Nexmo({
    apiKey: 'API_KEY',
    apiSecret: 'API_SECRET',
    applicationId: 'APPLICATION_ID',
    privateKey: './private.key',
});
  • If your API endpoint is on api.nexmo.com, use the nexmo.options.api object.
  • If your API endpoint is on rest.nexmo.com, use the nexmo.options.rest object.

Both of these objects expose the following methods:

  • get(path, params, callback, useJwt) (params is the query string to use)
  • post(path, params, callback, useJwt) (params is the POST body to send)
  • postUseQueryString(path, params, callback, useJwt) (params is the query string to use)
  • delete(path, callback, useJwt)

To make a request to api.nexmo.com/v1/calls?status=rejected:

nexmo.options.api.get(
    "/v1/calls",
    {"status": "rejected"},
    function(err, data){
        console.log(err);
        console.log(data);
    },
    true // Use JWT for authentication
);

To make a request to rest.nexmo.com/sms/json?from=Demo&to=447700900000&text=Testing:

nexmo.options.rest.postUseQueryString(
    "/sms/json",
    {"from": "Demo", "to": "447700900000", "text": "Testing"},
    function(err, data){
        console.log(err);
        console.log(data);
    },
    false // Don't use JWT, fall back to API key/secret
);

API Coverage

  • Voice
    • Outbound Calls
    • Inbound Call Webhook
    • Update Calls
    • Stream to Call
    • Talk to Call
    • DTMF to Call
  • Messaging
    • Send
    • Delivery Receipt Webhook
    • Inbound Message Webhook
    • Search
      • Message
      • Messages
      • Rejections
    • US Short Codes
      • Two-Factor Authentication
      • Event-Based Alerts
        • Sending Alerts
        • Campaign Subscription Management
  • Number Insight
    • Basic
    • Standard
    • Advanced
    • Advanced Async
    • Advanced Async Webhook
  • Verify
    • Verify
    • PSD2
    • Check
    • Search
    • Control
  • Applications
    • Create an Application
    • Get Applications
    • Update an Application
    • Delete an Application
  • Account
    • Balance
    • Pricing
    • Settings
    • Top Up
    • Numbers
      • Search
      • Buy
      • Cancel
      • Update
  • Media
    • Upload
    • Download
    • Search
    • Get
    • Update
    • Delete
  • Voice (Deprecated)
    • Outbound Calls
    • Inbound Call Webhook
    • Text-To-Speech Call
    • Text-To-Speech Prompt
  • Redact
    • Transaction

License

MIT - see LICENSE